我使用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参数。
答案 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
字典,但是可能会对其他代码产生副作用。