使用gensim和预训练的word2vec模型管理KeyError

时间:2019-04-15 16:45:59

标签: python nlp gensim

我使用wang2vec(https://github.com/wlin12/wang2vec)对单词嵌入进行了预训练,并通过gensim将其加载到python中。当我试图获取某些单词不在词汇表中的向量时,我显然得到:

KeyError: "word 'kjklk' not in vocabulary"

因此,我考虑过要在词汇表中添加一个项以映射整个(非词汇表)单词,比方说<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参数。

1 个答案:

答案 0 :(得分:1)

添加一个合成'<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字典,但是可能会对其他代码产生副作用。