python調用word2vec工具包安裝和使用指南
word2vec python-toolkit installation and use tutorial
本文選譯自英文版,代碼注釋均摘自本文,建議先閱讀skip-model相關知識再閱讀本指南
github倉庫地址
環境准備
- 安裝gcc, 安裝gcc坑比較多,這里建議使用codeblocks自帶的gcc編譯器,下載地址,這里注意,一定要點擊codeblocks-mingw版本,安裝完成后設置環境變量Path, INCLUDE, LIB
- 嘗試安裝:
pip install word2vec
, 觀察報錯情況,這里有幾種解決方法,我遇到的報錯是Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": https://visualstudio.microsoft.com/downloads/
解決方法是下載microsoft vc++下載指南, 還有其他可能的錯誤,鏈接如下:報錯列表,題外話:安裝python工具包時,先查閱pypi,可以避免一些錯誤
模型的訓練
導入模型import word2vec
-
同義詞合並,例如michael jacson和 michael-jackson
word2vec.word2phrase('./txt_file/text8', './txt_file/text8-phrases', verbose=True)
-
訓練skip-gram model, 得到word2vec詞向量表示,size為向量的維數
word2vec.word2vec('/Users/drodriguez/Downloads/text8-phrases', '/Users/drodriguez/Downloads/text8.bin', size=100, verbose=True)
-
輸出
text8.bin
文件,包含二進制形式的詞向量組 -
詞向量的應用:單詞聚類,產生
text8-clusters.txt
包含所有單詞的聚類結果, 結果數目小於等於單詞表數目word2vec.word2clusters('/Users/drodriguez/Downloads/text8', '/Users/drodriguez/Downloads/text8-clusters.txt', 100, verbose=True)
model模型的使用
-
導入剛才產生的模型
model = word2vec.load('/Users/drodriguez/Downloads/text8.bin')
-
model的屬性
model.vocab
, 得到單詞表的numpy.array格式,這里的單詞不是詞向量形式 -
model.vectors
是模型的矩陣,n為單詞數目,m為詞向量長度,vectors
為n*m維 -
可以通過
model['dog'].shape
或者model['dog'][:10]
來訪問某一個單詞的詞向量信息 -
計算幾個詞向量兩兩之間的距離:
model.distance("dog", "cat", "fish")
-
得到某一個單詞的相似詞(基於余弦相似度):
indexes, metrics = model.similar("dog")
,第一個返回值為相似向量的下標,第二個為相似度,都為tuple格式,得到相應的單詞可使用model.vocab[indexes]
-
得到相似詞的統計信息:(詞,相似度)
model.generate_response(indexes, metrics)
,還可以使用model.generate_response(indexes, metrics).tolist()
來轉換得到python數據類型 -
詞向量直接加減運算:
indexes, metrics = model.analogy(pos=['king', 'woman'], neg=['man'])
,返回值和generate_response method
相同
cluster模型的使用
-
導入cluster模型
clusters = word2vec.load_clusters('/Users/drodriguez/Downloads/text8-clusters.txt')
-
得到某一組結果
clusters.get_words_on_cluster(90)
,結果為這一組的所有單詞
cluster和model的結合使用
-
將cluster添加到word2vec model中
model.clusters = clusters
-
進行類似的加減分析:
indexes, metrics = model.analogy(pos=["paris", "germany"], neg=["france"])
-
得到結果后,
model.generate_response(indexes, metrics).tolist()
,得到(單詞,相似程度,所屬組號)