2019独角兽企业重金招聘Python工程师标准>>>

word2vec 构建中文词向量

词向量作为文本的基本结构——词的模型,以其优越的性能,受到自然语言处理领域研究人员的青睐。良好的词向量可以达到语义相近的词在词向量空间里聚集在一起,这对后续的文本分类,文本聚类等等操作提供了便利,本文将详细介绍如何使用word2vec构建中文词向量。

一、中文语料库

本文采用的是搜狗实验室的搜狗新闻语料库,数据链接 http://www.sogou.com/labs/resource/cs.php

下载下来的文件名为: news_sohusite_xml.full.tar.gz

二、数据预处理

2.1 解压并查看原始数据

cd 到原始文件目录下,执行解压命令:

tar -zvxf news_sohusite_xml.full.tar.gz

得到文件 news_sohusite_xml.dat, 用vim打开该文件,

vim news_sohusite_xml.dat

得到如下结果:

2.2 取出内容

取出<content>  </content> 中的内容,执行如下命令:

cat news_tensite_xml.dat | iconv -f gbk -t utf-8 -c | grep "<content>"  > corpus.txt

得到文件名为corpus.txt的文件,可以通过vim 打开

vim corpus.txt

得到如下效果:

2.3 分词

注意,送给word2vec的文件是需要分词的,分词可以采用jieba分词实现,安装jieba 分词

pip install jieba

对原始文本内容进行分词,python 程序如下:

1 ##!/usr/bin/env python2 ## coding=utf-83 import jieba4 5 filePath='corpus.txt'6 fileSegWordDonePath ='corpusSegDone.txt'7 # read the file by line8 fileTrainRead = []9 #fileTestRead = []
10 with open(filePath) as fileTrainRaw:
11     for line in fileTrainRaw:
12         fileTrainRead.append(line)
13
14
15 # define this function to print a list with Chinese
16 def PrintListChinese(list):
17     for i in range(len(list)):
18         print list[i],
19 # segment word with jieba
20 fileTrainSeg=[]
21 for i in range(len(fileTrainRead)):
22     fileTrainSeg.append([' '.join(list(jieba.cut(fileTrainRead[i][9:-11],cut_all=False)))])
23     if i % 100 == 0 :
24         print i
25
26 # to test the segment result
27 #PrintListChinese(fileTrainSeg[10])
28
29 # save the result
30 with open(fileSegWordDonePath,'wb') as fW:
31     for i in range(len(fileTrainSeg)):
32         fW.write(fileTrainSeg[i][0].encode('utf-8'))
33         fW.write('\n')

可以得到文件名为 corpusSegDone.txt 的文件,需要注意的是,对于读入文件的每一行,使用结巴分词的时候并不是从0到结尾的全部都进行分词,而是对[9:-11]分词 (如行22中所示: fileTrainRead[i][9:-11] ),这样可以去掉每行(一篇新闻稿)起始的<content> 和结尾的</content>。

同样的,可以通过vim 打开分词之后的文件,执行命令:

vim corpusSegDone.txt

得到如下图所示的结果:

 三、构建词向量

3.1 安装word2vec

pip install word2vec

3.2 构建词向量

执行以下程序:

import word2vec
word2vec.word2vec('corpusSegDone.txt', 'corpusWord2Vec.bin', size=300,verbose=True)

即可构建词向量,得到结果放在文件名为 corpusWord2Vec.bin的文件中。可以通过设定size 的大小来指定词向量的维数。用vim打开生成的二进制文件会出现乱码,目前不知道解决方法。

3.3 显示并使用词向量

3.3.1 查看词向量

import word2vec
model = word2vec.load('corpusWord2Vec.bin')
print (model.vectors)

可以得到如下结果:

 3.3.2 查看词表中的词

