Sougou语料库word2vec训练demo

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入门小白初步的学习笔记,会继续深入探索。

猜你喜欢

转载自blog.csdn.net/weixin_46052886/article/details/114465689