BM25 关键词检索算法

news/2025/9/24 10:27:57/文章来源:https://www.cnblogs.com/pass-ion/p/19108708

BM25

BM25,全称是 Best Matching 25,是一种用于信息检索的排名函数。它用来计算一个查询(Query)与一组文档(Documents)的相关性得分,并按照得分从高到低对文档进行排序。

简单来说,它的核心任务是:给定一个用户搜索词(如“苹果手机”),从海量文档中找出最相关的文档,并排名返回。

BM25 并非一个突然出现的新算法,而是基于经典的 TF-IDF 框架,经过多年研究和改进(从BM1到BM15等)后,在20世纪80-90年代形成的更为精确和健壮的版本。因此,理解BM25最好从TF-IDF开始。

 

TF-IDF 由两个部分组成:

  • TF(词频):一个词在当前文档中出现的次数越多,说明该词对当前文档越重要。

    • TF(单词, 文档) = 单词在文档中出现的次数

  • IDF(逆文档频率):一个词在整个文档集合中出现的次数越少,说明这个词越有区分度,越重要。

    • IDF(单词) = log(文档总数 / (包含该词的文档数 + 1))

TF-IDF得分 = TF × IDF
这个公式的直觉是:一个词的重要性,与它在当前文档中出现的次数成正比,与它在所有文档中出现的次数成反比。

 

TF-IDF的缺陷:

  • 文档长度不敏感:一篇1000字的文章出现5次“苹果”,和一篇50字的短文出现5次“苹果”,TF值相同。但显然,短文中的“苹果”密度更高,可能更相关。

  • TF线性增长问题:一个词出现100次,并不代表它比出现10次相关100倍。相关性不会随词频无限线性增长,应该有上限(饱和点)。

 

BM25 算法基本思想

  1. TF-IDF 的改进: BM25 通过对文档中的每个词项引入饱和函数(saturation function)和文档长度因子,改进了 TF-IDF 的计算。让算法在衡量词与文档相关性时更加精准。

  2. 饱和函数: 在 BM25 中,对于词项的出现次数(TF),引入了一个饱和函数来调整其权重。这是为了防止某个词项在文档中出现次数过多导致权重过大。

    在文档中,某些词可能出现次数过多,如果直接按照 TF-IDF 计算,这些词的权重会过大,可能会掩盖其他重要词的作用。BM25 算法引入饱和函数来调整词项出现次数(TF)的权重,有效避免了某个词项权重过高的问题,使得算法能更合理地评估每个词对文档相关性的贡献。

  3. 文档长度因子: BM25 考虑了文档的长度,引入了文档长度因子,使得文档长度对权重的影响不是线性的。这样可以更好地适应不同长度的文档。

    不同文档长度差异很大,如果不考虑文档长度,短文档可能因为词频较低,在检索中处于劣势。BM25 引入的文档长度因子,使得文档长度对权重的影响不再是简单的线性关系。它会根据文档的平均长度,对不同长度文档中的词权重进行调整,让算法能更好地适应各种长度的文档,提高检索的公平性和准确性。

image

 

image

 

BM25 的优缺点

优点:

  1. 非监督学习:BM25是一个无监督算法,不需要人工标注的相关性数据即可直接使用,简单高效。

  2. 效果卓越:在传统关键字匹配的检索任务中,效果非常好,多年来是学术研究和工业界实践的黄金标准。

  3. 可解释性强:得分由明确的公式计算,可以分析每个词对最终得分的贡献,易于理解和调试。

  4. 计算高效:可以建立倒排索引进行加速,适合大规模文档集合的快速检索。

缺点:

  1. 语义鸿沟:和所有基于词袋模型的方法一样,BM25无法理解语义

    • 例如,查询“轿车”,无法匹配包含“汽车”但未出现“轿车”的文档。它无法理解同义词、上下位词等语义关系。

  2. 词汇不匹配:对拼写错误、缩写、词形变化等比较敏感。

  3. 缺乏深层语义理解:无法捕捉词语之间复杂的上下文关系。

 

现代搜索引擎的实践:
通常采用 “混合检索” 策略,结合两者的优点:

    1. 召回:先用BM25等传统方法从海量文档中快速召回一批候选文档。

    2. 精排:再用BGE-M3这类深度模型对召回的候选文档进行更精细的语义重排,选出最相关的结果。

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

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

相关文章

记录用户业务请求日志

在用户的一般使用的时候,对于很多操作类型的接口,为了后面便于追查问题,需要记录用户的请求日志。 用户的请求日志目前主流的存储方式有:日志文件 数据库 MongoDB ElasticSearch在商城的项目中暂时存放在MySQL中了…

[C++:类的默认成员函数——Lesson7.const成员函数] - 指南

[C++:类的默认成员函数——Lesson7.const成员函数] - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consola…

55.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--新增功能--实现手机邮箱登录 - 实践

55.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--新增功能--实现手机邮箱登录 - 实践2025-09-24 10:26 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !im…

游戏网站的设计方案新农村建设管理网站

Problem - C - Codeforces 题目分析 <1>0&#xff1a;想被分割至左边&#xff1b; 1&#xff1a;想被分割至右边 <2>使得左右两侧均有一半及其以上的人满意&#xff08;我*******&#xff09; <3>答案若有多个&#xff0c;取最接近中间位置的答案 <4…

