Gensim FastText调用most_similar报KeyError:词汇不在词表中问题
解决Gensim FastText加载后无法处理词表外词汇的问题
这个问题我之前也碰到过!核心原因是你大概率只保存了FastText的词向量(wv)部分,而没有保存完整的模型——FastText处理词表外词汇(OOV)的关键子词n-gram信息,是存储在完整模型结构里的,单独的词向量文件并不包含这些数据。训练时模型是完整状态,所以能正常分解OOV词汇为子词并计算向量,但加载不完整的模型后,就丢失了子词处理能力,自然会报“词汇不在词表中”的错误。
正确的保存与加载方式
要保留OOV处理能力,必须保存并加载完整的FastText模型,而不是仅保存词向量:
训练后保存完整模型
import gensim # 假设my_sentences是你的训练语料 model = gensim.models.FastText(my_sentences, size=100, window=5, min_count=3, workers=4, sg=1) # 保存完整模型(会生成多个相关文件,不要删除) model.save("my_fasttext_model")加载完整模型并使用
import gensim # 加载完整的FastText模型 loaded_model = gensim.models.FastText.load("my_fasttext_model") # 现在可以正常处理词表外词汇了 loaded_model.wv.most_similar(positive=['iPhone 6'])
避坑提示
- 不要使用
model.wv.save()或model.wv.save_word2vec_format()保存词向量,这两种方式都会丢弃子词信息,导致加载后无法处理OOV。 - 如果之前已经只保存了词向量文件,那没有办法恢复子词数据,只能重新训练并保存完整模型。
内容的提问来源于stack exchange,提问作者Peter T




