用维基百科训练word2vec中文词向量
主要參考:
https://blog.csdn.net/weixin_40547993/article/details/97781179
https://www.kaggle.com/jeffd23/visualizing-word-vectors-with-t-sne
其他的可能還有一些,查閱的時候沒注意,后來找不到了(⊙﹏⊙)
?
本文使用的語料庫是維基百科中文語料庫截至2019-07-20的數(shù)據(jù),下載鏈接:https://dumps.wikimedia.org/zhwiki/20190720/
我已經(jīng)保存在網(wǎng)盤里,有需要的可以直接提取:鏈接:https://pan.baidu.com/s/1IYZPD2B6BZCE3nlXfSjK2A 提取碼:e1wf
?
進入具體步驟之前,先梳理一下大致步驟,以便大腦中先有個大致思路:
- step1:利用gensim的WikiCorpus處理工具對下載的xml壓縮文件進行txt格式轉(zhuǎn)換,轉(zhuǎn)換后的文件每行是一篇維基文檔
- step2:對語料庫進行預處理,主要包括:繁體字轉(zhuǎn)簡體字,去除漢字以外其他字符,分詞
- step3:利用gensim的LineSentence訓練詞向量
以上三個步驟后,詞向量就訓練完成啦,得到詞向量以后,為了驗證詞向量的質(zhì)量,我們可以測試一些詞語的近義詞,對詞向量可視化
?
1.將.xml文件轉(zhuǎn)為.text格式文件,.text格式文件中,一行是一篇文章
from gensim.corpora import WikiCorpus# 這是gensim專門為處理維基百科數(shù)據(jù)的工具包 input_file_name = '/Users/admin/A_NLP/data/zhwiki-20190720-pages-articles-multistream.xml.bz2' output_file_name = 'wiki.cn.txt' input_file = WikiCorpus(input_file_name, lemmatize=False, dictionary={}) output_file = open(output_file_name, 'w', encoding="utf-8") count = 0 for text in input_file.get_texts():output_file.write(' '.join(text) + '\n')count = count + 1if count % 10000 == 0:print('目前已處理%d條數(shù)據(jù)' % count)input_file.close() output_file.close()
2.打印處理成txt文件后的第一行數(shù)據(jù)查看:
ff = open('') for line in ff:print(line)break?
可以看到,上述文件中的字符許多繁體字,且其中摻雜一些英文或其他字符,因此需要對語料再進行一些預處理
3.將語料庫 按行進行,繁轉(zhuǎn)簡、清洗、分詞:
- 繁轉(zhuǎn)簡使用的是opencc工具;
- 清洗非中文數(shù)據(jù)是使用正則表達式直接提取中文字符;
- 分詞則是使用jieba分詞工具
4.打印出處理完的文件的第一行查看
ft = open('wiki.sen.txt','r') for line in ft:print(line)break?5.訓練詞向量并保存模型:利用LineSentence對行文件進行讀取,再放入Word2Vec中進行向量訓練
以下參考其他大佬的文章給出word2vec參數(shù)說明(原文鏈接:https://blog.csdn.net/weixin_40547993/article/details/97781179):?
在gensim中,word2vec相關(guān)的API都在包gensim.models.word2vec中。和算法有關(guān)的參數(shù)都在類gensim.models.word2vec.Word2Vec中。
- sentences: 我們要分析的語料,可以是一個列表,或者從文件中遍歷讀出。
- size: 詞向量的維度,默認值是100。這個維度的取值一般與我們的語料的大小相關(guān),如果是不大的語料,比如小于100M的文本語料,則使用默認值一般就可以了。如果是超大的語料,建議增大維度。
- window:即詞向量上下文最大距離,這個參數(shù)在我們的算法原理篇中標記為,window越大,則和某一詞較遠的詞也會產(chǎn)生上下文關(guān)系。默認值為5。在實際使用中,可以根據(jù)實際的需求來動態(tài)調(diào)整這個window的大小。如果是小語料則這個值可以設(shè)的更小。對于一般的語料這個值推薦在[5,10]之間。
- sg: 即我們的word2vec兩個模型的選擇了。如果是0,則是CBOW模型,是1則是Skip-Gram模型,默認是0即CBOW模型。
- hs: 即我們的word2vec兩個解法的選擇了,如果是0, 則是Negative Sampling,是1的話并且負采樣個數(shù)negative大于0, 則是Hierarchical Softmax。默認是0即Negative Sampling。
- negative:即使用Negative Sampling時負采樣的個數(shù),默認是5。推薦在[3,10]之間。這個參數(shù)在我們的算法原理篇中標記為neg。
- cbow_mean: 僅用于CBOW在做投影的時候,為0,則算法中的為上下文的詞向量之和,為1則為上下文的詞向量的平均值。
- min_count:需要計算詞向量的最小詞頻。這個值可以去掉一些很生僻的低頻詞,默認是5。如果是小語料,可以調(diào)低這個值。
- iter: 隨機梯度下降法中迭代的最大次數(shù),默認是5。對于大語料,可以增大這個值。
- alpha: 在隨機梯度下降法中迭代的初始步長。算法原理篇中標記為,默認是0.025。
- min_alpha: 由于算法支持在迭代的過程中逐漸減小步長,min_alpha給出了最小的迭代步長值。隨機梯度下降中每輪的迭代步長可以由iter,alpha, min_alpha一起得出。
- worker:訓練詞向量使用時使用的線程數(shù),默認為3。
6.測試幾個詞語,找出與其最相似的10個詞語
from gensim.models import Word2Vecwiki_model = Word2Vec.load('wiki_min_count500.model')test = ['文學', '雨水', '汽車', '怪物', '幾何','故宮'] for word in test:res = wiki_model.most_similar(word)print(word) print(res)7.查看詞向量
wiki_model.wv['文學']8.向量可視化,利用TSNE工具,將詞向量降維,降維的原理是使得原本距離相近的向量降維后距離盡可能近,原本距離較遠的向量降維后距離盡可能遠。
這個步驟參考了kaggle上的詞向量可視化文檔:
- https://www.kaggle.com/jeffd23/visualizing-word-vectors-with-t-sne
?
?第一張圖是用所有語料訓練處的模型,包含的詞語較多,因此成了一個大墨團;由于matplotlib模塊的SimHei.ttf文件沒有替換,因此中文文字沒有顯示出來
?
?
?
第二張圖使用了預處理后的前1w行數(shù)據(jù)作為語料庫訓練,在以下位置替換掉了SimHei.ttf文件,
(以下是matplotlib不能顯示中文的解決辦法)
- 下載Github倉庫中的字體SimHei.ttf;
- ?在命令行中執(zhí)行:
python
import matplotlib
print(matplotlib.__path__)
這樣就找到了matplotlib 的路徑,然后 cd 到這個路徑。 cd 到這個路徑之后,繼續(xù) cd,cd 到 mpl-data/fonts/ttf 這個路徑。 然后把 `DejaVuSans.ttf` 這個文件換成SimHei.ttf:
mv SimHei.ttf DejaVuSans.ttf
這樣就可以在matplotlib中顯示中文了。
?
以下是向量可視化效果圖:
?
?為了看的更清晰一點,第三章圖使用的是預處理后的前1000行數(shù)據(jù)作訓練,效果如下:
完。
?
轉(zhuǎn)載于:https://www.cnblogs.com/byugo/p/11300233.html
總結(jié)
以上是生活随笔為你收集整理的用维基百科训练word2vec中文词向量的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDU 1166 敌兵布阵(线段树单点加
- 下一篇: HDU 1754 I Hate It(线