当前位置: 首页 > news >正文

信息检索与数据挖掘 | 【实验】检索评价指标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

相关文章:

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

文章目录 &#x1f4da;实验内容&#x1f4da;知识梳理&#x1f4da;实验步骤&#x1f407;前情提要&#x1f407;MAP评价指标函数&#x1f407;MRR 评价指标函数&#x1f407;NDCG评价指标函数&#x1f407;调试结果 &#x1f4da;实验内容 实现以下指标评价&#xff0c;并对…...

读书笔记:彼得·德鲁克《认识管理》第24章 管理岗位的设计与内容

一、章节内容概述 管理岗位应该始终基于必要的任务&#xff0c;应该是一份实实在在的工作&#xff0c;为企业的整体目标做出可见的(如果不是可衡量的话)贡献&#xff0c;还应该具有尽可能广泛的权威和范围。管理者应该接受绩效目标而不是上级领导 的指导和控制。在设计管理岗位…...

某60区块链安全之51%攻击实战学习记录

区块链安全 文章目录 区块链安全51%攻击实战实验目的实验环境实验工具实验原理攻击过程 51%攻击实战 实验目的 1.理解并掌握区块链基本概念及区块链原理 2.理解区块链分又问题 3.理解掌握区块链51%算力攻击原理与利用 4.找到题目漏洞进行分析并形成利用 实验环境 1.Ubuntu1…...

为什么原生IP可以降低Google play账号关联风险?企业号解决8.3/10.3账号关联问题?

在Google paly应用上架的过程中&#xff0c;相信大多数开发者都遇到过开发者账号因为关联问题&#xff0c;导致应用包被拒审和封号的情况。 而众所周知&#xff0c;开发者账号注册或登录的IP地址及设备是造成账号关联的重要因素之一。酷鸟云最新上线的原生IP能有效降低账号因I…...

排列组合C(n,m)和A(n,m)理解及代码实现

排列组合C(n,m)和A(n,m)理解及代码实现-CSDN博客...

EasyExcel导入从第几行开始

//获得工作簿 read EasyExcel.read(inputStream, Student.class, listener); //获得工作表 又两种形形式可以通过下标也可以通过名字2003Excel不支持名字 ExcelReaderSheetBuilder sheet read.sheet(); sheet.headRowNumber(2);...

均匀光源积分球的应用领域有哪些

均匀光源积分球的主要作用是收集光线&#xff0c;并将其用作一个散射光源或用于测量。它可以将光线经过积分球内部的均匀分布后射出&#xff0c;因此积分球也可以当作一个光强衰减器。同时&#xff0c;积分球可以实现均匀的朗伯体漫散射光源输出&#xff0c;整个输出口表面的亮…...

【LeetCode】每日一题 2023_11_18 数位和相等数对的最大和(模拟/哈希)

文章目录 刷题前唠嗑题目&#xff1a;数位和相等数对的最大和题目描述代码与解题思路思考解法偷看大佬题解结语 刷题前唠嗑 LeetCode? 启动&#xff01;&#xff01;&#xff01; 本月已经过半了&#xff0c;每日一题的全勤近在咫尺~ 题目&#xff1a;数位和相等数对的最大和…...

【喵叔闲扯】--迪米特法则

迪米特法则&#xff0c;也称为最少知识原则&#xff08;Law of Demeter&#xff09;&#xff0c;是面向对象设计中的一个原则&#xff0c;旨在降低对象之间的耦合性&#xff0c;提高系统的可维护性和可扩展性。该原则强调一个类不应该直接与其它不相关的类相互交互&#xff0c;…...

企业视频数字人有哪些应用场景

来做个数字人吧&#xff0c;帮我干点活吧。 国内的一些数字人&#xff1a; 腾讯智影 腾讯智影数字人是一种基于人工智能技术的数字人物形象&#xff0c;具有逼真的外观、语音和行为表现&#xff0c;可以应用于各种场景&#xff0c;如新闻播报、文娱推介、营销、教育等。 幻…...

LoRa模块空中唤醒功能原理和物联网应用

LoRa模块是一种广泛应用于物联网领域的无线通信模块&#xff0c;支持低功耗、远距离和低成本的无线通信。 其空中唤醒功能是一项重要的应用&#xff0c;可以实现设备的自动唤醒&#xff0c;从而在没有人工干预的情况下实现设备的远程监控和控制。 LoRa模块空中唤醒功能的原理…...

spring中的DI

【知识要点】 控制反转&#xff08;IOC&#xff09;将对象的创建权限交给第三方模块完成&#xff0c;第三方模块需要将创建好的对象&#xff0c;以某种合适的方式交给引用对象去使用&#xff0c;这个过程称为依赖注入&#xff08;DI&#xff09;。如&#xff1a;A对象如果需要…...

gpt-4-vision-preview 识图

这些图片都是流行动画角色的插图。 第一张图片中的角色是一块穿着棕色方形裤子、红领带和白色衬衫的海绵&#xff0c;它站立着并露出开心的笑容。该角色在一个蓝色的背景前&#xff0c;显得非常兴奋和活泼。 第二张图片展示的是一只灰色的小老鼠&#xff0c;表情开心&#xf…...

Spring Framework 6.1 正式发布

Spring Framework 6.1.0 现已从 Maven Central 正式发布&#xff01;6.1 一代有几个关键主题&#xff1a; 拥抱 JDK 21 LTS虚拟线程&#xff08;Project Loom&#xff09;JVM 检查点恢复&#xff08;项目 CRaC&#xff09;重新审视资源生命周期管理重新审视数据绑定和验证新的…...

SystemVerilog学习 (11)——覆盖率

目录 一、概述 二、覆盖率的种类 1、概述 2、分类 三、代码覆盖率 四、功能覆盖率 五、从功能描述到覆盖率 一、概述 “验证如果没有量化&#xff0c;那么就意味着没有尽头。” 伴随着复杂SoC系统的验证难度系数成倍增加&#xff0c;无论是定向测试还是随机测试&#xff…...

jQuery,解决命名冲突的问题

使用noConflict(true)&#xff0c;把$和jQuery名字都给别人 <body><script>var $ zanvar jQuery lan</script><script src"./jquery.js"></script><script>console.log(jQuery, 11111); // 打印jquery函数console.log($, 222…...

为什么C++标准库中atomic shared_ptr不是lockfree实现?

为什么C标准库中atomic shared_ptr不是lockfree实现&#xff1f; 把 shared_ptr 做成 lock_free&#xff0c;应该是没有技术上的可行性。shared_ptr 比一个指针要大不少&#xff1a;最近很多小伙伴找我&#xff0c;说想要一些C的资料&#xff0c;然后我根据自己从业十年经验&am…...

Python基础入门例程58-NP58 找到HR(循环语句)

最近的博文: Python基础入门例程57-NP57 格式化清单(循环语句)-CSDN博客 Python基础入门例程56-NP56 列表解析(循环语句)-CSDN博客 Python基础入门例程55-NP55 2的次方数(循环语句)-CSDN博客 目录 最近的博文: 描述...

航天联志Aisino-AISINO26081R服务器通过调BIOS用U盘重新做系统(windows系统通用)

产品名称:航天联志Aisino系列服务器 产品型号:AISINO26081R CPU架构&#xff1a;Intel 的CPU&#xff0c;所以支持Windows Server all 和Linux系统&#xff08;重装完系统可以用某60驱动管家更新所有硬件驱动&#xff09; 操作系统&#xff1a;本次我安装的服务器系统为Serv…...

windows 10 更新永久关闭

1 winR 输入&#xff1a;services.msc 编辑&#xff1a; 关闭&#xff1a;...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...