如何解决Gensim中similarity方法返回NaN值的问题?

问题现象描述

在使用Gensim计算文本相似度时,开发者经常会遇到similarity方法返回NaN(Not a Number)的特殊情况。这种异常通常发生在以下场景:

  • 计算两个零向量的相似度时
  • 其中一个向量包含非数值数据时
  • 词向量模型未正确加载时

核心原因分析

通过分析Gensim源码发现,similarity方法底层依赖余弦相似度计算,其数学公式为:

cosθ = (A·B) / (||A|| * ||B||)

当出现以下情况时会导致分母为零:

  1. 输入向量包含全零值(零向量)
  2. 预处理阶段产生空文档
  3. 词向量维度不匹配

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)词汇
  • 设置最小文档长度阈值

最佳实践建议

推荐采用防御性编程策略组合解决方案:

  1. 在数据预处理阶段进行向量有效性检查
  2. 实现相似度计算的fallback机制
  3. 记录异常输入样本用于模型优化