GOOGLE开源的word2vec能够把词映射到K维空间,每个词有独自的向量表示,从而得出词语词之间的距离(相似度)。但是其自带的基本语料text8是本身就十分适合于训练的(全部是英文单词,中间用空格隔开,没有多余的信息)语料,训练的结果自然很好。本文就是说明一下如何用word2vec处理中文语料。
想到的能使用训练集自然是维基百科的中文语料,里面包含大概23万篇文章,解压后有5G多。这种XML文件还是会有很多不必要的噪声,于是我们又要用到抽取其中内容的工具,意大利人用python写的WikiExtractor.py。
下载后可以直接进行处理,命令:bzcat zhwiki-latest-pages-articles.xml.bz2 | python WikiExtractor.py -b1000M -o extracted >output.txt,(参考了licstar维基百科简体中文语料的获取)一开始出现了参数不足的问题,将语料解压后改用了:python WikiExtractor.pyzhwiki-latest-pages-articles.xml -b1000M -o extracted >output.txt,大概4小时运行结束。
但是这只是去噪的第一步,把文本内容抽取出来,接下来我们进行繁简转换,我用的UBUNTU14.04,可以方便的使用OPENCC,sudo apt-get install opencc进行安装,再用opencc -i wiki_00 -o wiki_jian -c zht2zhs.ini(参考了licstar维基百科简体中文语料的获取)就能成功的进行转换了,wiki_00是上一步内容提取生成的文件。wiki_jian是转换后的文件。
最后进行分词之前我们先转换一下编码:iconv -c -t UTF-8 wiki_jian.utf-8。然后用jieba进行分词,同时去标点符号,安装命令:pip install jieba,编写python文件jiebatest.py
#-*-coding:utf-8-*-
#coding:utf8
import jieba
fin = open('wiki_jian.utf-8','r')
fou = open('wiki_text','w')
line = fin.readline()
while line:
newline = jieba.cut(line,cut_all=False)
str_out = ' '.join(newline).encode('utf-8').replace(',','').replace('。','').replace('?','').replace('!','') \
.replace('“','').replace('”','').replace(':','').replace('’','').replace('‘','').replace('-','') \
.replace('(','').replace(')','').replace('《','').replace('》','').replace(';','').replace('.','') \
.replace('、','').replace('_','').replace(',','').replace('?','').replace('!','')
print str_out,
print >> fou,str_out,
line = fin.readline()
fin.close()
fou.close()
python jiebatest.py即可生成去噪后的文件wiki_text,在下载下来的word2vec中的trunk中使其替换原来的text8,./demo-word.sh完成训练,下面是一些结果图: