2017-03-02 133 views
1

我想使用word2vec的輸出嵌入,如this paper (Improving document ranking with dual word embeddings)如何在gensim word2vec中訪問輸出嵌入(輸出向量)?

我知道輸入矢量在syn0中,輸出矢量在syn1和syn1neg如果負採樣。

但是,當我計算最相似的輸出向量,我得到了一些範圍相同的結果,因爲刪除syn1或syn1neg。

這是我得到的。

IN[1]: model = Word2Vec.load('test_model.model') 

IN[2]: model.most_similar([model.syn1neg[0]]) 

OUT[2]: [('of', -0.04402521997690201), 
('has', -0.16387106478214264), 
('in', -0.16650712490081787), 
('is', -0.18117375671863556), 
('by', -0.2527652978897095), 
('was', -0.254993200302124), 
('from', -0.2659570872783661), 
('the', -0.26878535747528076), 
('on', -0.27521973848342896), 
('his', -0.2930959463119507)] 

但是另一個syn1neg numpy向量已經是類似的輸出。

IN[3]: model.most_similar([model.syn1neg[50]]) 

OUT[3]: [('of', -0.07884830236434937), 
('has', -0.16942456364631653), 
('the', -0.1771494299173355), 
('his', -0.2043554037809372), 
('is', -0.23265135288238525), 
('in', -0.24725285172462463), 
('by', -0.27772971987724304), 
('was', -0.2979024648666382), 
('time', -0.3547973036766052), 
('he', -0.36455872654914856)] 

我想獲得輸出numpy數組(負或不)在訓練期間保留。

讓我知道如何訪問純syn1或syn1neg或代碼,或者一些word2vec模塊可以獲得輸出嵌入。

回答

4

對於負樣本,syn1neg權重是按照單詞的順序排列的,順序與syn0相同。

事實上,你的兩個例子給出了類似的結果並不一定表明任何錯誤。這些單詞默認按頻率排序,所以早期單詞(包括位置0和50中的單詞)是非常頻繁的單詞,具有非常通用的基於共現的意思(可能都彼此接近)。

選擇一箇中頻詞的含義更明確,並且可能會得到更有意義的結果(如果您的語料庫/設置/需求與「雙字嵌入」論文的足夠類似)。例如,你可能想比較:

model.most_similar('cousin') 

...與...

model.most_similar(positive=[model.syn1neg[model.vocab['cousin'].index]) 

然而,在所有情況下,現有的most_similar()方法只會尋找類似的載體在syn0 - 在「 IN「是該論文術語的向量。所以我相信上面的代碼實際上只是計算紙張可能被稱爲「OUT-IN」相似度:一個IN矢量與給定OUT矢量最相似的列表。實際上,他們似乎吹噓相反的東西,即「IN-OUT」相似性,因爲它是有用的。 (這會是最相似的矢量給出一個所述OUT矢量。)

gensim的最新版本引入KeyedVectors類表示一組字的載體,通過串鍵控的,從特定Word2Vec模型分離或其他訓練方法。您可能會創建一個額外的KeyedVectors實例,用syn1neg代替通常的syn0,以獲得類似於目標向量的OUT向量列表(並因此計算top-n'IN-OUT'相似度或甚至'OUT-OUT'相似度)。

例如,這可能工作(我沒有測試過):

outv = KeyedVectors() 
outv.vocab = model.wv.vocab # same 
outv.index2word = model.wv.index2word # same 
outv.syn0 = model.syn1neg # different 
inout_similars = outv.most_similar(positive=[model['cousin']]) 

syn1只使用分層抽樣的時候存在,它是不太清楚什麼是「輸出嵌入」爲個人字將在那裏。(有多個輸出節點對應於預測任何一個單詞,並且它們都需要更接近它們各自的0/1值來預測單個單詞。因此,與'syn1neg'不同,沒有一個地方可以讀取這個矢量,意思是一個單詞的輸出,你可能必須計算/近似一些隱藏 - >輸出權重集合,這會將這些多個輸出節點驅動到正確的值。)

+0

你的代碼奇妙地工作! 非常感謝你給我答案。 –