问题现象描述
在使用Gensim计算文本相似度时,开发者经常会遇到similarity方法返回NaN(Not a Number)的特殊情况。这种异常通常发生在以下场景:
- 计算两个零向量的相似度时
- 其中一个向量包含非数值数据时
- 词向量模型未正确加载时
核心原因分析
通过分析Gensim源码发现,similarity方法底层依赖余弦相似度计算,其数学公式为:
cosθ = (A·B) / (||A|| * ||B||)
当出现以下情况时会导致分母为零:
- 输入向量包含全零值(零向量)
- 预处理阶段产生空文档
- 词向量维度不匹配
5种解决方案
1. 向量标准化预处理
from gensim.matutils import unitvec normalized_vec = unitvec(raw_vector)
2. 空值检查机制
def safe_similarity(vec1, vec2):
if np.all(vec1 == 0) or np.all(vec2 == 0):
return 0.0 # 自定义默认值
return model.similarity(vec1, vec2)
3. 模型完整性验证
检查词向量模型是否包含目标词汇:
assert word in model.wv.key_to_index, f"{word} not in vocabulary"
4. 相似度计算替代方案
使用scipy的余弦相似度实现:
from scipy.spatial.distance import cosine 1 - cosine(vec1, vec2)
5. 数据清洗流程
- 过滤停用词比例超过80%的文档
- 移除OOV(Out-of-Vocabulary)词汇
- 设置最小文档长度阈值
最佳实践建议
推荐采用防御性编程策略组合解决方案:
- 在数据预处理阶段进行向量有效性检查
- 实现相似度计算的fallback机制
- 记录异常输入样本用于模型优化