使用gensim训练维基百科中文语料wordvec模型

由于最近在研究旅游评论的极性情感分析,想利用深度学习的方式来训练一个情感分类模型,苦于没有高质量的语料库,训练的模型准确率不高。于是决定自己基于维基百科语料训练一个wordvec2 模型,为下一步的研究工作做准备。

1、语料的下载

下载地址,下载大小大概有1.5G,里面的内容以为xml格式保存。

2、数据的处理

1、去除原始的数据是包含了各种xml标签,使用网上开源处理程序提取文本数据Wikipedia Extractor

#下载程序
git clone https://github.com/attardi/wikiextractor.git wikiextractor
#cd 到程序目录
cd wikiextractor
#安装程序
python setup.py install
#提取文章
python WikiExtractor.py -b 100M -o extracted /Users/yj/Desktop/学习/情感分析/wikiCorpus/wiki/zhwiki-latest-pages-articles.xml.bz2

说明 -b 后面参数为提取文件的大小,我这里设置为100M,不要设置太大不然后面的语料处理时间太长,-o extracted 后面为下载好的语料所在路径,注意替换。
我的电脑跑了一个多小时。


num.png

跑完后就能看到处理好的语料

wikicorpus.png

2、将繁体转为简体
使用开源工具opencc将繁体抓我简体,安装命令

brew install opencc

使用opencc进行转换,转换命令如下

opencc -i wiki_00 -o zh_wiki_00 -c t2s.json

-i后面的参数为原始语料路径,-o后面的参数为输出路径
通过转换后格式如下

<doc id="5323477" url="https://zh.wikipedia.org/wiki?curid=5323477" title="海洋学">
海洋学  海洋学()是研究海洋的自然现象、性质及其变化规律,以及开发****
</doc>

我们需要提取<doc></doc>之间的内容
3、去除一些特殊符号,如(){}

                line = line.replace('(','')
                line = line.replace(')','')
                line = line.replace('{','')
                line = line.replace('}','')
                line = line.replace('[','')
                line = line.replace(']','')
                line = line.replace('《','')
                line = line.replace('》','')
                line = line.replace('「','')
                line = line.replace('」','')
                line = line.replace('『','')
                line = line.replace('』','')
                line = line.replace('“','')
                line = line.replace('”','')
                line = line.replace('(','')
                line = line.replace(')','')

3、使用jieba中文切词工具进行切词

经过处理后的数据如下面的格式

海洋学  海洋学()是研究海洋的自然现象、性质及其变化规律,****

第一个词为维基百科的词条,后面的词为该词条的解释。为了提高对词条切词的准确性,我们对整个词条一空格为分隔符,提取词条如上面的海洋学,使用jiaba动态添加词典的方法jieba.add_word(海洋学),然后对后面的解释进行切词,切词后写入文件。格式如下:

文学 , 在 最 广泛 的 意义 上 , 是 任何 单一 的 书面 作品***

每个词语已空格为进行连接,对998616条维基百科进行切词,并写入文件并作为后面训练word2vec的语料。

4、训练word2vec模型

使用gensim训练刚刚我们处理好的语料,并保存。

from gensim.models.word2vec import Word2Vec,LineSentence
import multiprocessing
 print('开始训练')
    model = Word2Vec(LineSentence('./wikiCorpus_02.txt'),size=300,workers=multiprocessing.cpu_count())
    print('结束')
    model.init_sims(replace=True)
    model.save('./wiki_corpus_02_predict.model')

5、测试训练好的模型

寻找和宝马最相近的十个词语

model =  Word2Vec.load('./wiki_corpus_02_predict.model')

    # 第一个词的向量表示
    # print(model.wv.syn0[0])
    # 词的矩阵
    # print(model.wv.index2word[0])

    # 1.
    print(model.most_similar('宝马'))

得到结果如下:

[('欧宝', 0.7233036756515503), ('捷豹', 0.7231091260910034), ('BMW', 0.7167201638221741), ('雪铁龙', 0.7163304090499878), ('标致', 0.711229681968689), ('沃尔沃', 0.7081398367881775), ('奥迪', 0.7074229717254639), ('保时捷', 0.697162926197052), ('超级跑车', 0.6864667534828186), ('大众汽车', 0.6775105595588684)]

推荐阅读更多精彩内容