如何使用中文維基百科 + word2vec

泥膩泥膩
8 min readOct 30, 2018

--

下載維基百科的資料集後,可以用幾個方法來解析裡面的資料

方法1. 自己徒法練功,寫程式碼解析它XD

方法2. 用別人的套件~~~~~~~ (Wikipedia Extractor 或 gensim wikicorpus等等的)

以下會分幾個階段介紹:

一、下載中文維基百科資料集

二、使用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 背後的原理後,也可以試著調調hsnegative,看看對效能會有什麼影響

--

--

泥膩泥膩
泥膩泥膩

Written by 泥膩泥膩

快解除我的封印RRRRRRRR~~~~

No responses yet