环境准备
python
先安装python,2.7和3的版本都可以。
pip
用pip来下载python各种库非常方便,在命令行输入入pip
,如果不出错说明已经存在。如果没有的话,先下载pip安装文件,在该.whl文件所在目录打开命令行,输入python install pip-9.0.1-py2.py3-none-any.whl
。
numpy库 + scipy库
在命令行分别输入pip install numpy
和pip install scipy
来安装,如果出错看出错原因具体问题具体解决,可以试一试下载这个numpy文件和scipy文件,然后在该文件目录下安装。
gensim库
在命令行输入pip install gensim
,如果出错,试一试下载这个gensim文件,在命令行执行python install gensim-2.3.0-cp27-cp27m-win_amd64
。
pattern库
下载pattern文件,解压后进入文件目录执行python setup.py install
。
获取数据
要先获取英文维基百科的数据,可以在这个网站下载所需数据,这里下载一个1G多的bz2文件,通过process_wiki.py
程序将该数据转换为txt格式,在命令行键入python process_wiki.py enwiki-latest-pages-articles1.xml-p10p30302.bz2 wiki.en.txt
("wiki.en.txt"为输出文件,默认是当前路径)。得到的文件内容大致如图所示:
这个步骤是从语料库中进行分词,将句子分割成有意义的单词,用空格隔开。
代码如下:
# -*- coding: utf-8 -*-
import logging
import os.path
import six
import sys
from __future__ import print_function
from gensim.corpora import WikiCorpus
if __name__ == '__main__':
reload(sys)
sys.setdefaultencoding("utf-8")
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("Using: python process_wiki.py enwiki.xxx.xml.bz2 wiki.en.text")
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():
if six.PY3:
output.write(b' '.join(text).decode('utf-8') + '\n')
# ###another method###
# output.write(
# space.join(map(lambda x:x.decode("utf-8"), text)) + '\n')
else:
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")
对分词进行词向量处理
通过train_word2vec_model.py
程序对wiki.en.txt
进行处理,在命令行执行python train_word2vec_model.py wiki.en.txt wiki.en.txt.model wiki.en.txt.vector
,得到wiki.en.txt
和wiki.en.txt.vector
两个文件。
该步骤是将所得到的分词进行处理,得到对应的词向量,即用向量来表示每个分词,向量结果如图所示:
代码如下:
# -*- coding: utf-8 -*-
import logging
import os
import sys
import multiprocessing
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.wv.save_word2vec_format(outp2, binary=False)
分析词向量
通过output.py
对得到的词向量模型进行分析,直接运行该文件得到result.txt
文件。
该步骤对上一步得到的.model
文件进行分析,.vector
文件暂时不用,在该程序中,输入的关键词会被转换成词向量形式,然后与其它分词的词向量进行比较,所得到的结果即为该语料库中与输入关键词关联度较高的词语。
代码如下:
# -*- coding: utf-8 -*-
from gensim.models import word2vec
# 读取词向量
model = word2vec.Word2Vec.load("wiki.en.txt.model")
# 设置关键词
keywords = ["Nanoparticle", "Nanocluster", "cluster", "nanorod", "graphene", "carbon", "nanotube"]
for item in keywords:
print '和%s最相关的词:' % item
try:
y = model.most_similar(item, topn=20) # 20个最相关的
except:
print("无")
continue
for i in y:
print('{0:20} {1}'.format(i[0] , i[1]))
print "==================================="
参考:
http://www.52nlp.cn/%E4%B8%AD%E8%8B%B1%E6%96%87%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91%E8%AF%AD%E6%96%99%E4%B8%8A%E7%9A%84word2vec%E5%AE%9E%E9%AA%8C