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

余弦相似度结果存入字典丢失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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 18:27:51