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()
每次調用該操作時,該操作都會創建一個新數組,即幸存數組的完整大小,并復制舊值。因此,使用它從非常大的原始數組中一次刪除多行可能需要大量冗余分配/復制/垃圾收集。您也許可以在最后調用它一次,并列出要刪除的所有索引。
但實際上:更簡單、更有根據的方法,也可能產生明顯更好的連續可比向量,是在可能的情況下或發生大量變化時使用所有當前數據進行重新訓練。
添加回答
舉報