用gensim对中文*语料上的word2Vec相似度计算实验

时间:2022-07-18 06:15:47

Word2vec Google 2013年年中开源的一款将表征为实向量的高效工具,其利用深度学的思想,可以通过训练,把文本内容的 K 维向量空间中的向量运算,而向量空间上的相似度可以用来表示文本语义上的相似度。Word2vec输出的词向量可以被用来做很多 NLP相关的工作,比如聚、找同义词性分析等等。如果个思路, 当做特征,那么Word2vec就可以把特征映射到 K 维向量空间,可以为文本数据寻求更加深层次的特征表 

Word2Vec对应的python版本是gensim(http://radimrehurek.com/gensim/)使用gensim可以来训练LSI,LDA模型来算两个文档的相似度已文本信息、词语的相似度。

Word2Vec的参考文章很多,可以看我转载篇文章,里面的word2Vec原理写的很清楚。Gensim可以参考官网的例,里面的文档很全。

 

一、中文基百科的Word2Vec测试

1、中文数据下https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2

中文*的数据不是很大,整个文档才1G多点

2、安装gensim包,genism包安装有点麻烦,因为gensim的包要依赖其他的包,对其他包的版本还有要求。直接使用python自带的easy_install和pip install都会出现问题。我这边是使用了Anaconda来进行安装的。

3、数据预处理:首先将xml的wiki数据转化成text格式,通过process_wiki.py进行处理:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import logging
import os.path
import sys
 
from gensim.corpora import WikiCorpus
 
if __name__ == '__main__':
program = os.path.basename(sys.argv[0])
logger = logging.getLogger(program)
 
logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s')
logging.root.setLevel(level=logging.INFO)
logger.info("running %s" % ' '.join(sys.argv))
 
# check and process input arguments
if len(sys.argv) < 3:
print globals()['__doc__'] % locals()
sys.exit(1)
inp, outp = sys.argv[1:3]
space = " "
i = 0
 
output = open(outp, 'w')
wiki = WikiCorpus(inp, lemmatize=False, dictionary={})
for text in wiki.get_texts():
output.write(space.join(text) + "\n")
i = i + 1
if (i % 10000 == 0):
logger.info("Saved " + str(i) + " articles")
 
output.close()
logger.info("Finished Saved " + str(i) + " articles")

这里利用了gensim里的*处理类WikiCorpus,通过get_texts将维基里的每篇文章转换位1text文本,并且去掉了标点符号等内容,注意这里“wiki = WikiCorpus(inp, lemmatize=False, dictionary={})”lemmatize设置为False的主要目的是不使用pattern模块来进行英文单词的词干化处理,无论你的电脑是否已经安装了pattern,因为使用pattern会严重影响这个处理过程,变得很慢。

执行”pythonprocess_wiki.py enwiki-latest-pages-articles.xml.bz2 wiki.en.text”

结果大概有26万多篇文章,最新的数据可能比这个更多。

4、进行中文分词,这边使用的是jiebapython分词包。

#encoding=utf-8
import logging
import jieba
import sys
import os.path
reload(sys)
sys.setdefaultencoding( "utf-8" )
if __name__=='__main__':
program = os.path.basename(sys.argv[0])
logger = logging.getLogger(program)
logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s')
logging.root.setLevel(level=logging.INFO)
logger.info("running %s" % ' '.join(sys.argv))
if len(sys.argv)<2:
print "please input input filename and output filename!"
sys.exit(1)
input_file = sys.argv[1]
output_file = sys.argv[2]
in_file=open(input_file)
out_file = open(output_file, 'w')
jieba.load_userdict("dict.txt.big.txt")
while True:
line=in_file.readline()
if line:
#print line
seg_list = jieba.cut(line)
outWrite=" ".join(seg_list)
out_file.write(outWrite)
else:
break
in_file.close()
out_file.close()
5、 有了中文 基百科的分 数据, 就可以 word2vec 模型 训练

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import logging
import os.path
import sys
import multiprocessing
 
from gensim.corpora import WikiCorpus
from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence
 
if __name__ == '__main__':
program = os.path.basename(sys.argv[0])
logger = logging.getLogger(program)
 
logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s')
logging.root.setLevel(level=logging.INFO)
logger.info("running %s" % ' '.join(sys.argv))
 
# check and process input arguments
if len(sys.argv) < 4:
print globals()['__doc__'] % locals()
sys.exit(1)
inp, outp1, outp2 = sys.argv[1:4]
 
model = Word2Vec(LineSentence(inp), size=400, window=5, min_count=5,
workers=multiprocessing.cpu_count())
 
# trim unneeded model memory = use(much) less RAM
#model.init_sims(replace=True)
model.save(outp1)
model.save_word2vec_format(outp2, binary=False)

执行 “pythontrain_word2vec_model.py wiki.en.text wiki.en.text.model wiki.en.text.vector”生成最后的模型

 

6测试模型

import gensim

model = gensim.models.Word2Vec.load("wiki.zh.text.model")

用gensim对中文*语料上的word2Vec相似度计算实验

用gensim对中文*语料上的word2Vec相似度计算实验

用gensim对中文*语料上的word2Vec相似度计算实验