信息检索第五次实验--利用SIMNOMERGE余弦相似度计算文档得分的算法实现

        余弦相似度,又称为余弦相似性,是通过计算两个向量的夹角余弦值来评估他们的相似度。余弦相似度将向量根据坐标值,绘制到向量空间中,如最常见的二维空间。两个向量的方向重合时夹角余弦取最大值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)))

猜你喜欢

转载自blog.csdn.net/rui_qi_jian_xi/article/details/130419155