簡體   English   中英

如何在Gensim Word2Vec中手動更改單詞的矢量尺寸

[英]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中查看該方法的來源:

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()和其他操作中使用的most_similar() ),最好先修改syn0 ,然后通過以下方式丟棄並重新計算syn0norm

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

•添加新單詞需要更多涉及對象篡改,因為它需要增加syn0 (用更大的數組替換它),並更新vocab詞典

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM