我使用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'
等缺席密钥提供关键错误。
没有内置支持添加任何此类“全能”映射。通常,忽略未知令牌比使用某些插件值(例如零向量或随机向量)更好。
如果你想为缺席密钥做一些不同的事情,那么通过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
字典,但可能会对其他代码产生副作用。