亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從 gensim word2vec 模型中刪除舊“單詞”的最佳方法是什么?

從 gensim word2vec 模型中刪除舊“單詞”的最佳方法是什么?

當年話下 2023-08-08 16:21:13
我有一個從項目-項目圖構建的“語料庫”,這意味著每個句子都是一個圖行走路徑,每個單詞都是一個項目。我想在語料庫上訓練 word2vec 模型以獲得項目的嵌入向量。該圖每天都會更新,因此 word2vec 模型會以增加的方式(使用Word2Vec.save()和Word2Vec.load())進行訓練,以不斷更新項目的向量。與文字不同,我的語料庫中的項目有其生命周期,并且每天都會添加新項目。為了防止模型大小不斷增長,我需要刪除達到其生命周期的項目,同時保持模型可訓練。我想出了下面的代碼,但我不確定它是否正確和正確:from gensim.models import Word2Vecimport numpy as nptexts = [["a", "b", "c"], ["a", "h", "b"]]m = Word2Vec(texts, size=5, window=5, min_count=1, workers=1)print(m.wv.index2word)print(m.wv.vectors)# drop old wordswordsToDrop = ["b", "c"]for w in wordsToDrop:? ? i = m.wv.index2word.index(w)? ? m.wv.index2word.pop(i)? ? m.wv.vectors = np.delete(m.wv.vectors, i, axis=0)? ? del m.wv.vocab[w]print(m.wv.index2word)print(m.wv.vectors)m.save("m.model")del m# increased trainingnew = [["a", "e", "n"], ["r", "s"]]m = Word2Vec.load("m.model")m.build_vocab(new, update=True)m.train(new, total_examples=m.corpus_count, epochs=2)print(m.wv.index2word)print(m.wv.vectors)刪除和增加訓練后,m.wv.index2word和m.wv.vectors仍然元素對應嗎?上面的代碼有副作用嗎?如果我的方法不好,有人可以給我一個例子來展示如何正確刪除舊的“單詞”并保持模型可訓練嗎?
查看完整描述

1 回答

?
函數式編程

TA貢獻1807條經驗 獲得超9個贊

Word2Vec一旦單詞被“切入”包含范圍,就沒有官方支持從 Gensim 模型中刪除單詞。

即使添加單詞的能力也沒有很好的基礎,因為該功能并不基于任何經過驗證/已發布的模型更新方法Word2Vec,并且通過學習選擇掩蓋了更新批次如何影響模型的困難權衡-速率或批次是否完全代表現有詞匯。最安全的做法是定期從頭開始重新訓練模型,使用包含所有相關單詞的足夠示例的完整語料庫。

因此,我的主要建議是定期用經過所有仍然相關數據訓練的新模型替換您的模型。這將確保它不再在過時的術語上浪費模型狀態,并且所有仍然有效的術語都接受了同等的交錯訓練。

經過這樣的重置后,詞向量將無法與之前“模型時代”的詞向量相比較。(同一個詞,即使它的有形含義沒有改變,也可能處于任意不同的位置 - 但與其他向量的相對關系應該保持良好或更好。)但是,同樣的比較漂移任何一組小批量更新也會發生這種情況,這些更新不會平等地“接觸”每個現有單詞,只是以某種無法量化的速度。

OTOH,如果您認為需要保持這種增量更新,即使知道注意事項,您也可以修補模型結構以保留舊模型中盡可能多的合理內容并繼續訓練。

到目前為止,您的代碼是一個合理的開始,缺少正確功能的一些重要注意事項:

  • 由于刪除較早的單詞會更改較晚的單詞的索引位置,因此您需要更新vocab[word].index每個幸存單詞的值,以匹配新的index2word排序。例如,完成所有刪除后,您可以執行以下操作:

for?i,?word?in?enumerate(m.wv.index2word):
????m.wv.vocab[word].index?=?i
  • 因為在您的(默認負采樣)Word2Vec模型中,還有另一個與模型輸出層相關的每個單詞權重數組,它也應該同步更新,以便每個單詞檢查正確的輸出值粗略地說,每當您從 中刪除一行時m.wv.vectors,您都應該從 中刪除同一行m.traininables.syn1neg

  • 因為幸存的詞匯具有不同的相對詞頻,負采樣和下采樣(由參數控制sample)函數都應該處理不同的預先計算的結構來幫助他們的選擇。對于負采樣使用的累積分布表,這非常簡單:

m.make_cum_table(m.wv)

如果這些內部結構與您現有的操作同步正確更新,則模型可能處于一致的狀態以進行進一步的訓練。(但請注意:這些結構在即將發布的版本中發生了很大變化gensim-4.0.0,因此在升級時任何自定義篡改都需要更新。)

另一項效率說明:np.delete()每次調用該操作時,該操作都會創建一個新數組,即幸存數組的完整大小,并復制舊值。因此,使用它從非常大的原始數組中一次刪除多行可能需要大量冗余分配/復制/垃圾收集。您也許可以在最后調用它一次,并列出要刪除的所有索引。

但實際上:更簡單、更有根據的方法,也可能產生明顯更好的連續可比向量,是在可能的情況下或發生大量變化時使用所有當前數據進行重新訓練。


查看完整回答
反對 回復 2023-08-08
  • 1 回答
  • 0 關注
  • 177 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號