智能信息检索——向量相似度的算法实现(可实现不同权重机制的查询)


《信息检索导论》部分实验python实现汇总请进入此博客查看。

1.实验目的

通过实验,使学生掌握向量相似度的基本实现方法。

2.实验任务与要求

向量空间模型是信息检索中最重要的形式化模型之一,向量相似度是对向量空间模型评分的重要依据。本实验需要编程实现向量相似度的基本算法实现。

3.实验说明书

⑴功能描述

用户输入查询(如 “best car insurance”),文档(如“car insurance auto insurance”),文档总数N的值(如1000000),文档中每个词的文档频率df以及权重机制,可以输出向量相似度的值。

⑵概要设计

分为权重计算模块与结果展示模块两个功能模块。

⑶详细设计

  • 总体流程图

图1 总体流程图

  • 权重计算模块

图2 权重计算模块

  • 结果展示模块

图3结果展示模块

⑷代码实现

  • 词项频率计算
def tf(D, D1):
    l = len(D)
    tf = np.zeros(l)
    for i in range(l):
        tf[i] = D1.count(D[i])
    return tf
  • 对数词频计算
def wf(tf, flag):
    wf = tf.copy()
    l = len(tf)
    if flag == 'l':
        for i in range(l):
            wf[i] = 1 + round(log(tf[i], 10), 2) if tf[i] != 0 else 0
    elif flag == 'a':
        maxt = max(tf)
        for i in range(l):
            wf[i] = 0.5 + 0.5*tf[i]/maxt
    elif flag == 'b':
        for i in range(l):
            wf[i] = 1 if tf[i] > 0 else 0
    return wf
  • 逆文档频率计算
def idf(N, df, flag):
    l = len(df)
    idf = [1]*l
    if flag == 't':
       for i in range(l):
           idf[i] = round(log(N/df[i], 10), 1)
    return idf
  • 词项权重计算
def Wtq(wf, idf, flag):
    Wtq = np.array(wf)*np.array(idf)
    sq = pow(sum(Wtq*Wtq), 0.5)
    if flag == 'c':
        for i in range(len(Wtq)):
            Wtq[i] = round(Wtq[i]/sq, 2)
    return Wtq
  • 去除数字尾部无用的0
    rz 函数用于去除计算结果中无用的0,如计算得到的结果为0.0,通过该函数处理为0,该函数输入和输出的数据格式为数值型列表。
def rz(ls):
    l = len(ls)
    ls1 = []
    for i in range(l):
        a = ls[i]
        ls1.append([str(a), int(a)][int(a) == a])
    return ls1
  • 代码补全
import prettytable as pt
import numpy as np
from math import log
import warnings

warnings.filterwarnings("ignore")

    
I = input('请输入查询(用空格分割):')
D1 = input('请输入文档(用空格分割):')
N = int(input('请输入文档总数:'))
D = list(set((D1 + ' ' + I).split(' ')))
l = len(D)
df = [0]*l
for i in range(l):
    df[i] = int(input('请输入' + D[i] + '的文档频率df:'))
flags = input('请输入权重机制:').split('.')

#I = 'best car insurance'
#D1, N = 'car insurance auto insurance, 1000000'.split(',')
#N = int(N)
#df = list(map(int, '1000, 10000, 5000, 50000'.split(',')))
#D = list(set((D1 + ' ' + I).split(' ')))
#flags = 'nnc.ltn'.split('.')

flagd = [i for i in flags[0]]
flagi = [i for i in flags[1]]
tb = pt.PrettyTable()
itf = tf(D, I)
iwf = wf(itf, flagi[0])
iidf = idf(N, df, flagi[1])
iWtq = Wtq(iwf, iidf, flagi[2])
tb.add_column('word', D)
tb.add_column('I tf', rz(itf))
tb.add_column('I wf', rz(iwf))
tb.add_column('I df', rz(df))
tb.add_column('I idf', rz(iidf))
tb.add_column('I Wtq', rz(iWtq))

dtf = tf(D, D1)
dwf = wf(dtf, flagd[0])
didf = idf(N, df, flagd[1])
dWtq = Wtq(dwf, didf, flagd[2])
tb.add_column('D tf', rz(dtf))
tb.add_column('D wf', rz(dwf))
tb.add_column('D Wtq', rz(dWtq))
neiji = np.array(iWtq)*np.array(dWtq)
tb.add_column('IP', rz(neiji))
tb.align = 'l'
print('\n+' + '-'*25 + 'I表示查询, D表示文档, IP为内积' + '-'*25 + '+')
print(tb)
score = sum(neiji)
print('相似度为:' + str(score))

tb = pt.PrettyTable()创建了结果显示的容器,通过tb.add_column 方法添加列,该过程调用了prettytable 库,用于python中的表格化显示。

⑸亮点

  1. 将计算结果表格化显示,使得结果更加清晰明了;
  2. 加入了权重选择机制,并设置了一些常用的权重计算方法,给了用户更多的选择。

4.实验成果

运行程序,根据提示进行输入,设置权重机制为nnc.ltn,得到结果如下图。

图4 权重机制为nnc.ltn时结果

由图可知权重机制为nnc.ltn时相似度为3.28,设置权重机制为lnc.atn,运行程序得到结果如下图。

图5 权重机制为lnc.atn时结果

5.程序调试过程

注释掉内容为调试过程中代码,预设相关参数,设置权重机制为nnc.ltn,得到结果如下:

图6 调试过程

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lazyn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值