一、下载原始数据
数据下载地址:https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2
,或者在这里找 https://dumps.wikimedia.org/zhwiki/ 。这个文件只包含了标题和正文,不包含词条之间的链接信息,大小约为1.3G,解压后的xml文件为7.18G。
二、抽取正文
WikiExtractor:是意大利人用Python写的一个维基百科抽取器,使用非常方便。用于从原始的xml文件中提取出标题和正文。地址https://github.com/attardi/wikiextractor/blob/master/WikiExtractor.py。因为这个文件不依赖其他文件和库,就直接在本地新建一个脚本,再把WikiExtractor.py中的源码复制过来就行了。
python WikiExtractor.py -b 500M -o zhwiki zhwiki-20180720-pages-articles.xml.bz2
参数-b 500M表示以500M为单位切分文件,默认是1M。
这里,我们得到了3个文本文件:wiki_00, wiki_01,wiki_02。大小分别为:499M,499M, 270M。
三、繁简转换
维基百科的中文数据是繁简混杂的,里面包含大陆简体、台湾繁体、港澳繁体等多种不同的数据。有时候在一篇文章的不同段落间也会使用不同的繁简字。
为了处理方便起见,我们直接使用了开源项目繁体简体转换工具opencc。Linux下可以直接wget后在终端中使用,windows版本只能手动下载了,地址https://bintray.com/package/files/byvoid/opencc/OpenCC。下完直接解压就可以了。
我的环境是64位Windows,下载了opencc-1.0.4-win32.7z 版本,解压后将bin路径加入环境变量。
然后将需要转换的三个文件加入到bin目录中,在bin目录下打开cmd,运行
.\opencc -i wiki_00 -o zh_wiki_00 -c C:\Users\ASUS\Desktop\opencc-1.0.4\share
\opencc\t2s.json
.\opencc -i wiki_01 -o zh_wiki_01 -c C:\Users\ASUS\Desktop\opencc-1.0.4\share
\opencc\t2s.json
.\opencc -i wiki_02 -o zh_wiki_02 -c C:\Users\ASUS\Desktop\opencc-1.0.4\share
\opencc\t2s.json
然后再把转换后的简体文件拷回去。。。
四、符号处理
由于Wikipedia Extractor抽取正文时,会将有特殊标记的外文直接剔除。我们需要将「」『』这些符号替换成引号,顺便删除空括号。代码如下:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import re
import sys
import codecs
def myfun(input_file):
p1 = re.compile(ur'-\{.*?(zh-hans|zh-cn):([^;]*?)(;.*?)?\}-')
p2 = re.compile(ur'[(\(][,;。?!\s]*[)\)]')
p3 = re.compile(ur'[「『]')
p4 = re.compile(ur'[」』]')
outfile = codecs.open('std_zh_wiki', 'a+', 'utf-8')
with codecs.open(input_file, 'r', 'utf-8') as myfile:
for line in myfile:
line = p1.sub(ur'\2', line)
line = p2.sub(ur'', line)
line = p3.sub(ur'“', line)
line = p4.sub(ur'”', line)
outfile.write(line)
outfile.close()
if __name__ == '__main__':
if len(sys.argv) != 2:
print "Usage: python script.py inputfile"
sys.exit()
reload(sys)
sys.setdefaultencoding('utf-8')
input_file = sys.argv[1]
myfun(input_file)
注意:
这是将三个文件处理后追加到一个文件里,因此使用a+
,需要运行三遍。
python .\exec_sum.py zh_wiki_00
python .\exec_sum.py zh_wiki_01
python .\exec_sum.py zh_wiki_02
得到格式化文件:std_zh_wiki,1.25G。
五、中文分词
中文分词工具有很多种, 这里我们使用python版本的结巴分词:https://github.com/fxsjy/jieba
安装很简单:$ pip install jieba
安装好后执行命令进行分词:
python -m jieba -d " " ./std_zh_wiki > ./cut_std_zh_wiki
命令中的-d ” “选项,双引号中是一个空格,指的是以空格分割词汇。
这里,我们又得到1个分词文件:cut_std_zh_wiki。大小为:1.58G。比之前的文件要大,因为文件中加入了很多空格符。
注意:
- 这里如果用python3会报编码错误,python2不会。
- 分词分得非常慢,如果分成三个文件会快很多,但是我不知道怎样在训练w2v的时候加载三个语料库。
六、训练word2vec模型
训练模型我们使用python的gensim库提供的方法,gensim官网。
安装非常简单:$ pip install gensim
接下来,我们用cut_std_zh_wiki进行训练,训练代码也很简单:
from gensim.models import word2vec
import logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
sentences = word2vec.LineSentence(u'./cut_std_zh_wiki_00')
model = word2vec.Word2Vec(sentences,size=200,window=5,min_count=5,workers=4)
model.save('./word2vecModel/WikiCHModel')
训练的过程进度会打印在控制台。训练结束后我们就得到了一个word2vec模型。
注意:
如果用python3这里会报编码错误UnicodeDecodeError: 'utf-8' codec can't decode byte 0xad in position 6
。
解决办法为用notepad++打开文件,在“编码”中选择“转为utf-8编码”。(如果用记事本打不开,文件太大会导致未响应)
七、调用并测试word2vec模型
调用模型也很简单,同样使用gensim库。
from gensim.models import word2vec
model = word2vec.Word2Vec.load('./word2vecModel/WikiCHModel')
print(model.wv.similarity('奥运会','金牌')) #两个词的相关性
print(model.wv.most_similar(['伦敦','中国'],['北京'])) # 北京is to中国 as 伦敦is to?
参考网址:
windows使用opencc中文简体和繁体互转
使用中文维基百科语料库训练一个word2vec模型
word2vec实战:获取和预处理中文维基百科(Wikipedia)语料库,并训练成word2vec模型