1. 程式人生 > 程式設計 >在python下實現word2vec詞向量訓練與載入例項

在python下實現word2vec詞向量訓練與載入例項

專案中要對短文字進行相似度估計,word2vec是一個很火的工具。本文就word2vec的訓練以及載入進行了總結。

word2vec的原理就不描述了,word2vec詞向量工具是由google開發的,輸入為文字文件,輸出為基於這個文字文件的語料庫訓練得到的詞向量模型。

通過該模型可以對單詞的相似度進行量化分析。

word2vec的訓練方法有2種,一種是通過word2vec的官方手段,在linux環境下編譯並執行。

在github上下載word2vec的安裝包,然後make編譯。檢視demo-word.sh指令碼,得到word2vec的執行命令:

./word2vec -train text8 -output vectors.bin -cbow 1 -size 200 -window 8 -negative 25 -hs 0 -sample 1e-4 -threads 20 -binary 1 -iter 15

引數解釋:

1)-train:需要訓練的語料庫,text8為語料庫檔名

2)-output:輸出的詞向量檔案,vectors.bin為輸出詞向量檔名,.bin字尾為二進位制檔案。若要以文件的形式檢視詞向量檔案,需要將-binary引數的值由1改為0

3)-cbow:是否使用cbow模型進行訓練。引數為1表示使用cbow,為0表示不使用cbow

4)-size:詞向量的維數,預設為200維。

5)-window:訓練過程中擷取上下文的視窗大小,預設為8,即考慮一個詞前8個和後8個詞

6)-negative:若引數非0,表明取樣隨機負取樣的方法,負樣本子集的規模預設為25。若引數值為0,表示不使用隨機負取樣模型。使用隨機負取樣比Hierarchical Softmax模型效率更高。

7)-hs:是否採用基於Hierarchical Softmax的模型。引數為1表示使用,0表示不使用

8)-sample:語料庫中的詞頻閾值引數,詞頻大於該閾值的詞,越容易被取樣。預設為e^-4.

9)-threads:開啟的執行緒數目,預設為20.

10)-binary:詞向量檔案的輸出形式。1表示輸出二進位制檔案,0表示輸出文字檔案

11)-iter:訓練的迭代次數。一定範圍內,次數越高,訓練得到的引數會更準確。預設值為15次.

./word2vec -train mytext.txt -output vectors.txt -cbow 1 -size 200 -window 5 -negative 25 -hs 0 -sample 1e-4 -threads 20 -binary 0 -iter 30

示例為訓練一個名mytext.txt的文件。設定輸出詞向量的格式為.txt文字文件,所以還需要將-binary引數設定為0.

訓練模型採用基於隨機負取樣的cbow模型。由於短文字字數極為有限,所以-window引數設定為5,設定詞向量的維數

為200,為了使得到的引數更準確,將迭代次數增加至30.其他引數使用預設值。

訓練以後得到一個txt文字,該文字的內容為:每行一個單詞,單詞後面是對應的詞向量。

gensim載入詞向量:

儲存詞向量模型到pkl中(注意:這裡是對詞向量模型進行構建)

from gensim.models import KeyedVectors
if not os.path.exists(pkl_path): # 如果pickle模型不存在,則構建一個

    print '詞向量模型不存在,開始構建詞向量模型...'
    Word2Vec = KeyedVectors.load_word2vec_format(vecs_path,binary=False) # 載入詞向量模型
    f = file(pkl_path,'wb')
    pickle.dump(Word2Vec,f,True)
    f.close()
    print '詞向量模型構建完畢...'

f= file(pkl_path,'rb')# 開啟pkl檔案
word2vec=pickle.load(f)# 載入pkl

第二種方法是使用gensim模組訓練詞向量:

from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence

try:
  import cPickle as pickle
except ImportError:
  import pickle

sentences = LineSentence(path)# path為要訓練的txt的路徑
# 對sentences表示的語料庫進行訓練,訓練200維的詞向量,視窗大小設定為5,最小詞頻設定為5
model = Word2Vec(sentences,size=200,window=5,min_count=5)
model.save(model_path)#model_path為模型路徑。儲存模型,通常採用pkl形式儲存,以便下次直接載入即可

# 載入模型
model = Word2Vec.load(model_path)

完整的訓練,載入通常採用如下方式:

if not os.path.exists(model_path):
    sentences = LineSentence(path)
    model = Word2Vec(sentences,min_count=5)
    model.save(model_path)
model = Word2Vec.load(model_path)

這樣一來,就可以通過pkl化的詞向量模型進行讀取了。pkl的目的是為了儲存程式中變數的狀態,以便下次直接訪問,

不必重新訓練模型。

詳細內容間gensim官方庫

https://radimrehurek.com/gensim/models/word2vec.html

以上這篇在python下實現word2vec詞向量訓練與載入例項就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。