怎么选择网站建设干部信息管理系统

1 、请用 Python 手写实现插入排序。 解析&#xff1a; 插入排序&#xff08; Insertion Sort &#xff09;的工作原理是通过构建有序序列&#xff0c;对于未排序数据&#xff0c; 在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。 算法执行步骤&#xff1a; &…

详细介绍:Xilinx系列FPGA实现12G-SDI音视频编解码,支持4K60帧分辨率,提供2套工程源码和技术支持

详细介绍:Xilinx系列FPGA实现12G-SDI音视频编解码,支持4K60帧分辨率,提供2套工程源码和技术支持pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block …

CentOS6.8安装docker教程

在VMware新安装CentOS6.8系统CentOS6.8可在阿里镜像库下载: https://mirrors.aliyun.com/centos-vault/6.8/isos/x86_64/ 在新安装系统配置yum源2.1 进入目录 /etc/yum.repos.d2.2 对原配置备份mv *.repo ./bak2.3 下…

使用 VMware Workstation 安装 CentOS-7 虚拟机

使用 VMware Workstation 安装 CentOS-7 虚拟机1. 环境说明和软件准备 环境说明:宿主机操作系统:Window 10 宿主机 CPU 架构:x86_64 虚拟机软件:VMware Workstation Pro 15 虚拟机系统:CentOS-7.6软件下载:CentO…

K12教育 和 STEAM教育

K12教育定义:K12是“Kindergarten through twelfth grade”的缩写,指从幼儿园(Kindergarten,通常5-6岁)到十二年级(Grade 12,通常17-18岁)的教育阶段。它涵盖了学前教育、小学教育、初中教育和高中教育,是国际…

网站底部代码大全建设网站一定要电脑吗

binary 和 varbinary固定长度 (binary) 的或可变长度 (varbinary) 的 binary 数据类型。binary [ ( n ) ]固定长度的 n 个字节二进制数据。N 必须从 1 到 8,000。存储空间大小为 n4 字节。varbinary [ ( n ) ]n 个字节变长二进制数据。n 必须从 1 到 8,000。存储空间大小为实际…

uv Python安装镜像加速

uv Python安装镜像加速感谢南京大学开源镜像站!国内目前能找到的唯一镜像! Windows系统cmd设置环境变量命令如下: setx UV_PYTHON_INSTALL_MIRROR "https://mirror.nju.edu.cn/github-release/astral-sh/pytho…

AT_arc167_c [ARC167C] MST on Line++

首先遇到这种题先不要慌,先拆贡献。 考察一个权值为 \(a_i\) 的边会被 MST 包含多少次,因为我们确定了 \(p\),所以 \(a\) 的顺序就没有关系了,我们先将 \(a\) 排序,钦定某一种边权出现次数很难做,但是我们如果钦…

CentOS操作系统

CentOS操作系统CentOS操作系统更新时间:2025-07-31 09:59:20产品详情我的收藏 本文详细介绍CentOS所处的生命周期阶段,以及可以采取哪些应对方案来应对CentOS停止维护后的风险。CentOS生命周期概述 CentOS Linux 是一…

龙虎榜——20250912 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Lombok无法使用get set方法

问题描述:使用lombok@Data注解后,无法调用实体类的getter setter方法。 解决方案:安装lombok插件(记得安装后应用)

网站怎么做直播小制作简单手工

基本思想&#xff1a;需要使用linux系统调用alliedvisio工业相机完成业务&#xff0c;这里只做驱动相机调用&#xff0c;具体不涉及业务开发 Alvium 相机选型 - Allied Vision 一、先用软件调用一下用于机器视觉和嵌入式视觉的Vimba X 软件开发包 - Allied Vision VimbaX_Set…

网站与网页移动商城官网 积分兑换

论文笔记整理&#xff1a;谭亦鸣&#xff0c;东南大学博士生。来源&#xff1a;WWW 2020链接&#xff1a;https://dl.acm.org/doi/pdf/10.1145/3366423.3380114概述这篇论文关注的任务是&#xff1a;基于给定文本的“多跳问题生成”&#xff08;多关系问题&#xff09;。作者提…

redis的哈希扩容

Redis 哈希的扩容过程是其高效性的关键所在,它采用了一种非常巧妙的渐进式 rehash 策略来避免一次性扩容带来的服务停顿。 步骤 1:准备工作 当满足扩容条件时,为 ht[1] 分配空间。新的大小根据上述规则计算。 将字典…

vite tailwindcss配置

1. 安装tailwindcss依赖yarn add tailwindcss @tailwindcss/vite2.新建css文件引入tailwindcss//assets/styles/tailwind.css@import tailwindcss;3.main.js引入css文件import ./assets/styles/tailwind.css4.配置vite…

window系统下使用二进制包安装MySQL数据库

window系统使用二进制包安装MySQL数据库以下仅为本人工作、学习过程中所接触到的内容,不足之处欢迎指出。 安装说明 1、安装数据库的window系统为win7专业版64位2、MySQL版本为mysql-5.7.17-winx64 下载解压 下载地址…