import word2vec
model = word2vec.load('corpusWord2Vec.bin')
index = 1000
print (model.vocab[index]

得到结果如下:

可以得到词表中第1000个词为 确保。

3.3.3 显示空间距离相近的词

一个好的词向量可以实现词义相近的一组词在词向量空间中也是接近的,可以通过显示词向量空间中相近的一组词并判断它们语义是否相近来评价词向量构建的好坏。代码如下:

import word2vec
model = word2vec.load('corpusWord2Vec.bin')
indexes = model.cosine(u'加拿大')
for index in indexes[0]:print (model.vocab[index])

得到的结果如下:

可以修改希望查找的中文词,例子如下:

四、二维空间中显示词向量

将词向量采用PCA进行降维,得到二维的词向量,并打印出来,代码如下:

1 #!/usr/bin/env python2 # coding=utf-83 import numpy as np4 import matplotlib5 import matplotlib.pyplot as plt6 7 from sklearn.decomposition import PCA8 import word2vec9 # load the word2vec model
10 model = word2vec.load('corpusWord2Vec.bin')
11 rawWordVec=model.vectors
12
13 # reduce the dimension of word vector
14 X_reduced = PCA(n_components=2).fit_transform(rawWordVec)
15
16 # show some word(center word) and it's similar words
17 index1,metrics1 = model.cosine(u'中国')
18 index2,metrics2 = model.cosine(u'清华')
19 index3,metrics3 = model.cosine(u'牛顿')
20 index4,metrics4 = model.cosine(u'自动化')
21 index5,metrics5 = model.cosine(u'刘亦菲')
22
23 # add the index of center word
24 index01=np.where(model.vocab==u'中国')
25 index02=np.where(model.vocab==u'清华')
26 index03=np.where(model.vocab==u'牛顿')
27 index04=np.where(model.vocab==u'自动化')
28 index05=np.where(model.vocab==u'刘亦菲')
29
30 index1=np.append(index1,index01)
31 index2=np.append(index2,index03)
32 index3=np.append(index3,index03)
33 index4=np.append(index4,index04)
34 index5=np.append(index5,index05)
35
36 # plot the result
37 zhfont = matplotlib.font_manager.FontProperties(fname='/usr/share/fonts/truetype/wqy/wqy-microhei.ttc')
38 fig = plt.figure()
39 ax = fig.add_subplot(111)
40
41 for i in index1:
42     ax.text(X_reduced[i][0],X_reduced[i][1], model.vocab[i], fontproperties=zhfont,color='r')
43
44 for i in index2:
45     ax.text(X_reduced[i][0],X_reduced[i][1], model.vocab[i], fontproperties=zhfont,color='b')
46
47 for i in index3:
48     ax.text(X_reduced[i][0],X_reduced[i][1], model.vocab[i], fontproperties=zhfont,color='g')
49
50 for i in index4:
51     ax.text(X_reduced[i][0],X_reduced[i][1], model.vocab[i], fontproperties=zhfont,color='k')
52
53 for i in index5:
54     ax.text(X_reduced[i][0],X_reduced[i][1], model.vocab[i], fontproperties=zhfont,color='c')
55
56 ax.axis([0,0.8,-0.5,0.5])
57 plt.show()

中文的显示需要做特殊处理,详见代码 line: 37

下图是执行结果:

主要参考 

http://blog.csdn.net/zhaoxinfan/article/details/11069485

http://nbviewer.jupyter.org/github/danielfrg/word2vec/blob/master/examples/word2vec.ipynb

分类: 道可道,为何道

标签: word2vec, 分词

转载于:https://my.oschina.net/airship/blog/2994426

word2vec 构建中文词向量相关推荐

  1. 清华 词向量库_word2vec 构建中文词向量

    词向量作为文本的基本结构--词的模型,以其优越的性能,受到自然语言处理领域研究人员的青睐.良好的词向量可以达到语义相近的词在词向量空间里聚集在一起,这对后续的文本分类,文本聚类等等操作提供了便利,本文 ...

  2. 基于word2vec的中文词向量训练

    基于word2vec的中文词向量训练 使用katex解析的数学公式,csdn好像不支持 word2vec来源 Google开源 可以在百万数量级的词典和上亿的数据集上进行高效地训练 该工具得到的训练结 ...

  3. tfidf和word2vec构建文本词向量并做文本聚类

    一.相关方法原理 1.tfidf tfidf算法是一种用于文本挖掘.特征词提取等领域的因子加权技术,其原理是某一词语的重要性随着该词在文件中出现的频率增加,同时随着该词在语料库中出现的频率成反比下降, ...

  4. 使用word2vec训练中文词向量

    https://www.jianshu.com/p/87798bccee48 一.文本处理流程 通常我们文本处理流程如下: 1 对文本数据进行预处理:数据预处理,包括简繁体转换,去除xml符号,将单词 ...

  5. word2vec训练中文词向量

    词向量作为文本的基本结构--词的模型.良好的词向量可以达到语义相近的词在词向量空间里聚集在一起,这对后续的文本分类,文本聚类等等操作提供了便利,这里简单介绍词向量的训练,主要是记录学习模型和词向量的保 ...

  6. AAAI 2018 论文 | 蚂蚁金服公开最新基于笔画的中文词向量算法

    导读:词向量算法是自然语言处理领域的基础算法,在序列标注.问答系统和机器翻译等诸多任务中都发挥了重要作用.词向量算法最早由谷歌在2013年提出的word2vec,在接下来的几年里,该算法也经历不断的改 ...

  7. Word2Vec中文词向量

    word2vec中文词向量 中文词向量训练 模型保存 模型导入 中文词向量训练 from gensim.models import Word2Vec s = ["被告人 段 某 酒后 与 其 ...

  8. 腾讯AI Lab开源大规模高质量中文词向量数据,800万中文词随你用

    今日,腾讯AI Lab 宣布开源大规模.高质量的中文词向量数据.该数据包含800多万中文词汇,相比现有的公开数据,在覆盖率.新鲜度及准确性上大幅提高,为对话回复质量预测和医疗实体识别等自然语言处理方向 ...

  9. 文本分类Keras RNN实践——应用腾讯和百度中文词向量

    中文词向量 深度学习在NLP领域大展身手,而深度学习处理文本,离不开文本的向量化. 英语独特的语法规则,使得单用空格就能将句子中的单词分割开来,从而取得词向量,这极大简化了英语的NLP预处理过程,工业 ...

最新文章

  1. python sort函数返回值_lambda函数与箭头函数在集合内置函数应用中的对照学习
  2. Python_模块介绍
  3. JQuery用户名无刷新验证
  4. djano-cms学习笔计(一)
  5. Java IO流读取文件
  6. 图解Android - Android GUI 系统 (2) - 窗口管理 (View, Canvas, Window Manager)
  7. 大学计算机一级考试内容和范围,大学计算机一级考试.doc
  8. 清楚linux缓存文件,Linux删除文件 清除缓存
  9. Python PyCharm利用PyQt5使QPlainTextEdit支持拖放文件,类提升,重写QPlainTextEdit类
  10. leetcode437. 路径总和 III
  11. CSS控制文本超出指定宽度显示省略号和文本不换行
  12. oracle select机制_Oracle优化 漫谈排序
  13. 21天学通C语言-学习笔记(4)
  14. 3分钟了解LCD1602液晶显示屏的使用
  15. 易语言数据类型与c 对照,详解易语言中的数据类型
  16. 验证sqlserver 2000 sp4补丁是否安装成功(安装补丁后可以远程访问)
  17. 能转PDF格式用的在线软件
  18. 2018年的总结和2019年的期望
  19. (一)半导体的概念以及PN结的讲解,二极管基础
  20. 【电口模块专题】你不知道的电口模块冷知识

热门文章

  1. Android调用蓝牙打印机
  2. WPF技术触屏上的应用系列(三): 视频播放器的使用及视频播放、播放、暂停、可拖动播放进度效果实现...
  3. Html5 Game - SpaceWar
  4. exe一机一码加密工具_文件夹加密软件有哪些作用?
  5. Bentley MicroStation V8i安装教程
  6. 可视化日历(Java实现)
  7. windows编程一日一练(2)
  8. NASA 顶级程序员是如何编程的?这里有十大准则
  9. 【Python】5个方便好用的Python自动化脚本
  10. @AI大神们 前方31万巨额奖金,别走好吗跑起来!!!