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 python
 2 ## coding=utf-8
 3 import jieba
 4
 5 filePath=‘corpus.txt‘
 6 fileSegWordDonePath =‘corpusSegDone.txt‘
 7 # read the file by line
 8 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进行降维,得到二维的词向量,并打印出来,代码如下:

#!/usr/bin/env python
# coding=utf-8
import numpy as np
import matplotlib
import matplotlib.pyplot as plt

from sklearn.decomposition import PCA
import word2vec
# load the word2vec model
model = word2vec.load(‘corpusWord2Vec.bin‘)
rawWordVec=model.vectors

# reduce the dimension of word vector
X_reduced = PCA(n_components=2).fit_transform(rawWordVec)

# show some word(center word) and it‘s similar words
index1,metrics1 = model.cosine(u‘中国‘)
index2,metrics2 = model.cosine(u‘清华‘)
index3,metrics3 = model.cosine(u‘牛顿‘)
index4,metrics4 = model.cosine(u‘自动化‘)
index5,metrics5 = model.cosine(u‘刘亦菲‘)

# add the index of center word
index01=np.where(model.vocab==u‘中国‘)
index02=np.where(model.vocab==u‘清华‘)
index03=np.where(model.vocab==u‘牛顿‘)
index04=np.where(model.vocab==u‘自动化‘)
index05=np.where(model.vocab==u‘刘亦菲‘)

index1=np.append(index1,index01)
index2=np.append(index2,index03)
index3=np.append(index3,index03)
index4=np.append(index4,index04)
index5=np.append(index5,index05)

# plot the result
zhfont = matplotlib.font_manager.FontProperties(fname=‘/usr/share/fonts/truetype/wqy/wqy-microhei.ttc‘)
fig = plt.figure()
ax = fig.add_subplot(111)

for i in index1:
    ax.text(X_reduced[i][0],X_reduced[i][1], model.vocab[i], fontproperties=zhfont,color=‘r‘)

for i in index2:
    ax.text(X_reduced[i][0],X_reduced[i][1], model.vocab[i], fontproperties=zhfont,color=‘b‘)

for i in index3:
    ax.text(X_reduced[i][0],X_reduced[i][1], model.vocab[i], fontproperties=zhfont,color=‘g‘)

for i in index4:
    ax.text(X_reduced[i][0],X_reduced[i][1], model.vocab[i], fontproperties=zhfont,color=‘k‘)

for i in index5:
    ax.text(X_reduced[i][0],X_reduced[i][1], model.vocab[i], fontproperties=zhfont,color=‘c‘)

ax.axis([0,0.8,-0.5,0.5])
plt.show()

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

下图是执行结果:

源自: https://www.cnblogs.com/Newsteinwell/p/6034747.html

原文地址:https://www.cnblogs.com/chenlove/p/9692622.html

时间: 2024-11-05 20:24:33

word2vec 构建中文词向量的相关文章

中文词向量论文综述(三)

导读 最近在做中文词向量相关工作,其中看了一些中文词向量的相关论文,在这篇文章,将把近几年的中文词向量进展及其模型结构加以简述,大概要写3-4篇综述,每篇包含2-3篇论文.续 --- 中文词向量论文综述(二). 一.Learning Chinese Word Representations From Glyphs Of Characters 论文来源 这是一篇2017年发表在EMNLP(Empirical Methods in Natural Language Processing)会议上的论文

文本情感分析(二):基于word2vec和glove词向量的文本表示

上一篇博客用词袋模型,包括词频矩阵.Tf-Idf矩阵.LSA和n-gram构造文本特征,做了Kaggle上的电影评论情感分类题. 这篇博客还是关于文本特征工程的,用词嵌入的方法来构造文本特征,也就是用word2vec词向量和glove词向量进行文本表示,训练随机森林分类器. 一.训练word2vec词向量 Kaggle情感分析题给出了三个数据集,一个是带标签的训练集,共25000条评论,一个是测试集,无标签的,用来做预测并提交结果,这两个数据集是上一篇文章里我们用过的. 此外还有一个无标签的数据

