Python代码出现ZeroDivisionError错误,求余弦相似度计算修复方案
修复余弦相似度计算的ZeroDivisionError错误
错误原因
你的代码把余弦相似度的计算逻辑放在了for循环内部,第一次循环时:
sums1= 1*1 = 1sums3= 0*0 = 0
此时计算分母sqrt(sums1)*sqrt(sums3)会得到1*0=0,触发ZeroDivisionError。而且余弦相似度需要遍历完所有向量元素,计算完整的分子(点积)和分母(两个向量模长的乘积)后再进行除法运算。
修复后的代码
from math import sqrt S1 = [1,0,0,0,1,0,0,2] S3 = [0,1,1,2,0,1,2,0] dot_product = 0 s1_norm_sq = 0 s3_norm_sq = 0 # 遍历所有元素计算点积和模长平方 for i, j in zip(S1, S3): s1_norm_sq += i * i s3_norm_sq += j * j dot_product += i * j # 计算模长并处理可能的零向量情况 s1_norm = sqrt(s1_norm_sq) s3_norm = sqrt(s3_norm_sq) if s1_norm == 0 or s3_norm == 0: # 若任一向量为全零向量,余弦相似度无意义(此处定义为0) cosine_similarity = 0.0 else: cosine_similarity = dot_product / (s1_norm * s3_norm) print(cosine_similarity)
说明
- 重命名变量为
dot_product、s1_norm_sq、s3_norm_sq,提升代码语义可读性。 - 将相似度计算和打印逻辑移到循环外部,确保得到完整的点积与模长后再运算。
- 增加零向量判断,避免因全零向量再次触发除零错误,让代码更健壮。
内容的提问来源于stack exchange,提问作者John butler
相关产品推荐
相关产品推荐

