以下會分幾個階段介紹:
一、下載中文維基百科資料集
二、使用Wikipedia Extractor
三、使用 zake7749 的github 的程式碼
一、首先先去下載最新的中文維基百科 corpus
大概 1.5 GB(https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2)
$ wget https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2
裡面的格式是 xml
<text></text>是文章的內容,裡面有很多雜訊,需要處理的。
二、你可以使用 wikiextractor 做抽取
先下載然後安裝
$ git clone https://github.com/attardi/wikiextractor.git wikiextractor$ cd wikiextractor$ python setup.py install$ python WikiExtractor.py -b 1024M -o extracted zhwiki-latest-pages-articles.xml.bz2
抽取完的資料會跑到~/wikiextractor/extracted/AA/
這個目錄底下有兩個檔案:wiki_00, wiki_01
文件的內容大概長這樣:
<doc id="123" url="zh.wiki" title="安安你好">
文章內容
</doc>
三、或者是用 zake7749 的程式碼
1. 先下載 zake7749 github 的程式碼
$ git clone https://github.com/zake7749/word2vec-tutorial.git
2. 下載完之後,要開始處理維基百科的資料
(wiki_to_txt.py 是剛剛在第二步驟下載下來的程式碼,zhwiki-latest-pages-articles.xml.bz2 是第一步驟下載的維基百科資料集,指令請對應到各自檔案的路徑)
$ python3 wiki_to_txt.py zhwiki-latest-pages-articles.xml.bz2
3. 第二步驟處理完後,它會生成一個 wiki_texts.txt 檔案,我們用 pandas 觀察一下它長怎樣
可以看到它有些是簡體的,所以我們做一個前處理,把簡體字轉成繁體字
4. 先將簡體轉成繁體字,使用 OpenCC套件
這個要跑超級久… 大概80分鐘,顆顆.............................Q_Q
- 安裝OpenCC套件
$ pip install opencc-python-reimplemented
或是你可以這樣安裝OpenCC
$ git clone https://github.com/BYVoid/OpenCC.git
$ make
$ make install安裝的時候,遇到問題 /CMakeFiles/CMakeOutput.log
提示缺少
Doxygen
,Doxygen
是 opencc 所需要的一个插件。$ apt-get install doxygen
- 執行 wiki_texts.txt 轉成繁體中文,存成 wiki_zh_tw.txt
$ python -m opencc -c s2tw -i wiki_texts.txt -o wiki_zh_tw.txt# 如果你是用第二種方法安裝OpenCC,就執行下面的指命
$ opencc -i wiki_texts.txt -o wiki_zh_tw.txt -c s2tw.json
(如果你要繁體轉簡體 :s2tw.json
改成t2s.json
)
轉換後,再來看一下結果
完美的轉換成功惹!
5. 開始做斷詞的處理,使用 Jieba 套件,這個也要跑滿久的….大概70分鐘
$ python3 segment.py
6. 完成以上前處理後,要開始訓練詞向量囉 😆😆大概也是花了40分鐘訓練
$ python3 train.py
7. 訓練完成後,讓我們來測試一下模型的效能
由於 gensim 將整個模型讀了進來,所以記憶體會消耗相當多,如果出現了MemoryError
,可能得調整一下min_count
或對常用詞作一層快取,這點要注意一下
$ python3 demo.py
更上一層樓
如何優化詞向量的表現?這其實有蠻多方法的,大方向是從應用的角度出發,我們能針對應用特化的語料進行再訓練,除此之外,斷詞器的選擇也很重要,它很大程度的決定什麼詞該在什麼地方出現,如果發現 jieba
有些力不能及的,不妨試著採用別的斷詞器,或是試著在 jieba
自訂辭典,調一下每個詞的權重
Word2vec 的參數解析
model = word2vec.Word2Vec(sentences, size=250)我們先讓上面那行現出原型:
class gensim.models.word2vec.Word2Vec(
sentences=None, size=100, alpha=0.025, window=5,
min_count=5, max_vocab_size=None, sample=0.001,
seed=1, workers=3, min_alpha=0.0001, sg=0, hs=0,
negative=5, cbow_mean=1,
hashfxn=<built-in function hash>,
iter=5, null_word=0, trim_rule=None,
sorted_vocab=1, batch_words=10000)
- sentences: 訓練的句子集
- size: 訓練出的詞向量會有幾維
- alpha: 機器學習中的學習率,這東西會逐漸收斂到
min_alpha
- sg: sg=1 表示採用 skip-gram,sg=0 表示採用 cbow
- window: 往左往右看幾個字的意思
- workers: 執行緒數目,除非電腦不錯,不然建議別超過 4
- min_count: 若這個詞出現的次數小於多少,那它就不會被視為訓練對象
等摸清 Word2Vec 背後的原理後,也可以試著調調hs
、negative
,看看對效能會有什麼影響
Reference
1. 如何使用中文维基百科语料
2. 以 gensim 訓練中文詞向量