使用gensim.Word2Vec处理中文分词时遇KeyError词汇不在词表问题
解决gensim.Word2Vec中的KeyError: word not in vocabulary问题
咱先把问题拆明白:你碰到的这个KeyError,核心原因就是你要查的「一九九八年新年」压根没被模型放进词汇表里——要么是训练语料里根本没出现过这个短语,要么是它出现的次数太少,被你设置的过滤规则干掉了。下面给你一步步排查和解决的办法:
1. 先确认目标短语在训练语料里真的存在
你用LineSentence处理语料,它是按行读取、每行按空格拆分成分词的对吧?那你得先去sentence_all.txt里找找,有没有完全匹配的「一九九八年新年」这个短语——注意是完整的一个分词,不能是「一九九八年」和「新年」分开成两个词的情况,模型会把它们当成完全不同的两个个体。
如果语料里确实没有这个短语,那要么补充包含它的语料重新训练,要么换个语料里有的词来查。
2. 检查是不是被min_count过滤掉了
你初始化模型时设置了min_count=min_count(得确认这个变量的具体数值,比如是5还是10),gensim会自动把训练语料中出现次数少于这个值的词/短语从词汇表踢出去。如果「一九九八年新年」出现次数不够,自然就查不到。
解决办法:
- 先看看模型到底收录了哪些词,跑一行代码:
print(model.wv.vocab.keys()),直接查看所有在词汇表里的内容; - 如果是次数不够,就降低
min_count的值(比如改成1,这样哪怕只出现一次的词也会被保留),然后重新训练模型; - 要是允许的话,给语料里多加点包含这个短语的句子,提升它的出现次数。
3. 排查分词匹配问题
你说语料已经处理成分词列表,但要注意:训练时的分词规则和你现在查询的短语必须完全一致。比如训练语料里写的是「1998年新年」而不是「一九九八年新年」,或者训练时把「一九九八年」和「新年」拆成了两个独立分词,那你查组合后的短语肯定会报错。
解决办法:
- 核对训练语料的分词格式,确保你查询的短语和语料里的分词形式一模一样;
- 如果确实需要查询语料里没有的短语,可以试试用相似词近似,比如
model.wv.most_similar(['一九九八年', '新年']),或者把两个词的向量加起来model['一九九八年'] + model['新年'],不过这只是近似效果,不是精确的短语向量。
小技巧:提前判断避免报错
以后查询前可以先判断短语是否在词汇表里,避免直接索引抛出错误,代码示例:
target_phrase = '一九九八年新年' if target_phrase in model.wv: print(model[target_phrase]) else: print(f"抱歉,短语「{target_phrase}」不在模型的词汇表中")
内容的提问来源于stack exchange,提问作者HWZX
相关产品推荐
相关产品推荐

