信息检索与数据挖掘 | 【实验】检索评价指标MAP、MRR、NDCG

文章目录

  • 📚实验内容
  • 📚知识梳理
  • 📚实验步骤
    • 🐇前情提要
    • 🐇MAP评价指标函数
    • 🐇MRR 评价指标函数
    • 🐇NDCG评价指标函数
    • 🐇调试结果

📚实验内容

  • 实现以下指标评价,并对Experiment2的检索结果进行评价
    • Mean Average Precision (MAP)
    • Mean Reciprocal Rank (MRR)
    • Normalized Discounted Cumulative Gain (NDCG)

📚知识梳理

  • MAP(Mean Average Precision):平均准确率,是衡量检索结果排序质量的指标。
    • 计算方式是对于每个查询,计算被正确检索的文档的平均精确率,再对所有查询的平均值取均值。
    • 存在意义是衡量对于一个查询,检索结果的平均精确率,适用于评估排序结果精确度的情况。

  • MRR(Mean Reciprocal Rank):平均倒数排名,是衡量检索结果排序质量的指标。
    • 计算方式是对于每个查询,计算被正确检索的文档的最高排名的倒数的平均值,再对所有查询的平均值取均值。
    • 存在意义是衡量对于一个查询,检索结果的排名,适用于评估检索结果排序效果好坏的情况。

  • NDCG(Normalized Discounted Cumulative Gain):归一化折损累积增益,是衡量检索结果排序质量的指标。
    • 计算方式是对于每个查询,对每个被检索到的结果计算其相对于理想排序的增益值,然后对这些相对增益值进行加权求和,再除以理想排序的增益值
    • 存在意义是衡量对于一个查询,检索结果的绝对和相对排序质量,适用于评估排序结果的质量与排名准确度的情况。

  • 这三个指标各有侧重,根据不同的评估需要和数据特征选择合适的指标。例如,对于特定领域的文档检索,可能更关注排名准确度和检索结果的可靠度,因此MRR和NDCG可能比较适合。对于广泛领域的文档检索,可能更关注精确度,因此MAP比较适合。

📚实验步骤

