— Posted in 程式設計, 電腦資訊

[轉錄]Word2Vec – 以 gensim 訓練中文詞向量

來源:http://zake7749.github.io/2016/08/28/word2vec-with-gensim/

Word2Vec
很顯然,一個詞的意涵跟他的左右鄰居很有關係,比如「雨越下越大,茶越充越淡」,什麼會「下」?「雨」會下,什麼會「淡」?茶會「淡」,這樣的類比舉不勝舉,那麼,若把思維逆轉過來呢?

顯然,我們或多或少能從左右鄰居是誰,猜出中間的是什麼,這很像我們國高中時天天在練的英文克漏字。那麼問題來了,左右鄰居有誰?能更精確地說,你要往左往右看幾個?假設我們以「孔乙己 一到 店 所有 喝酒 的 人 便都 看著 他 笑」為例,如果往左往右各看一個:
[孔乙己 一到] 店 所有 喝酒 的 人 便 都 看著 他 笑
[孔乙己 一到 店] 所有 喝酒 的 人 便 都 看著 他 笑
孔乙己 [一到 店 所有] 喝酒 的 人 便 都 看著 他 笑
孔乙己 一到 [店 所有 喝酒] 的 人 便 都 看著 他 笑
……

這樣就構成了一個 size=1 的 windows,這個 1 是極端的例子,為了讓我們看看有停用詞跟沒停用詞差在哪,這句話去除了停用詞應該會變成:
孔乙己 一到 店 所有 喝酒 人 看著 笑

我們看看「人」的窗口變化,原本是「的 人 便」,後來是「喝酒 人 看著」,相比原本的情形,去除停用詞後,我們對「人」這個詞有更多認識,比如人會喝酒,人會看東西,當然啦,這是我以口語的表達,機器並不會這麼想,機器知道的是人跟喝酒會有某種關聯,跟看會有某種關聯,但儘管如此,也遠比本來的「的 人 便」好太多太多了。

 

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:還記得孔乙己的例子嗎?往左往右看幾個字的意思,印象中原作者論文裡寫 cbow 採用 5 是不錯的選擇
workers:執行緒數目,除非電腦不錯,不然建議別超過 4
min_count:若這個詞出現的次數小於min_count,那他就不會被視為訓練對象