使用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
相关产品推荐
相关产品推荐

