You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用spaCy与pandas时出现重复结果及相似度异常问题求助

问题分析与解决方案

异常相似度(dust与yellow得1.0)的原因

你在函数中传入的是大写单词(如'DUST'、'YELLOW'),而en_core_web_md模型的预训练词汇表以小写形式为主,未登录的大写单词会被分配零向量。两个零向量的余弦相似度为1.0,因此出现异常结果。而你测试时用的是小写单词,这些在词汇表中有有效预训练向量,所以相似度计算正常。

矩阵重复行的原因

多个大写未登录词(OOV)的向量均为零向量,它们与其他单词的相似度计算结果完全一致:

  • 和其他OOV单词的相似度为1.0
  • 和非OOV单词的相似度为0
    这些行的数值完全相同,因此看起来像是重复行。

解决方案

1. 统一单词大小写

处理前将所有单词转为小写,确保与模型词汇表匹配:

import spacy
import pandas as pd

nlp = spacy.load("en_core_web_md")

def synonym_detector(words):
    # 统一转为小写
    lower_words = [word.lower() for word in words]
    word_matrix = pd.DataFrame(columns=lower_words, index=lower_words)
    vectors = [nlp(word) for word in lower_words]
    
    for i in range(len(vectors)):
        # 填充对角线(自身相似度为1)
        word_matrix.loc[lower_words[i], lower_words[i]] = 1.0
        for j in range(i+1, len(vectors)):
            similarity = vectors[i].similarity(vectors[j])
            # 对称填充上三角和下三角
            word_matrix.loc[lower_words[i], lower_words[j]] = similarity
            word_matrix.loc[lower_words[j], lower_words[i]] = similarity
    
    return word_matrix

2. 优化矩阵完整性

原代码仅填充上三角区域,导致下三角和对角线为NaN。修改后填充对角线(自身相似度设为1)并对称填充下三角,得到完整的相似度矩阵。

3. 处理OOV单词

如果转小写后仍有未登录词,可尝试:

  • 使用更大的预训练模型(如en_core_web_lg,词汇量更大)
  • 自定义单词向量
  • 过滤掉无法获取有效向量的单词

验证测试

运行以下代码可得到正常的相似度结果:

dust = nlp('dust')
yellow = nlp('yellow')
print(dust.similarity(yellow))  # 输出约0.1左右的合理值

内容的提问来源于stack exchange,提问作者Sendagaijin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 14:43:26