余弦相似度,又称为余弦相似性,是通过计算两个向量的夹角余弦值来评估他们的相似度。余弦相似度将向量根据坐标值,绘制到向量空间中,如最常见的二维空间。两个向量的方向重合时夹角余弦取最大值1,当两个向量的方向完全相反夹角余弦取最小值-1,两个方向正交时夹角余弦取值为0,两个向量越相似,余弦相似度越大(接近1)。
计算公式:
算法的不足之处:只能分辨个体在维之间的差异,没法衡量每个维数值的差异
代码实现:
# 提示输入部分
num = 1
d, cts, df = [], [], []
while(1):
daopai = input('请输入词项t在文档c{}中的倒排记录表(用,分隔): '.format(num)).replace(' ', '').split(',')
weight = list(map(float, input('请依次输入倒排记录表的权重(用,分隔): ').replace(' ', '').split(',')))
d += daopai
ld, lw = len(daopai), len(weight)
if ld == lw:
locals()['c' + str(num) + 't'] = {}
for i, j in zip(daopai, weight):
locals()['c' + str(num) + 't'][i] = j
cts.append(locals()['c' + str(num) + 't'])
num += 1
else:
print('输入错误', end = ',')
flag = input('要继续输入吗[y|n]:')
if flag == 'n':
break
d = set(d)
lct = len(cts)
for i in range(lct):
CR = input('请输入文档c{}与查询的上下文相似度: '.format(i + 1))
locals()['CRc' + str(i + 1) + 't'] = {}
locals()['CRc' + str(i + 1) + 't'][float(CR)] = cts[i]
df.append(locals()['CRc' + str(i + 1) + 't'])
# 计算文档得分
max_score = 0
for i in d:
score = 0
for j in df:
CR = list(j.keys())[0]
if i in list(j[CR].keys()) and CR != 0:
score += CR*j[CR][i]
if max_score < score:
max_score = score
index = i
print("\n排名最高的是{}, 其相似度为{}".format(index, round(max_score, 3)))