NLP 專欄 (1–2) — 如何訓練自己的 word2vec

Gary Hsu
4 min readMar 8, 2020

--

如果只想使用最新的 Word2Vec trained on Wikipedia with Phrase (100d)的話,請直接點擊 -> 2020.02.19 Wikipedia Word2Vec weights 下載網址

前言

在前一篇 NLP專欄(1) — 詳解 Word2vec 介紹了 Word2Vec 的運作原理之後,但不管是 Google 的 Word2Vec 或者是 Stanford 的 Glove,距今也都有個六、七年之久,那時 windows 7 還是 Microsoft 最流行的作業系統,關於 AI、Machine Learning 的介紹也甚少,很幸運的是 Gensim 幫我們實作 Word2Vec 的訓練,所以我們可以用很簡單的幾行 code 就訓練出自己最新的 word embeddings。

在本文之中,除了使用最新 Wikipedia (英文)的資料來訓練我們的 word2vec 之外,還提供了一些範例來說明要如何訓練一個可以認識片語 (Phrase) 的模型。

步驟一:資料準備

到維基百科的頁面下載資料 https://dumps.wikimedia.org/enwiki/latest/,我下載了檔名為 enwiki-latest-pages-articles.xml.bz2的資料(作者下載日期為2020.02.19,檔案大小為16.88GB)。

步驟二:函式庫安裝

# 如果你使用 pip 的話
$ pip install gensim
# 如果你使用 conda 的話
$ conda install -c anaconda gensim

步驟三:Preprocessing the wikipedia data,根據不同的需求選擇不同的Preprocessor:

步驟三(一):新建一個 Jupyter notebook/python file 並將 wikipedia 預處理(Preprocessing):

這一步驟在我的Macbook Pro上面執行大約花了一個半小時。

Word2vec preprocessing (如果要lemmatize的話,請跳到步驟三 (二))

值得一提的是:在宣告 WikiCorpus 的時候,默認會將輸入文字全部轉成小寫,如果在你的例子之中,需要有大小寫的區分,務必加上 lower = False。

步驟三(二):如果需要使用到 lemmatize的話,可以使用spaCy 來達成目標:

如果你還不是很清楚什麼是 lemmatize 的話可以參考:詞形還原工具對比。因為要lemmatize的關係,這一步大約要花四個小時。

安裝spaCy:

# 如果你使用 pip 的話
$ pip install -U spacy
# 如果你使用 conda
$ conda install -c conda-forge spacy

安裝spaCy Model (必要):

# spaCy 本身一個空殼,我們要幫這個殼裝上它的心臟
python -m spacy download en_core_web_md

和剛剛的非常類似,只是加上了三行:

Word2vec lemmatize preprocessing

步驟四:Train Your Own Word Vectors(步驟四(二))才有支援片語(Phrase)

步驟四(一):將 wiki-preprocessed-lemma.txt 拿來訓練我們的 word vectors

Train Word2Vec

步驟四(二):訓練一個讀得懂「片語」的 word2vec

Train Phrase2Vec

到這邊就大功告成啦,可以直接使用:

print(model.wv.most_similar('machine_learning')) # Phrase 中間的空格要用 _ 代替,而且只有步驟四(二)才支援 Phrase

結果為:

[('machine_learn', 0.9530839920043945),
('deep_learning', 0.9144971966743469),
('datum_mining', 0.8860416412353516),
('parallel_computing', 0.8649201393127441),
('scientific_computing', 0.8539735078811646),
('data_analysis', 0.8473660945892334),
('pattern_recognition', 0.8465429544448853),
('datum_analysis', 0.843416154384613),
('computer_vision', 0.8426181077957153),
('neural_network', 0.8414143323898315)]

希望能夠幫助到想要學習如何用 gensim 來創造自己最新詞向量的人!如果覺得這篇文章有幫助的話,也麻煩幫我鼓掌囉!謝謝!

--

--