[英]How to manually change the vector dimensions of a word in Gensim Word2Vec
我有一個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替換word_vectors ['boy']。
word_vectors['boy'] = [ -7.48055351e-01 3.08748421e-01 -2.50534245e-02 -10.02988110e-03...]
但是引發了以下錯誤
TypeError: 'Word2Vec' object does not support item assignment
有沒有時尚或解決方法來做到這一點? 一旦訓練模型,那就是手動操縱單詞向量? 除了Gensim之外的其他平台有可能嗎?
由於word2vec向量通常僅由迭代訓練過程創建,然后被訪問,因此gensim Word2Vec
對象不支持通過其單詞索引直接分配新值。
但是,就像在Python中一樣,它的所有內部結構都是完全可見/可篡改的,並且由於它是開源的,您可以准確地查看它如何完成所有現有功能,並將其用作如何使用的模型做新事物。
具體來說,原始的單詞向量是(在最新版本的gensim中)存儲在Word2Vec
對象的一個名為wv
的屬性中,而這個wv
屬性是KeyedVectors
一個實例。 如果你檢查它的源代碼,你可以看到通過字符串鍵(例如'boy'
)訪問字向量,包括__getitem__()
方法實現的[]
-indexing,通過它的方法word_vec()
。 您可以在本地安裝或Github中查看該方法的來源:
在那里你會看到單詞實際上轉換為整數索引(通過self.vocab[word].index
)然后用於訪問內部syn0
或syn0norm
數組(取決於用戶是訪問原始或單位規范化)向量)。 如果你看看其他地方,這些地方都設置了,或者干脆檢查它們在自己的控制台/代碼(仿佛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()
和其他操作中使用的most_similar()
),最好先修改syn0
,然后通過以下方式丟棄並重新計算syn0norm
:
word_vectors.wv.syn0norm = None
word_vectors.wv.init_sims()
•添加新單詞需要更多涉及對象篡改,因為它需要增加syn0
(用更大的數組替換它),並更新vocab
詞典
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.