2016-11-07 89 views
12

在word2vec模型中,有兩個線性轉換將詞彙空間中的一個詞帶到一個隱藏層(「in」向量),然後返回vocab空間(「out 「矢量)。通常在訓練後丟棄這個向量。我想知道在gensim python中訪問out矢量有沒有簡單的方法?等同地,我如何訪問out矩陣?gensim word2vec存取/導出向量

動機:我想實現這個最近的一篇文章中提出的觀點:A Dual Embedding Space Model for Document Ranking

這裏有更多的細節。從參考上面我們有以下word2vec模型:

enter image description here

這裏,輸入層是尺寸$ V $,詞彙大小,隱藏層是尺寸$ d $的,和一個輸出層大小爲$ V $。這兩個矩陣是W_ {IN}和W_ {OUT}。 通常,word2vec模型只保留W_IN矩陣。這就是,在gensim訓練word2vec模式後,你會得到什麼返回東西,如:

模型[ '土豆'] = [ - 0.2,0.5,2,...]

如何訪問或保留W_ {OUT}?這可能相當昂貴,我真的希望gensim中的一些內置方法能夠做到這一點,因爲我害怕如果我從頭開始編寫代碼,它不會提供良好的性能。

+0

到目前爲止您是否有任何代碼? – rebeling

回答

5

雖然這可能不是一個正確的答案(還不能評論),沒有人指出了這一點,看看here。創作者似乎回答了類似的問題。這也是您有更高機會獲得有效答案的地方。

link中挖掘他發佈在word2vec源代碼中,您可以更改syn1刪除以滿足您的需求。請記住在完成後刪除它,因爲它證明是一個記憶豬。

+2

謝謝!這看起來像我在找什麼。爲了解釋答案,輸入/輸出嵌入如下: 輸入:model.syn0, 輸出:model.syn1,model.syn1neg –

0

下面的代碼將啓用保存/加載模型。它在內部使用pickle,可選地將模型的內部大型NumPy矩陣直接從磁盤文件映射到虛擬內存中,以進行進程間內存共享。

model.save('/tmp/mymodel.model') 
new_model = gensim.models.Word2Vec.load('/tmp/mymodel') 

一些背景信息Gensim是一個免費的Python庫旨在處理原始,非結構化數字文本(「純文本」)。 gensim中的算法如潛在語義分析,潛在狄利克雷分配和隨機預測通過檢查訓練文檔語料庫中單詞的統計共現模式來發現文檔的語義結構。

一些好的博客,講述關於使用和示例代碼庫來啓動該項目

安裝參考here

希望這有助於!

+2

感謝您的回答。然而,這與我的問題完全沒有關係。具體來說,在word2vec中有兩個不同的單詞向量(「in」和「out」),而word2vec只保留其中的一個(「in」)。我在問另一個。 –

0

在word2vec.py文件中,您需要進行此更改 在以下函數中,它當前返回「in」向量。正如你想要的「出」矢量。 「in」保存在syn0對象中,「out」保存在syn1neg對象變量中。

def save_word2vec_format(self, fname, fvocab=None, binary=False): 
    .... 
    .... 
    row = self.syn1neg[vocab.index]