🐇前情提要

  • 本次实验是补充式实验,先给出了qrels_dicttest_dict
  • 构建qrels_dict,根据 qrel.txt 中的 query_id 和对应库中真正相关的 doc_id 的信息构建 qrels_dict={query_id:{doc_id:gain,doc_id:gain,……}}。 遍历文件中的每一行,完成遍历后,返回 qrels_dict:
    • 使用 split(’ ') 将行按空格分隔成列表 ele。
    • 检查 ele[0](query_id)是否已经在 qrels_dict 中。如果不在,将其作为新的查询ID键添加到 qrels_dict 中,并将其对应的值设置为空字典。
    • 检查 ele[3](gain)是否大于0。如果是,将 ele[2](doc_id)作为新的相关文档ID键添加到查询ID键对应的值中,并将其对应的值设置为 ele[3] 的整数形式。
    def generate_tweetid_gain(file_name):qrels_dict = {}with open(file_name, 'r', errors='ignore') as f:for line in f:# 按空格划分ele = line.strip().split(' ')# ele[0]中存放的是query_idif ele[0] not in qrels_dict:qrels_dict[ele[0]] = {}# ele[3]存放的是gain,ele[2]存放的是doc_id# 将gain大于0的存入if int(ele[3]) > 0:qrels_dict[ele[0]][ele[2]] = int(ele[3])return qrels_dict
    
  • 构建test_dict,根据 result.txt 文档中 query 和对应的检索到的 doc 文档对应信息构建 test_dict={query_id:{doc_id,doc_id,……}}。遍历文件中的每一行,完成遍历后,返回 test_dict:
    • 使用 split(’ ') 将行按空格分隔成列表 ele。
    • 检查 ele[0](query_id)是否已经在 test_dict 中。如果不在,将其作为新的查询ID键添加到 test_dict 中,并将其对应的值设置为一个空列表。
    • ele[1](doc_id)添加到查询ID键对应的列表中。
    def read_tweetid_test(file_name):# 输入格式为:query_id doc_idtest_dict = {}with open(file_name, 'r', errors='ignore') as f:for line in f:# 按空格划分ele = line.strip().split(' ')# 这里的ele[0]是query_id,ele[1]是doc_idif ele[0] not in test_dict:test_dict[ele[0]] = []test_dict[ele[0]].append(ele[1])return test_dict
    

🐇MAP评价指标函数

  1. 获取检索到的(test_dict)相关文档信息

  2. 获取库中(qrels_dict)所有相关文档的信息

  3. 进行 P@K评估计算

    在这里插入图片描述
    在这里插入图片描述

  4. 进行 AP 评估计算
    在这里插入图片描述

  5. 进行 MAP 均值评估计算。
    在这里插入图片描述

    在这里插入图片描述


def MAP_eval(qrels_dict, test_dict, k = 100):# MAP是对AP评价结果进行平均,AP基于P(Precision@K)评估AP_result = [] for query in qrels_dict:# 获取相关信息test_result = test_dict[query]              # 检索文档true_list = set(qrels_dict[query].keys())   # 相关文档use_length = min(k, len(test_result))       # 用不超过100条文档计算if use_length <= 0:print('query:', query, '未找到')return []# 声明变量P_result = [] total = 0    the_true = 0  # P@K 评估for doc_id in test_result[0: use_length]:total += 1if doc_id in true_list:# 如果是相关的the_true += 1P_result.append(the_true / total)# AP评估if P_result:AP = np.sum(P_result) / len(true_list)# print('query:', query, '的AP评估结果:', AP)AP_result.append(AP)else:print('query:', query, ' 就没有相关的┭┮﹏┭┮')AP_result.append(0)# MAP就是AP的平均值return np.mean(AP_result)

🐇MRR 评价指标函数

  1. 获取检索到的(test_dict)相关文档信息

  2. 获取库中(qrels_dict)所有相关文档的信息

  3. 计算排序倒数(第一个相关结果的位置倒数)
    在这里插入图片描述

  4. 进行 RR 评估计算
    在这里插入图片描述

  5. 进行 MRR 均值评估计算。
    在这里插入图片描述
    在这里插入图片描述


def MRR_eval(qrels_dict, test_dict, k = 100):# MRR是对RR评价结果进行平均,RR基于排序倒数RR_result = []for query in qrels_dict:# 获取相关信息test_result = test_dict[query]              # 检索文档true_list = set(qrels_dict[query].keys())   # 相关文档use_length = min(k, len(test_result))       # 用不超过100条文档计算if use_length <= 0:print('query:', query, '未找到')return []# 声明变量R_result = []rank = 0# 计算排序倒数for doc_id in test_result[0: use_length]:rank += 1if doc_id in true_list:R_result.append(1 / rank)break# RR评估if R_result:RR = np.sum(R_result)/1.0# print('query:', query, '的RR评估结果:', RR)RR_result.append(RR)else:print('query:', query, ' 就没有相关的┭┮﹏┭┮') RR_result.append(0)# MRR就是RR的平均值return np.mean(RR_result)

🐇NDCG评价指标函数

  1. 获取检索到的(test_dict)相关文档信息
  2. 获取库中(qrels_dict)所有相关文档的gain(也就是下边的rel)信息
  3. 按gain(rel)倒序排列(理想化,用于计算IDCG)
  4. 先计算出 DCGIDCG,二者相除得到NDCG,取均值后返回。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

def NDCG_eval(qrels_dict, test_dict, k = 100):# NDCG@K = DCG@K / IDCG@K# DCG = rel(1) + sum(rel(i)/log(i))# IDCG就是按rel排序之后的DCGNDCG_result = []for query in qrels_dict:# 获取相关信息                                          test_result = test_dict[query]                       # 检索文档true_list = list(qrels_dict[query].values())         # 相关文档的gain列表true_list = sorted(true_list, reverse=True)          # 按gain(rel)倒序排列use_length = min(k, len(test_result),len(true_list)) # 用不超过100条文档计算if use_length <= 0:print('query:', query, '未找到')return []# 声明变量i = 1DCG = 0.0 IDCG = 0.0# 计算DCG和IDCGrel1 = qrels_dict[query].get(test_result[0], 0)DCG += rel1for doc_id in test_result[1: use_length]:i += 1rel = qrels_dict[query].get(doc_id, 0)DCG += rel / math.log(i, 2)IDCG += true_list[i - 2] / math.log(i, 2)NDCG = DCG / IDCG# print('query:', query, '的NDCG评估结果:', NDCG)NDCG_result.append(NDCG)# 取平均值后返回return np.mean(NDCG_result)

🐇调试结果

在这里插入图片描述


参考博客:信息检索实验3- IR Evaluation

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/191850.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

打印字符(C++)

系列文章目录 进阶的卡莎C++_睡觉觉觉得的博客-CSDN博客数1的个数_睡觉觉觉得的博客-CSDN博客双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客足球联赛积分_睡觉觉觉得的博客-CSDN博客大减价(一级)_睡觉觉觉得的博客-CSDN博客小写字母的判断_睡觉觉觉得的博客-CSDN博客纸币(…

NSSCTF第12页(1)

[FSCTF 2023]细狗2.0 应该是和[HUBUCTF 2022 新生赛]ezsql搞混掉了 点击按钮出现了 发现输入什么回显什么 伪协议也不行 看源代码发现了这个玩意 输入了1;发现了其他回显 ls 发现了两个文件 发现被限制了 不知道是cat还是空格 绕过 直接找吧还是 得到flag [SCTF 2021]loginm…

电商平台api接口对接电商数据平台,获取商品详情页面实时信息须知

随着互联网的发展和普及&#xff0c;电商平台已成为人们日常生活中不可或缺的一部分。而为了保证电商平台的正常运行&#xff0c;平台与开发者之间需要进行数据交互&#xff0c;这便涉及到了电商平台API接口对接的问题。本文将详细介绍电商平台API接口对接的须知事项。 一、了解…

《AI超级个体:ChatGPT与AIGC实战指南 》书籍分享

前言 ChatGPT是一款通用人工智能&#xff08;AI&#xff09;工具&#xff0c;使用过它的人都能感受到它的魅力。AI并不是一个新事物&#xff0c;它在全世界都发展很多年了&#xff0c;但在ChatGPT诞生之前&#xff0c;我们的AI只能算垂直AI&#xff0c;比如AlphaGo&#xff0c…

jenkins分步式构建环境(agent)

rootjenkins:~# netstat -antp|grep 50000 tcp6 0 0 :::50000 ::&#x1f617; LISTEN 5139/java 1.52 安装Jenkins rootubuntu20:~# dpkg -i jenkins_2.414.3_all.deb 配置各种类型的Agent的关键之处在于启动Agent的方式 ◼ JNLP Agent对应着“通过Java Web启动代理”这种方…

【电路笔记】-诺顿定理(Norton‘s Theorem)

诺顿定理&#xff08;Norton’s Theorem&#xff09; 文章目录 诺顿定理&#xff08;Nortons Theorem&#xff09;1、概述与定义2、诺顿模型确定3、一些线性电路的诺顿模型3.1 单电压源3.2 单电流源3.3 多电流/电压源 5、总结 本文是我们上一篇有关戴维南定理的文章的延续。 在…

计算机缺失vcruntime140.dll如何修复?超简单的5个解决方法

在我们日常使用电脑的过程中&#xff0c;可能会遇到各种各样的问题和错误提示。其中&#xff0c;一个比较常见的错误提示就是“vcruntime140.dll丢失”。这个错误通常发生在我们尝试运行某个程序或应用时&#xff0c;系统无法找到或加载所需的vcruntime140.dll文件。 vcruntime…

2021年06月 Scratch(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

一、单选题(共25题,每题2分,共50分) 第1题 小猫位置在舞台中心,点击一次小猫后能前进10步的程序为? A: B: C: D: 答案:B 第2题 快速切换到下一个背景图片应该使用哪个积木? A: B:

Java入门篇 之 继承

本篇碎碎念&#xff1a;最近的课程遇到瓶颈了&#xff0c;看的时候感觉自己会了&#xff0c;但是结束仔细一回顾还是一知半解&#xff0c;一点一点来吧&#xff0c;基础必须要打好(自己给自己好的心里暗示&#xff0c;结局一定是好的) 今日份励志文案:慢慢改变&#xff0c;慢慢…

酷柚易汛ERP-购货订单操作指南

1、应用场景 先下购货订单&#xff0c;收货入库后生成购货单。 2、主要操作 2.1 新增购货订单 打开【购货】-【购货订单】新增购货订单。&#xff08;*为必填项&#xff0c;其他为选填&#xff09; ① 录入供应商&#xff1a;点击供应商字段框的 &#xff0c;在弹框中选择供…

hive和spark-sql中 日期和时间相关函数 测试对比

测试版本&#xff1a; hive 2.3.4 spark 3.1.1 hadoop 2.7.7 1、增加月份 add_months(timestamp date, int months)add_months(timestamp date, bigint months)Return type: timestampusage:add_months(now(),1) 2、增加日期 adddate(timestamp startdate, int days)…

如何判断从本机上传到服务器的文件数据内容是一致的?用md5加密算法!

问题场景 最近在帮导师做横向&#xff0c;我想把整个项目环境放到服务器中&#xff0c;需要把一个很大的数据文件传到服务器&#xff0c;传上去很方便&#xff0c;但是涉及到文件的压缩上传和服务器内解压环节&#xff0c;不是太确定文件在本机和服务器的数据内容是否一致。 解…

由于找不到msvcp140.dll无法继续执行代码有哪些解决方法

msvcp140.dll是Microsoft Visual C 2015 Redistributable的一个组件&#xff0c;它是运行许多Windows应用程序所必需的。当msvcp140.dll丢失或损坏时&#xff0c;可能会导致以下问题&#xff1a; 1. 程序无法启动或崩溃。 2. 系统出现错误提示&#xff0c;如“找不到msvcp140…

开启学历新征程,电大搜题助您轻松获取知识

作为一名电大学者&#xff0c;有肩负着传递真实信息、宣传正面价值的使命&#xff0c;而今天我要向您介绍的是一款非常实用的学习工具——电大搜题微信公众号。通过该平台&#xff0c;您可以获得更多关于浙江开放大学和广播电视大学的学习资源&#xff0c;助您在学习和工作上取…

酷柚易汛ERP- 组装单与拆卸单操作

1、功能介绍 组装单用来处理企业组装等加工业务&#xff0c;拆卸单用来处理企业拆卸等加工业务&#xff0c;支持一对多的产品加工业务。 2、主要操作 2.1 新增组装单 打开【仓库】-【组装单】新增组装单。 录入组合件与子件&#xff0c;单据审核后&#xff0c;系统根据存货…

【Python】Matplotlib-多张图像的显示

一&#xff0c;情景描述 大家在写论文或者实验报告的时候&#xff0c;经常会放多张图片或数据图像在一起形成对比。比如&#xff0c;我现在有一张经过椒盐噪声处理的图像&#xff0c;现在进行三种滤波&#xff0c;分别是均值&#xff0c;高斯&#xff0c;中值滤波&#xff0c;…

面向对象基础(以python语言为例)

1、定义一个类&#xff1b;实例化类的对象&#xff1b;调用类中的方法 #定义一个类 class Student:#类方法&#xff08;即函数&#xff09;def study(self,course_name):print(f学生正在学习{course_name})def play(self):print("xx学生正在玩游戏")#实例化&#xf…

如何在 macOS 中删除 Time Machine 本地快照

看到这个可用82GB&#xff08;458.3MB可清除&#xff09; 顿时感觉清爽&#xff0c;之前的还是可用82GB&#xff08;65GB可清除&#xff09;&#xff0c;安装个xcode都安装不上&#xff0c;费解半天&#xff0c;怎么都解决不了这个问题&#xff0c;就是买磁盘情理软件也解决不了…

Windows上基于Tesseract OCR5.0官方语言库的LSTM字库训练

系列文章目录 Tesseract OCR引擎 文章目录 系列文章目录前言一、LSTM字库训练是什么&#xff1f;二、使用步骤1. 环境准备1.1下载Tesseract 程序并安装1.2下载Tesseract 训练字库1.3下载工具jTessBoxEditor 2. LSTM训练2.1 将要训练的图片(jpg/tif)合并成一个文件2.2 生成box文…

自定义Matplotlib中的颜色映射(cmap)

要自定义Matplotlib中的颜色映射&#xff08;cmap&#xff09;&#xff0c;您可以按照以下步骤进行操作&#xff1a; 导入所需的库&#xff1a; import numpy as np import matplotlib.pyplot as plt from matplotlib.colors import LinearSegmentedColormap创建自定义颜色映…