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

BM25 关键词检索算法

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.hskmm.com/?act=detail&tid=15564

相关文章:

  • 记录用户业务请求日志
  • [C++:类的默认成员函数——Lesson7.const成员函数] - 指南
  • 详细介绍:Xilinx系列FPGA实现12G-SDI音视频编解码,支持4K60帧分辨率,提供2套工程源码和技术支持
  • 使用 VMware Workstation 安装 CentOS-7 虚拟机
  • K12教育 和 STEAM教育
  • AT_arc167_c [ARC167C] MST on Line++
  • Lombok无法使用get set方法
  • redis的哈希扩容
  • vite tailwindcss配置
  • 在Vona ORM中实现多数据库/多数据源
  • 实用指南:python全栈-数据可视化
  • sql over()函数使用
  • Git回退版本 reset、revert、read-tree、restore
  • Avalonia 背景颜色Transparent在用户界面设计中对悬浮效果影响的总结
  • 飞书 燕千云焕新上线,飞书用户即刻试用ITSM工具
  • 如果使用微软 Azure 托管的 OpenAI 服务
  • Python类
  • 什么是文件外发审批?主要有哪几种关键流程?
  • VPX处理板设计原理图:9-基于DSP TMS320C6678+FPGA XC7V690T的6U VPX信号处理卡 C6678板卡, XC7VX690T板卡, VPX处理板
  • VitePress 添加友链界面
  • 跨网文件摆渡软件:企业数据安全高效传输的关键解决方案!
  • 洛谷题单指南-进阶数论-P1495 【模板】中国剩余定理(CRT)/ 曹冲养猪
  • 第十四届蓝桥杯青少组C++选拔赛[2022.12.18]第二部分编程题(4、充电站) - 指南
  • c语言之自定义memcpy
  • 国产芯片处理板卡:7-基于国产化FT-M6678+JFM7K325T的6U CPCI信号处理卡
  • 一文详解纷享销客CRM Agent平台3大核心能力(附应用场景与案例)
  • QOJ #5076. Prof. Pang and Ants 题解
  • 发现5个宝藏文件摆渡系统 2025年企业首选的摆渡方案是这个!
  • 漏洞挖掘实战:如何定制化模糊测试技术
  • nuxt3中使用pdfjs-dist实现pdf转换canvas实现浏览