[Home]

NLP学习笔记:维基语料的训练

正好最近在做ATSAST的博客系统,于是想要用NLP的手段给Blog添加一个模糊搜索的功能,这需要一个训练好的大型语料库,最好能够建立起词性关联和词义向量的关系,于是想到了Wikipedia的语料训练。

查找资料发现这件事情许多人应该都做过了,维基百科有现成的语料集下载,在 https://dumps.wikimedia.org/enwiki/latest/ 下载latest articles的语料XML文档,然后再作进一步的处理。

对原始语料的处理有两种方式,一种是自己使用Python的re和string模块对XML里的标识符进行删除,对段落进行划分,还有一种是使用现成的工具WikiExtractor来处理,由于WikiExtractor使用了多线程和FastDtw进行优化,故选择后者。

WikiExtractor的Github地址:https://github.com/attardi/wikiextractor

使用

WikiExtractor.py -o enwiki enwiki-latest-pages-articles.xml.bz2

进行处理。

处理好的语料按分类存放在了多个目录下,接下来我们需要对其进行分词。

英文语料的分词很好操作,根据WhiteSpace字符进行划分,根据.来进行句子的划分即可,事实上,知名的NLP模块Pattern已经为我们准备好了这个功能。

import re
from pattern.en import tokenize
def cleanhtml(raw_html):
    cleanr = re.compile('<.*?>')
    cleantext = re.sub(cleanr, ' ', raw_html)
    return cleantext
def __iter__(self):
        for root, dirs, files in os.walk(self.dirname):
            for filename in files:
                file_path = root + '/' + filename
                for line in open(file_path):
                    sline = line.strip()
                    if sline == "":
                        continue
                    rline = cleanhtml(sline)
                    tokenized_line = ' '.join(tokenize(rline))
                    is_alpha_word_line = [word for word in
                                          tokenized_line.lower().split()
                                          if word.isalpha()]
                    yield is_alpha_word_line

如果是中文的话,建议使用Jieba分词。

然后设定Word2vec的词向量维度,迭代次数等信息,就可以开始训练了。

训练总计使用了17个小时,保存好的词向量模型就可以方便的调用了。

from gensim.models import Word2Vec

en_wiki_word2vec_model = Word2Vec.load(‘data/model/enwiki’)

en_wiki_word2vec_model.most_similar(‘word’)

返回的结果是:

[(‘phrase’, 0.8129693269729614), (‘meaning’, 0.7311851978302002), (‘words’, 0.7010501623153687), (‘adjective’, 0.6805518865585327), (‘noun’, 0.6461974382400513), (‘suffix’, 0.6440576314926147), (‘verb’, 0.6319557428359985), (‘loanword’, 0.6262609958648682), (‘proverb’, 0.6240501403808594), (‘pronunciation’, 0.6105246543884277)]

关于如何使用这套模型来实现自动写作纠错的功能,也是接下来值得探讨的问题。