python调用word2vec工具包安装和使用指南
word2vec python-toolkit installation and use tutorial
本文选译自英文版,代码注释均摘自本文,建议先阅读skip-model相关知识再阅读本指南
github仓库地址
环境准备
- 安装gcc, 安装gcc坑比较多,这里建议使用codeblocks自带的gcc编译器,下载地址,这里注意,一定要点击codeblocks-mingw版本,安装完成后设置环境变量Path, INCLUDE, LIB
- 尝试安装:
pip install word2vec
, 观察报错情况,这里有几种解决方法,我遇到的报错是Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": https://visualstudio.microsoft.com/downloads/
解决方法是下载microsoft vc++下载指南, 还有其他可能的错误,链接如下:报错列表,题外话:安装python工具包时,先查阅pypi,可以避免一些错误
模型的训练
导入模型import word2vec
-
同义词合并,例如michael jacson和 michael-jackson
word2vec.word2phrase('./txt_file/text8', './txt_file/text8-phrases', verbose=True)
-
训练skip-gram model, 得到word2vec词向量表示,size为向量的维数
word2vec.word2vec('/Users/drodriguez/Downloads/text8-phrases', '/Users/drodriguez/Downloads/text8.bin', size=100, verbose=True)
-
输出
text8.bin
文件,包含二进制形式的词向量组 -
词向量的应用:单词聚类,产生
text8-clusters.txt
包含所有单词的聚类结果, 结果数目小于等于单词表数目word2vec.word2clusters('/Users/drodriguez/Downloads/text8', '/Users/drodriguez/Downloads/text8-clusters.txt', 100, verbose=True)
model模型的使用
-
导入刚才产生的模型
model = word2vec.load('/Users/drodriguez/Downloads/text8.bin')
-
model的属性
model.vocab
, 得到单词表的numpy.array格式,这里的单词不是词向量形式 -
model.vectors
是模型的矩阵,n为单词数目,m为词向量长度,vectors
为n*m维 -
可以通过
model['dog'].shape
或者model['dog'][:10]
来访问某一个单词的词向量信息 -
计算几个词向量两两之间的距离:
model.distance("dog", "cat", "fish")
-
得到某一个单词的相似词(基于余弦相似度):
indexes, metrics = model.similar("dog")
,第一个返回值为相似向量的下标,第二个为相似度,都为tuple格式,得到相应的单词可使用model.vocab[indexes]
-
得到相似词的统计信息:(词,相似度)
model.generate_response(indexes, metrics)
,还可以使用model.generate_response(indexes, metrics).tolist()
来转换得到python数据类型 -
词向量直接加减运算:
indexes, metrics = model.analogy(pos=['king', 'woman'], neg=['man'])
,返回值和generate_response method
相同
cluster模型的使用
-
导入cluster模型
clusters = word2vec.load_clusters('/Users/drodriguez/Downloads/text8-clusters.txt')
-
得到某一组结果
clusters.get_words_on_cluster(90)
,结果为这一组的所有单词
cluster和model的结合使用
-
将cluster添加到word2vec model中
model.clusters = clusters
-
进行类似的加减分析:
indexes, metrics = model.analogy(pos=["paris", "germany"], neg=["france"])
-
得到结果后,
model.generate_response(indexes, metrics).tolist()
,得到(单词,相似程度,所属组号)