文本分类实战(一)—— word2vec预训练词向量

1 大纲概述 文本分类这个系列将会有十篇左右,包括基于word2vec预训练的文本分类,与及基于最新的预训练模型(ELMo,BERT等)的文本分类.总共有以下系列: word2vec预训练词向量 textCNN 模型 charCNN 模型 Bi-LSTM 模型 Bi-LSTM + Attention 模型 RCNN 模型 Adversarial LSTM 模型 Transformer 模型 ELMo 预训练模型 BERT 预训练模型 所有代码均在textClassifier仓库中, 觉得有帮助,

gensim的word2vec如何得出词向量(python)

首先需要具备gensim包,然后需要一个语料库用来训练,这里用到的是skip-gram或CBOW方法,具体细节可以去查查相关资料,这两种方法大致上就是把意思相近的词映射到词空间中相近的位置. 语料库test8下载地址: http://mattmahoney.net/dc/text8.zip 这个语料库是从http://blog.csdn.net/m0_37681914/article/details/73861441这篇文章中找到的. 检查语料是否需要做预处理:将数据下载好了解压出来,在做词向量

开源共享一个训练好的中文词向量(语料是维基百科的内容,大概1G多一点)

使用gensim的word2vec训练了一个词向量. 语料是1G多的维基百科,感觉词向量的质量还不错,共享出来,希望对大家有用. 下载地址是http://pan.baidu.com/s/1pLGlJ7d 密码:hw47 包含训练代码.使用词向量代码.词向量文件(3个文件) 因为机器内存足够,也没有分批训练.所以代码非常简单.也在共享文件里面,就不贴在这里了.

文本分布式表示(二):用tensorflow和word2vec训练词向量

博客园的markdown用起来太心塞了,现在重新用其他编辑器把这篇博客整理了一下. 目前用word2vec算法训练词向量的工具主要有两种:gensim 和 tensorflow.gensim中已经封装好了word2vec这个包,用起来很方便,只要把文本处理成规范的输入格式,寥寥几行代码就能训练词向量.这样比较适合在做项目时提高效率,但是对理解算法的原理帮助不大.相比之下,用tensorflow来训练word2vec比较麻烦,生成batch.定义神经网络的各种参数,都要自己做,但是对于理解算法原理

word2vec词向量训练及中文文本相似度计算

本文是讲述如何使用word2vec的基础教程,文章比较基础,希望对你有所帮助! 官网C语言下载地址:http://word2vec.googlecode.com/svn/trunk/ 官网Python下载地址:http://radimrehurek.com/gensim/models/word2vec.html 1.简单介绍 参考:<Word2vec的核心架构及其应用 · 熊富林,邓怡豪,唐晓晟 · 北邮2015年> <Word2vec的工作原理及应用探究 · 周练 · 西安电子科技大学

PyTorch基础——词向量(Word Vector)技术

一.介绍 内容 将接触现代 NLP 技术的基础:词向量技术. 第一个是构建一个简单的 N-Gram 语言模型,它可以根据 N 个历史词汇预测下一个单词,从而得到每一个单词的向量表示. 第二个将接触到现代词向量技术常用的模型 Word2Vec.在实验中将以小说<三体>为例,展示了小语料在 Word2Vec 模型中能够取得的效果. 在最后一个将加载已经训练好的一个大规模词向量,并利用这些词向量来做一些简单的运算和测试,以探索词向量中包含的语义信息. 知识点 N-Gram(NPLM) 语言模型 Wo

【python gensim使用】word2vec词向量处理中文语料

word2vec介绍 word2vec官网:https://code.google.com/p/word2vec/ word2vec是google的一个开源工具,能够根据输入的词的集合计算出词与词之间的距离. 它将term转换成向量形式,可以把对文本内容的处理简化为向量空间中的向量运算,计算出向量空间上的相似度,来表示文本语义上的相似度. word2vec计算的是余弦值,距离范围为0-1之间,值越大代表两个词关联度越高. 词向量:用Distributed Representation表示词,通常