由于最近在研究旅游評論的極性情感分析,想利用深度學習的方式來訓練一個情感分類模型,苦于沒有高質量的語料庫,訓練的模型準確率不高。于是決定自己基于維基百科語料訓練一個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)]