中文文本在训练词向量的相关操作和使用的函数工具总结
只保留中文字符(数字、字母)
判断汉字、数字和字母的函数
#是否是汉语判读
def is_chinese(uchar):
"""判断一个unicode是否是汉字"""
if uchar >= u'\u4e00' and uchar <= u'\u9fa5':
return True
else:
return False
#是否是数字判断
def is_number(uchar):
"""判断一个unicode是否是数字"""
if uchar >= u'\u0030' and uchar <= u'\u0039':
return True
else:
return False
#是否是英文字符判断
def is_alphabet(uchar):
"""判断一个unicode是否是英文字母"""
if (uchar >= u'\u0041' and uchar <= u'\u005a') or (uchar >= u'\u0061' and uchar <= u'\u007a'):
return True
else:
return False
使用上述三种函数可以实现对字符串进行筛选的处理,该函数输入待处理的字符串,返回清洗后的字符串
def format_str(content):
content_str = ''
for i in content:
if is_chinese(i):#or is_number(i) or is_alphabet(i):
content_str = content_str+i
return content_str
分词去停用词
cut_word传入一个文档,文档中每个句子占一行,输出是分词并且去除停用词之后的文档
def stopwordslist(filepath):
stopwords = [line.strip() for line in open(filepath, 'rb').readlines()]
return stopwords
def cut_word():
stop_words = stopwordslist(stop_word_path)
corpus = ''
temp = 0
with open("./word2vec_data.txt",'r',encoding='utf-8') as f:
documents = f.readlines()
for document in tqdm(documents):
document = document.replace("\n","")
document_cut = jieba.cut(document, cut_all=False)
# print('/'.join(document_cut))\
result = ""
for item in tqdm(document_cut):
if(item not in stop_words):
result += item;
corpus += result+"\n"
# print(result)
#分好词之后的数据
with open('./corpus.txt', 'w+', encoding='utf-8') as f:
f.write(corpus) # 读取的方式和写入的方式要一致
gensim中word2vec进行词向量训练
# -*- coding: utf-8 -*-
from gensim.models import word2vec
import logging
##训练word2vec模型
# 获取日志信息
logging.basicConfig(format='%(asctime)s:%(levelname)s:%(message)s', level=logging.INFO)
# 加载分词后的文本,使用的是Text8Corpus类
sentences = word2vec.Text8Corpus(r'./corpus.txt')
# 训练模型,部分参数如下
model = word2vec.Word2Vec(sentences, size=100, hs=1, min_count=1, window=3)
# 模型的预测
print('-----------------分割线----------------------------')
# 计算两个词向量的相似度
try:
sim1 = model.similarity(u'中央企业', u'事业单位')
sim2 = model.similarity(u'教育网', u'新闻网')
except KeyError:
sim1 = 0
sim2 = 0
print(u'中央企业 和 事业单位 的相似度为 ', sim1)
print(u'人民教育网 和 新闻网 的相似度为 ', sim2)
print('-----------------分割线---------------------------')
# 与某个词(李达康)最相近的3个字的词
print(u'与国资委最相近的3个字的词')
req_count = 5
for key in model.similar_by_word(u'国资委', topn=100):
if len(key[0]) == 3:
req_count -= 1
print(key[0], key[1])
if req_count == 0:
break
print('-----------------分割线---------------------------')
# 计算某个词(侯亮平)的相关列表
try:
sim3 = model.most_similar(u'新华社', topn=20)
print(u'和 新华社 与相关的词有:\n')
for key in sim3:
print(key[0], key[1])
except:
print(' error')
print('-----------------分割线---------------------------')
# 找出不同类的词
sim4 = model.doesnt_match(u'新华社 人民教育出版社 人民邮电出版社 国务院'.split())
print(u'新华社 人民教育出版社 人民邮电出版社 国务院')
print(u'上述中不同类的名词', sim4)
print('-----------------分割线---------------------------')
# 保留模型,方便重用
model.save(u'word2vec.model')