由于最近在研究旅游评论的极性情感分析,想利用深度学习的方式来训练一个情感分类模型,苦于没有高质量的语料库,训练的模型准确率不高。于是决定自己基于维基百科语料训练一个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 后面为下载好的语料所在路径,注意替换。
我的电脑跑了一个多小时。
![](https://img.haomeiwen.com/i970305/f721dc7e672055ac.png)
跑完后就能看到处理好的语料
![](https://img.haomeiwen.com/i970305/00b8b742707c215a.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)]
网友评论