信息检索与数据挖掘 | 【实验】检索评价指标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_id
                if 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_id
        test_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_id
                if 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 += 1
            if doc_id in true_list:
                # 如果是相关的
                the_true += 1
                P_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 += 1
            if 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排序之后的DCG
    NDCG_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 = 1
        DCG = 0.0 
        IDCG = 0.0
        # 计算DCG和IDCG
        rel1 = qrels_dict[query].get(test_result[0], 0)
        DCG += rel1
        for doc_id in test_result[1: use_length]:
            i += 1
            rel = 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Acrobat Pro DC 2023 中文版

Acrobat Pro DC 2023是PDF编辑和管理软件&#xff0c;具有以下优点&#xff1a; 更好的安全性&#xff1a;Acrobat Pro DC 2023采用了新的安全功能&#xff0c;包括加密、数字签名等&#xff0c;可以更好地保护PDF文件的安全性。 更高的速度和性能&#xff1a;Acrobat Pro DC …

OpenCV入门——图像视频的加载与展示一些API

文章目录 OpenCV创建显示窗口OpenCV加载显示图片OpenCV保存文件利用OpenCV从摄像头采集视频从多媒体文件中读取视频帧将视频数据录制成多媒体文件OpenCV控制鼠标关于[np.uint8](https://stackoverflow.com/questions/68387192/what-is-np-uint8) OpenCV中的TrackBar控件TrackBa…

Python小白之PyCharm仍然显示“No module named ‘xlwings‘”

Python小白之“没有名称为xlwings‘的模块”-CSDN博客文章浏览阅读8次。cmd 打开命令行&#xff0c;输入python出现>>>的提示格&#xff0c;输入import xlwings 回车&#xff0c;正常报错&#xff1a;No module named xlwings。输入python 回车后&#xff0c;再输入im…

黑客帝国中的黑客如何隐藏自己的IP,你不可不知的正向代理和反向代理

文章目录 前言正向代理常用使用场景VPN动态 IP 代理隐藏客户端 IP 反向代理使用场景堡垒机nginx 负载均衡 动态 IP 代理实现分类按匿名分类按成本分类按协议分类 原理nodeJs 简单实现 总结个人简介 前言 hello&#xff0c;大家好&#xff0c;我是 Lorin &#xff0c;今天给大家…

c# 字符串转化成语音合成,System.Speech

C# 语音合成可以使用 System.Speech.Synthesis 命名空间中的 SpeechSynthesizer 类来实现。SpeechSynthesizer 类提供了一系列方法和属性&#xff0c;可以用来控制语音合成的过程&#xff0c;包括设置语音、音调、语速等。 下面是一个简单的示例&#xff0c;用来演示如何使用 …

SpringBoot写接口小记 以及 几个层的功能总结(自用 勿喷)

目录 Entity层&#xff1a;实体层 数据库在项目中的类 Mapper层&#xff1a; 持久层 主要与数据库进行交互 Service层&#xff1a;业务层 控制业务 Controller层&#xff1a;控制层 控制业务逻辑 Entity层&#xff1a;实体层 数据库在项目中的类 Entity层是实体层&#xff…

WP光电信息学院2023年网络安全季度挑战赛-测试赛

签个到就跑WP Misc MISC-没爱了&#xff0c;下一个 下载附件压缩包解压之后&#xff0c;获得一个流量包文件 使用wireShark打开流量包&#xff0c;Ctrl F 搜索flag{即可获得flag flag{Good_b0y_W3ll_Done}MISC-送你一朵小花花 下载附件压缩包解压之后&#xff0c;获得一…

模电的100个公式

文章目录 1.晶体二极管的伏安特性2.二极管的钳位电路&#xff08;τRC&#xff0c;放电时间等于5τ&#xff09;3.晶体三极管4.绝缘型FET场效应管&#xff08;MOS管&#xff0c;4种&#xff0c;P/N沟道&#xff0c;增强型/耗尽型&#xff09;CMOS和VMOSMOS管的特性曲线&#xf…

SQL练习---619.出现一次的最大数字

题目 分析 首先确定表的来源只有一个表数字表&#xff0c;再者判断他是不是单一数字&#xff0c;&#xff08;想到的是直接按数字分组&#xff0c;通过count函数来判断是否为单一数子&#xff09;&#xff0c;然后求最大值。 题解 select Max(num) as num from MyNumbers wh…

服务号转订阅号如何操作

服务号和订阅号有什么区别&#xff1f;服务号转为订阅号有哪些作用&#xff1f;一、文章推送的篇数不同服务号在文章的推送篇数上是有所限制的&#xff08;每月推4次&#xff09;订阅号则每天可推送一篇文章。二、定义不同服务号主要是为关注用户提供服务使用的&#xff1b;订阅…

Class 7: MMDetection代码课

Class7&#xff1a; MMDetection代码课 文章目录 Class7&#xff1a; MMDetection代码课[toc]依赖&安装依赖 数据集准备RTMDetConfig模型配置数据集和评测器配置训练和测试的配置优化相关配置 训练测试以及推理可视化分析特征图可视化Grad-Based CAM 可视化 检测新趋势总结…

千兆光模块和万兆光模块在网络安全中的重要性

千兆光模块和万兆光模块是网络通信中不可或缺的基础设施&#xff0c;它们的性能和稳定性对于网络安全至关重要。在网络安全意识不断提高的今天&#xff0c;光模块的重要性也越来越被人们所重视。 一、 光模块的作用、优势和适用范围 光模块是一种支持热插拔的网络通信设备&a…

充电台灯好还是插电的好?五款热门插电护眼台灯推荐

选择充电式台灯还是插电式台灯需要根据不同的需求和考虑因素进行权衡&#xff0c;如果需要在没有电源插座的地方使用或者需要频繁移动&#xff0c;充电式台灯是更好的选择&#xff1b;如果需要长时间稳定使用&#xff0c;插电式台灯是更好的选择。同时&#xff0c;我们还应该注…

2023年好用的远程协同运维工具当属行云管家!

对于IT小伙伴而言&#xff0c;一款好用的远程协同运维工具是非常重要的&#xff0c;不仅可以提高工作效率&#xff0c;还能第一时间解决运维难题&#xff0c;所以好用的远程协同工具是非常必要的。这里就给大家推荐一款哦&#xff01; 2023年好用的远程协同运维工具当属行云管…

C++之Max

背景 想学习数据结构&#xff0c;这是看的课程的习题&#xff0c;讲课老师用的是类C语言&#xff0c;具体的实现还是得自己来。 准备工作 用开发工具Microsoft Visual Studio(VS)建立一个空白的C控制台项目 选择项目的存储路径 成功建立 我在 Microsoft Visual Studio中用…

2023软件测试面试总结

前言 本篇分享的软件测试面试题内容主要包括&#xff1a;测试总体、需求分析、测试计划、测试策略、测试用例、缺陷报告、测试总结报告、白盒测试、单元测试、集成测试、系统测试、验收测试等等26个模块。 同时&#xff0c;我也为大家准备了一份软件测试视频教程&#xff08;含…

文心一言 VS 讯飞星火 VS chatgpt (135)-- 算法导论11.3 1题

一、用go语言&#xff0c;假设我们希望查找一个长度为 n 的链表&#xff0c;其中每一个元素都包含一个关键字k并具有散列值h(k)。每一个关键字都是长字符串。那么在表中查找具有给定关键字的元素时&#xff0c;如何利用各元素的散列值呢? 文心一言&#xff1a; 在Go语言中&a…

less详解

拥抱前端开发的未来&#xff0c;掌握Less的魔力&#xff01;在我们精心撰写的博客文章中&#xff0c;你将发现如何通过学习Less这一强大的CSS预处理器&#xff0c;以更高效、更可维护的方式编写样式代码。无论你是初学者还是经验丰富的开发者&#xff0c;我们的指南将带你逐步了…

STM32 LL库 TIM3定时器多通道捕获输入采集

为什么不用HAL库&#xff0c;使用HAL库捕获输入一个通道还尚可&#xff0c;多通道捕获由于HAL的回调函数不符合我的要求&#xff0c;干脆直接切换到LL库。网上找了许多&#xff0c;代码处理写的不符合我的要求&#xff0c;这里记录一下我的调试过程。 TIM2输出1路PWM信号&#…

交换机堆叠 配置(H3C)

堆叠用来干什么&#xff1f; 一台交换机网口有限&#xff0c;无法满足网络需求&#xff1b; 无法达到网络要求&#xff0c;为了扩展核心设备的转发要求&#xff0c;不改变原来网络&#xff0c; 可以使用新交换机和原来交换机组成IRF。 配合聚合可以达到备用作用&#xff0c;防…