如何获取字典中所有词对?Python向量点积计算异常排查
Python向量点积词对生成问题解决
问题回顾
我正在Python中计算两个向量的点积,最终目的是计算余弦相似度。在计算点积时,我创建了一个单独的字典dot_products来存储每对单词的点积,以('danced', 'sang')为例。这两个词都是vectors字典中的键,但当我尝试获取vectors字典中的所有词对时,('danced', 'sang')这一对似乎没有出现在dot_products字典中。我在获取所有可能的词对时是不是哪里出错了?我觉得应该要用嵌套循环来实现,对吗?
正确的词对生成方式
1. 生成有序词对(含反向对)
如果需要保留('danced', 'sang')和('sang', 'danced')这类双向词对,直接用两层嵌套循环遍历所有键即可:
vectors = {'danced': [1,2,3], 'sang': [4,5,6], ...} # 你的向量字典 dot_products = {} # 两层嵌套循环遍历所有词对 for word1 in vectors: for word2 in vectors: # 计算两个向量的点积 dot_product = sum(a * b for a, b in zip(vectors[word1], vectors[word2])) dot_products[(word1, word2)] = dot_product
2. 生成无序词对(仅保留单向)
如果只需要('danced', 'sang')这类不重复的单向词对,可以用itertools.combinations来简化代码,避免重复计算:
from itertools import combinations vectors = {'danced': [1,2,3], 'sang': [4,5,6], ...} dot_products = {} # 生成所有不重复的两字词对 for word1, word2 in combinations(vectors.keys(), 2): dot_product = sum(a * b for a, b in zip(vectors[word1], vectors[word2])) dot_products[(word1, word2)] = dot_product # 如果需要同时存入反向对,添加下面这行 # dot_products[(word2, word1)] = dot_product
排查错误点
- 检查循环逻辑:如果你的嵌套循环里加了跳过相同单词的判断(比如
if word1 == word2: continue),那没问题,但如果有其他不合理的条件,可能会过滤掉目标词对; - 核对拼写:确认
vectors字典里的键'danced'、'sang'和你查询的拼写完全一致(比如大小写、是否有空格); - 向量长度:如果两个向量长度不一致,
zip会截断到较短的长度,但这不会导致词对不存入字典,只会影响点积结果。
内容的提问来源于stack exchange,提问作者Kevin Liao
相关产品推荐
相关产品推荐

