余弦相似度结果存入字典丢失676键值对,求原因与解决提示
问题根源:字典键的唯一性
你遇到的问题本质是字典的键必须是唯一的——当两个不同的向量对计算出相同的余弦相似度值时,后面的update()操作会直接覆盖掉之前用这个值作为键的条目,这就是为什么字典条目数比列表少了676条(说不准你的向量对里刚好有676组重复的余弦值呢😉)。
举个极简例子就能看明白:
test_dict = {} test_dict.update({0.5: ["a", "b"]}) test_dict.update({0.5: ["c", "d"]}) print(test_dict) # 输出: {0.5: ['c', 'd']}
第二次update直接把第一次的键0.5对应的值覆盖了,字典里永远只会保留最后一次存入的那个值。
解决方案
根据你的实际需求,有两种常见的处理方式:
1. 改用唯一标识作为字典键(推荐)
如果你需要保留所有向量对的相似度数据,应该用不会重复的键,比如把o_key和r_key组合成元组作为键,余弦值作为对应的值:
dict_of_sims.update({(o_key, r_key): cosine})
这样每个向量对都有唯一的键,不会出现覆盖丢失的情况,字典长度也会和列表完全一致。
2. 把值改为列表,存储相同余弦值的所有向量对
如果你的需求是按余弦值分组,把所有计算出该值的向量对都存起来,那可以这样修改逻辑:
# 先检查键是否存在,不存在就创建空列表 if cosine in dict_of_sims: dict_of_sims[cosine].append([o_key, r_key]) else: dict_of_sims[cosine] = [[o_key, r_key]]
这样相同余弦值对应的所有向量对都会被保留,不会被后续的重复值覆盖。
快速验证问题
你可以用下面的代码快速验证重复值的数量,应该正好等于你丢失的条目数:
from collections import Counter counts = Counter(cosine_sim) duplicate_count = sum(v-1 for v in counts.values()) print(duplicate_count) # 输出应该是676,和你丢失的条目数一致
内容的提问来源于stack exchange,提问作者dumbchild
相关产品推荐
相关产品推荐

