簡體   English   中英

使用gensim和預訓練的word2vec模型管理KeyError

[英]Manage KeyError with gensim and pretrained word2vec model

我使用wang2vec( https://github.com/wlin12/wang2vec )對單詞嵌入進行了預訓練,然后通過gensim將其加載到python中。 當我試圖獲取某些單詞不在詞匯表中的向量時,我顯然得到:

KeyError: "word 'kjklk' not in vocabulary"

因此,我考慮過要在詞匯表中添加一個項以映射oov(詞匯表之外)的單詞,比如說<OOV> 由於詞匯是Dict格式的,因此我只需添加項目{"<OOV>":0}

但是,我搜索了一個詞匯,

model = gensim.models.KeyedVectors.load_word2vec_format(w2v_ext, binary=False, unicode_errors='ignore')
dict(list(model.vocab.items())[5:6])

輸出是這樣的

{'word': <gensim.models.keyedvectors.Vocab at 0x7fc5aa6007b8>}

因此,是否有辦法將<OOV>令牌添加到通過gensim加載的預訓練單詞嵌入的詞匯表中,並避免KeyError? 我查看了gensim doc,發現了這一點: https ://radimrehurek.com/gensim/models/word2vec.html#gensim.models.word2vec.Word2Vec.build_vocab,但它似乎不適用於update參數。

添加一個合成的'<OOV>'令牌只會讓您查找該令牌,就像model['<OOV>'] 。該模型仍然會為缺少鍵的錯誤提供鍵錯誤,例如'kjklk'

沒有內置支持添加任何此類“全部捕獲”映射。 通常,忽略未知標記比使用某些插入值(例如零向量或隨機向量)更好。

在Python中,通過in關鍵字顯式檢查某個鍵是否存在是相當習慣的,如果您想對不存在的鍵做一些不同的事情。 例如:

vector = model['kjklk'] if 'kjklk' in model else DEFAULT_VECTOR

(值得注意的是, *expr1* if *expr2* else *expr3*推遲對初始expr1的 ,從而避免KeyError 。)

Python還具有defaultdict變體字典,可以為任何未知鍵返回默認值。 看到:

https://docs.python.org/3.7/library/collections.html#collections.defaultdict

如果該行為確實很重要,則可以嘗試用其中之一替換KeyedVectors vocab詞典,但是對其他代碼可能會有副作用。

暫無
暫無

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

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