Windows下维基百科中文语料库词向量训练
Garbage in,garbage out.
自然语言处理中,词向量的处理尤为重要。而生成词向量的好坏往往取决于语料库的训练,所以,语料库的选择十分重要。本文主要介绍维基百科中文语料库的训练过程。
下载
维基百科中文语料库下载链接:https://dumps.wikimedia.org/zhwiki/latest/。这里使用的是最新的zhwiki-latest-pages-articles.xml.bz2,其中内容是标题、正文部分。
抽取内容
抽取内容使用Wikipedia Extractor,安装方法如下:
PS git clone https://github.com/attardi/wikiextractor.git wikiextractor
PS wikiextractor/WikiExtractor.py -b 2000M -o zhwiki_extracted zhwiki-latest-pages-articles.xml.bz2
由于这个工具就是一个python脚本,因此无需安装,-b 参数指对提取出来的内容进行切片后每个文件的大小,如果要将所有内容保存在同一个文件,那么就需要把这个参数设得大一下,-o 的参数指提取出来的文件放置的目录。
抽取出来的文件的路径为zhwiki_extracted/AA/wiki_00
。
抽取后的内容格式为每篇文章被一对*包起来,而
中的包含了属性有文章的id、url和title属性,如*。
繁简转换
中文维基百科语料库是繁体的,需要转换为简体中文。使用OpenCC来转换,网上很多OpenCC安装失败的情况,这里给出处理办法。
下载OpenCC,百度网盘链接: 链接:https://pan.baidu.com/s/1ms0ckZMbKalNaXS6W8ppOA 提取码:kmvx ,解压之后,将bin添加到系统环境变量即可。
接下来繁简转换,Powershell执行即可,其中**-i是输入文件目录,-o输出文件目录,-c是配置信息(转换模式,配置文件为json文件,存放在opencc下的share文件夹中),其中s2t.json**为简体转繁体,t2s.json为繁体转简体,其他配置可以查看OpenCC的主页。
PS opencc -i zhwiki_extract/AA/wiki_00 -o zhwiki_extract/zhs_wiki -c /home/nlp/OpenCC/data/config/t2s.json
去除标点符号
我们需要把文本中的标点去除,使用以下代码:
import re
def removePun(inputFileName,outputFileName):
i = 0
punctuation = re.compile("[-~!@#$%^&*()_+`=\[\]\\\{\}\"|;':,./<>?·!@#¥%……&*()——+【】、;‘:“”,。、《》?「『」』]")
output = open(outputFileName,'w',encoding='utf8')
with open(inputFileName,'r',encoding='utf8') as source:
line = source.readline()
count = 0
while line:
if line != '':
line = punctuation.sub('', line)
count += 1
if count == 10000:
i += 1
print('第',str(i),'次')
count = 0
line = source.readline()
output.write(line)
removePun('zhs_wiki','zhs_wiki_no')
调用脚本并输入输入文件名,代码中可以修改一下文件输出名字。
分词
有了纯净的文本,下面要做的就是分词了,这里使用jieba分词,安装jieba分词使用pip install jieba
即可。
紧接着,执行分词脚本:
import jieba
def cutIt(inputFileName,outputFileName):
output = open(outputFileName,'w',encoding='utf8')
i = 0
with open(inputFileName,'r',encoding='utf8') as source:
line = source.readline()
count = 0
while line:
sentence = ''
count += 1
for w in jieba.cut(line):
sentence += (w+' ')
output.write(sentence)
if count == 10000:
i += 1
print('第',str(i),'次')
count = 0
line = source.readline()
cutIt('zhs_wiki_no','zhs_wiki_cut')
可以修改代码中输入、输出文件名。
训练词向量
Word2Vector有两种训练词向量的方式:CBOW和skip-gram,其中,CBOW是通过上下文来预测中心词的概率,skip-gram则相反,使用中心词来预测上下文的概。
首先安装gensim库pip install gensim
,简单的训练代码如下:
import gensim
def word2vec_train(inputFileName,outputFileName):
sentences = gensim.models.word2vec.Text8Corpus(inputFileName)
model = gensim.models.word2vec.Word2Vec()
model.build_vocab(sentences)
model.train(sentences,total_examples=model.corpus_count,epochs=model.epochs)
model.wv.save_word2vec_format(outputFileName+'.model',binary = True)
word2vec_train('zhs_wiki_cut','zhs_wiki')
首先将输入的文件转为 gensim 内部的 LineSentence 对象,要求输入的文件的格式为每行一篇文章,每篇文章的词语以空格隔开。gensim.models.Word2Vec会初始化一个Word2Vector模型,size表示训练出来向量的维度;window为共现窗口大小;min_count表示要忽略词语出现次数的阈值,一般取值(0~100);workers表示开多少进程进行训练;sg表示采用何种算法训练,取0表示使用CBOW模型,取1使用skip-gram模型。使用**save()或着是save_word2vec_format()保存,加载时使用相应的load()或者load_word2vec_format()**即可。
测试
训练完成,可以进行简单的测试:
import gensim
model = gensim.models.KeyedVectors.load_word2vec_format('zhs_wiki_test_out.model',binary = True)
print(len(model['数学']))
print(model['数学'])
print(model.similarity('数学','文学'))
words = model.most_similar('数学')
print(words)
print(model.doesnt_match("数学 文学 电视剧 汉语".split()))
参考:
https://wulc.me/2016/10/12/中文维基百科的词向量的训练/
https://blog.youkuaiyun.com/sinat_29957455/article/details/81290356