2017-10-09 145 views
0

我有很多詞矢量的Word2Vec模型。我可以像這樣訪問一個單詞向量。如何手動改變一個詞的向量尺寸Gensim Word2Vec

word_vectors = gensim.models.Word2Vec.load(wordspace_path) 
print(word_vectors['boy']) 

輸出

[ -5.48055351e-01 1.08748421e-01 -3.50534245e-02 -9.02988110e-03...] 

現在我有我要替換的word_vectors [ '男孩']一個適當的矢量表示。

word_vectors['boy'] = [ -7.48055351e-01 3.08748421e-01 -2.50534245e-02 -10.02988110e-03...] 

但下面的錯誤被拋出

TypeError: 'Word2Vec' object does not support item assignment 

是否有任何方式或變通方法來做到這一點?一旦模型被訓練,那就是手動操縱單詞向量?在除Gensim之外的其他平臺上可能嗎?

回答

2

由於word2vec向量通常僅由迭代訓練過程創建,然後被訪問,因此gensim Word2Vec對象不支持通過其詞索引直接分配新值。

然而,就像它在Python中一樣,它的所有內部結構都是完全可見的/可以被你篡改的,而且由於它是開源的,你可以準確地查看它是如何完成現有的所有功能的,並將它用作如何做新事物的模型。

具體而言,原始字向量(在最新版本的gensim)存儲在稱爲wvWord2Vec對象的屬性,並且該wv屬性是KeyedVectors一個實例。如果你檢查它的源代碼,你可以看到串鍵字向量的訪問(例如'boy'),包括那些由[] -indexing由__getitem__()方法來實現,都要經過它的方法word_vec()。您可以在本地安裝,或者在Github上查看該方法的來源:

https://github.com/RaRe-Technologies/gensim/blob/c2201664d5ae03af8d90fb5ff514ffa48a6f305a/gensim/models/keyedvectors.py#L265

在那裏你會看到這個詞實際上被轉換成整數索引(通過self.vocab[word].index),然後用於訪問內部的syn0syn0norm數組(取決於用戶是訪問原始的還是單位歸一化的矢量)。如果你看看其他地方,這些地方都設置了,或者乾脆檢查它們在自己的控制檯/代碼(彷彿word_vectors.wv.syn0),你會看到這些numpy陣列,其通過指數做支持直接賦值。

所以,你可以直接它們的值由整數索引亂動,好像是:

word_vectors.wv.syn0[word_vectors.wv.vocab['boy'].index] = [ -7.48055351e-01 3.08748421e-01 -2.50534245e-02 -10.02988110e-03...] 

,然後未來的word_vectors.wv['boy']訪問將返回更新後的值。

注:

•如果你想syn0norm進行更新,有適當的單位範載體(如most_similar()和其他操作使用),它很有可能就是最好的修改syn0,再丟棄並重新計算syn0norm,經由:

word_vectors.wv.syn0norm = None 
word_vectors.wv.init_sims() 

•添加新單詞將需要更復雜的對象的篡改,因爲這將需要生長syn0(具有較大的陣列替代它),以及更新所述vocab字典