第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

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

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

當(dāng)年話下 2023-08-08 16:21:13
我有一個從項目-項目圖構(gòu)建的“語料庫”,這意味著每個句子都是一個圖行走路徑,每個單詞都是一個項目。我想在語料庫上訓(xùn)練 word2vec 模型以獲得項目的嵌入向量。該圖每天都會更新,因此 word2vec 模型會以增加的方式(使用Word2Vec.save()和Word2Vec.load())進(jìn)行訓(xùn)練,以不斷更新項目的向量。與文字不同,我的語料庫中的項目有其生命周期,并且每天都會添加新項目。為了防止模型大小不斷增長,我需要刪除達(dá)到其生命周期的項目,同時保持模型可訓(xùn)練。我想出了下面的代碼,但我不確定它是否正確和正確: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)刪除和增加訓(xùn)練后,m.wv.index2word和m.wv.vectors仍然元素對應(yīng)嗎?上面的代碼有副作用嗎?如果我的方法不好,有人可以給我一個例子來展示如何正確刪除舊的“單詞”并保持模型可訓(xùn)練嗎?
查看完整描述

1 回答

?
函數(shù)式編程

TA貢獻(xiàn)1807條經(jīng)驗 獲得超9個贊

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

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

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

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

OTOH,如果您認(rèn)為需要保持這種增量更新,即使知道注意事項,您也可以修補(bǔ)模型結(jié)構(gòu)以保留舊模型中盡可能多的合理內(nèi)容并繼續(xù)訓(xùn)練。

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

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

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

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

m.make_cum_table(m.wv)

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

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

但實際上:更簡單、更有根據(jù)的方法,也可能產(chǎn)生明顯更好的連續(xù)可比向量,是在可能的情況下或發(fā)生大量變化時使用所有當(dāng)前數(shù)據(jù)進(jìn)行重新訓(xùn)練。


查看完整回答
反對 回復(fù) 2023-08-08
  • 1 回答
  • 0 關(guān)注
  • 194 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號