Sougou语料库word2vec训练demo
文章参考:https://www.cnblogs.com/Newsteinwell/p/6034747.html
利用jieba对中文语料库进行分词
这里首先将Sougou中的语料库进行解压,对解压后的dat文件
cat news_sohusite_xml.dat | iconv -f gbk -t utf-8 -c | grep "<content>" > sougou.txt
提取出<conten>
内的文本
再使用jieba对文本内容(9:-11)进行分词,并把分词后的文本写入新的文件。
import jieba
#读取语料
filepath = "---"
file_afterse_path = '---'
file_train_read = []
with open(filepath) as file_train_row:
for line in file_train_row:
file_train_read.append(line)
#使用jieba进行分词
file_train_segment = []
for i in range(len(file_train_read)):
file_train_segment.append([" ".join(list(jieba.cut(file_train_read[i][9:-11],cut_all = False)))])
if i % 100 == 0:
print(i)
#test
#for i in range(len(file_train_segment[10])):
# print(file_train_segment[10][i])
with open(file_afterse_path,'wb') as FW:
for i in range(len(file_train_segment)):
FW.write(file_train_segment[i][0].encode('utf-8')) # only one element
FW.write('\n'.encode('utf-8'))
构建词向量
即通过word2vec对语料库进行训练,将维度设为300,得到各个词汇的语义关联。得到词向量。
如果训练集很小,词向量的余弦值都很小。所以用较大的语料库得到的词向量会更准确,可以都试一试。
import word2vec
word2vec.word2vec("---sougou_2.txt","---WORD2VEC.bin",size=300,min_count=0) # 维度300
model = word2vec.load("---WORD2VEC.bin")
print(model.vectors)
查看词表里面的词
index = 1000
print(model.vocab[index])
indexes = model.cosine(u'出院')
for ind in indexes[0]:
print(model.vocab[ind])
得到与“出院”相关性较大的词汇:(用余弦相似度)
入院
住院
住院治疗
痊愈
拆线
转院
做手术
送医
过世
休养
PCA降维在二维空间中表示词向量
PCA降维本质上是将矩阵中含有线性关系的元素(索引)去除掉,从而达到降维方便算法计算的操作。
这里降为2维进行图行化表示词的语义相似度:
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
rawWordVec = model.vectors
# 降维
X_reduced = PCA(n_components=2).fit_transform(rawWordVec)
# 元素
index2, metrics2 = model.cosine('德国')
index3, metrics3 = model.cosine('上海交大')
index02 = np.where(model.vocab == u'德国')
index03 = np.where(model.vocab == u'上海交大')
# 定义字体
Font = matplotlib.font_manager.FontProperties(fname="/System/Library/Fonts/Hiragino Sans GB.ttc")
fig = plt.figure()
ax = fig.add_subplot(111)
for i in index2:
ax.text(X_reduced[i][0],X_reduced[i][1], model.vocab[i], fontproperties=Font,color='b')
for i in index3:
ax.text(X_reduced[i][0],X_reduced[i][1], model.vocab[i], fontproperties=Font,color='g')
ax.axis([0,0.65,-0.1,0.4])
plt.show()
结果如下:
本文章是NLP入门小白初步的学习笔记,会继续深入探索。