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

问题描述 投票:0回答:1

我使用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参数。

python nlp gensim
1个回答
1
投票

添加一个合成的'<OOV>'令牌只会让你查找该令牌,如model['<OOV>']。该模型仍会为'kjklk'等缺席密钥提供关键错误。

没有内置支持添加任何此类“全能”映射。通常,忽略未知令牌比使用某些插件值(例如零向量或随机向量)更好。

如果你想为缺席密钥做一些不同的事情,那么通过in关键字显式检查密钥是否存在,这在Python中是相当惯用的。例如:

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字典,但可能会对其他代码产生副作用。

© www.soinside.com 2019 - 2024. All rights reserved.