文章目录

  • 简介
  • Function
    • k1k_1k1​ 的作用
    • bbb 的作用
  • 终极总结
  • 参考文档

简介

BM25算法常用来进行搜索。
输入问题Q0Q_0Q0​,在数据中去匹配其它Q时,可以用BM25进行排序。

"BM"其实就是指Best Matching。
BM25也称Okapi BM25。"Okapi"其实是第一个使用BM25进行检索的系统名字。

Function

BM25其实代表着一个家族。这个家族里的式子互相之间可能会有一些成分、参数的差异,但它们同根同源。

这个家族里最常见的成员,它的写法是这样的(公式来源: Wiki):


其中:
f(qi,D)f(q_i, D)f(qi​,D) 是qiq_iqi​在文档D中的Term Frequency 1

IDF(qi)IDF(q_i)IDF(qi​)是qiq_iqi​的Inverse Document Frequency 2

∣D∣|D|∣D∣为文章D的总词数

avgdl指average document length, 是你手头上所有文档长度的平均值

k1k_1k1​, bbb为自由参数,常见取值:k1∈[1.2,2.0]k_1\in[1.2,2.0]k1​∈[1.2,2.0] , b=0.75b=0.75b=0.75

下面我们来分析一下这个式子,解析这个式子的结构,看看里面的参数k1k_1k1​, bbb到底有什么用。

首先,我们忽略∑i=1n\sum_{i=1}^{n}∑i=1n​这个部分,即我们只看有关单个单词qiq_iqi​的计算。

接下来,我们拆出一个叫做 “IDFIDFIDF板块” 的部分,即IDF(qi)IDF(q_i)IDF(qi​)。

然后,把剩下的视为一个叫 "TFTFTF板块"的部分。

于是我们有
Score(D,Q)=∑对所有词IDF板块⋅TF板块Score(D, Q) = \sum_{对所有词} IDF板块 \cdot TF板块 Score(D,Q)=对所有词∑​IDF板块⋅TF板块

k1k_1k1​ 的作用

这里最复杂的板块其实就是TFTFTF板块了。那么我们先来想一个问题,如果我们简化TFTFTF板块,它只等于f(qi,D)f(q_i, D)f(qi​,D) ,那么会发生什么?

那么,我们的BM25 Score将随着qiq_iqi​在文档D中出现的次数增加而增加,而且毫无上限。但也许我们不希望某个出现非常多的词带来的影响过大3,我们就来看看BM25里的TFTFTF板块是如何防止这个影响过大的。

现在的TFTFTF板块看起来有点复杂,我们来简化它。

首先,分母中的 (1−b+b⋅∣D∣avgdl)(1-b+b\cdot\frac{|D|}{avgdl})(1−b+b⋅avgdl∣D∣​)只和b这个参数有关,当我们设置完b之后它就会变成一个常数,那么我们把这部分看成一个整体,设 m=(1−b+b⋅∣D∣avgdl)m=(1-b+b\cdot\frac{|D|}{avgdl})m=(1−b+b⋅avgdl∣D∣​)。

另外 f(qi,D)f(q_i, D)f(qi​,D)这个表达显得有点复杂,我们用小写tftftf来表示它。

于是有
TF板块=tf⋅(k1+1)tf+k1⋅mTF板块 = \frac{tf\cdot(k_1+1)}{tf+k_1\cdot m} TF板块=tf+k1​⋅mtf⋅(k1​+1)​

再次简化:
TF板块=k1+11+k1⋅mtfTF板块 = \frac{k_1+1}{1+\frac{k_1\cdot m}{tf}} TF板块=1+tfk1​⋅m​k1​+1​

发现了吗,这个式子是有上限的,不管tf再怎么大,这里的TFTFTF板块也大不过k1+1k_1+1k1​+1啊。
它的图像类似这样(以k1=1.2k_1=1.2k1​=1.2, m=1m=1m=1 为例):

它的趋势不是一个窜天猴,而是渐近线。
所以说,BM25的TFTFTF板块可以限制出现非常多次的单词对score的影响。

bbb 的作用

接下来,抛开我们已经理解的TFTFTF大板块,只看其分母里的mmm部分,以研究 bbb 这个参数的影响。

我们来重写一下m:
m=(1−b+b⋅∣D∣avgdl)=1+b⋅(∣D∣avgdl−1)m=(1-b+b\cdot\frac{|D|}{avgdl})\\ =1+b\cdot(\frac{|D|}{avgdl}-1) m=(1−b+b⋅avgdl∣D∣​)=1+b⋅(avgdl∣D∣​−1)
这里的∣D∣avgdl\frac{|D|}{avgdl}avgdl∣D∣​看起来也太啰嗦了,它本质上就是当前文档相对于所有文档来说有多长,我们设它为LLL, 总之,和当前文档长度有关。
于是有
m=1+b⋅(L−1)m=1+b\cdot(L-1) m=1+b⋅(L−1)
也就是说,(avgdlavgdlavgdl不变的情况下) 当前文档越长,mmm越大,从而TFTFTF板块值越小。

这样设计的原因,引用一个例子来解释: “如果在一个超长文章里我的名字被提到了一次,这篇文章是关于我的可能性估计不太大;但如果在一篇很短的文章里我的名字被提到了一次,那这篇文章是关于我的可能性还大些”。

那么参数 bbb 有什么用呢,bbb 越大,则对于长文的惩罚力度更大了。

终极总结

回到我们整体的三个板块
Score(D,Q)=∑对所有词IDF板块⋅TF板块Score(D, Q) = \sum_{对所有词} IDF板块 \cdot TF板块 Score(D,Q)=对所有词∑​IDF板块⋅TF板块
进行一下终极总结:

  1. IDF板块帮助惩罚在所有文档中都高频出现的词的影响力
  2. TF板块帮助惩罚当前文档中高频出现的词的影响力,使得词影响力非随词频线性增长,而是渐近增长。最终TF板块的值不会大过k1+1k_1+1k1​+1。
  3. TF板块帮助惩罚长文,bbb越大,惩罚力度越大。


转载请注明出处。

参考文档

  1. Wikipedia: Okapi BM25
  2. Elasticsearch: Practical BM25 - Part 2: The BM25 Algorithm and its Variables

  1. Term Frequency一般指词qiq_iqi​在文章D中出现的个数 除以 文章D的总词数,旨在排除文章长度对TF的影响。不过,在BM25这个式子中的TF应该单纯是指词qiq_iqi​在文章D中出现的个数,参考elasticsearch对BM25的一个解释: “…which had the text “shane shane,” it would have f(“shane”,D) of 2.” ↩︎

  2. IDF通常这样计算:
    IDF(qi)=ln(N−n(qi)+0.5n(qi)+0.5+1)IDF(q_i) = ln(\frac{N-n(q_i)+0.5}{n(q_i)+0.5} + 1) IDF(qi​)=ln(n(qi​)+0.5N−n(qi​)+0.5​+1)
    其中NNN是手头上document总数量,n(qi)n(q_i)n(qi​)是包含qiq_iqi​这个单词的文章总数量。
    主旨是包含这个单词的文章越多,IDF值就越低。比如一些类似"a","the"的停止词,虽然它们的TF值可以很高,但它们的IDF值很可能很低,说明它们在哪都很容易出现,可能并无法给我们提供很多信息。 ↩︎

  3. 你可能会问,那IDF不就帮助我们防止这个情况了吗?不,它们还是有一些区别的。当某个词在所有文档中都经常出现,那么IDF会帮助削减这个词的影响力。但如果某个词仅在当前文档内经常出现,IDF并不会帮助削减这个词的影响力。 ↩︎

检索算法: BM25原理详解相关推荐

  1. 文本分类算法TextCNN原理详解

    详情请看:膜拜大佬![原创]文本分类算法TextCNN原理详解(一) - ModifyBlog - 博客园 Textcnn 原理 与rnn lstm 的比较, Textcnn更快 textCNN的总结 ...

  2. 机器学习经典算法决策树原理详解(简单易懂)

    ↑ 点击上方[计算机视觉联盟]关注我们 最经典的决策树算法有ID3.C4.5.CART,其中ID3算法是最早被提出的,它可以处理离散属性样本的分类,C4.5和CART算法则可以处理更加复杂的分类问题, ...

  3. JVM垃圾回收算法与原理详解

    垃圾回收 参考文档 GC参考手册-Java版 理解Java的强引用.软引用.弱引用和虚引用 JVM系列(五) - JVM垃圾回收算法 如何判断对象可以回收 引用计数法 参考文章 Java JVM的引用 ...

  4. 目标跟踪算法KCF原理详解

    一直以来没有很想写这个,以为这个东西比较简单,还算是比较容易理解的一个算法,但是在知乎上回答过一个问题之后就有朋友私信我一些关于细节的东西,我一直以为关于细节的东西大家可以自己去理解,大家都是想快速了 ...

  5. LCA算法以及原理详解

    LCA-最近公共祖先   LCA(Least Common Ancestors),即最近公共祖先,这种描述是基于树结构的,也即我们通通常只在树结构中考虑祖先问题.树实际上就是图论中的有向无环图,而要研 ...

  6. NLP之---word2vec算法skip-gram原理详解

    https://blog.csdn.net/weixin_41843918/article/details/90312339

  7. CRF(条件随机场)与Viterbi(维特比)算法原理详解

    摘自:https://mp.weixin.qq.com/s/GXbFxlExDtjtQe-OPwfokA https://www.cnblogs.com/zhibei/p/9391014.html C ...

  8. EMD算法之Hilbert-Huang Transform原理详解和案例分析

    目录 Hilbert-Huang Transform 希尔伯特-黄变换 Section I 人物简介 Section II Hilbert-Huang的应用领域 Section III Hilbert ...

  9. 操作系统:基于页面置换算法的缓存原理详解(下)

    概述: 在上一篇<操作系统:基于页面置换算法的缓存原理详解(上)>中,我们主要阐述了FIFO.LRU和Clock页面置换算法.接着上一篇说到的,本文也有三个核心算法要讲解.分别是LFU(L ...

最新文章

  1. ASP连接Access2013
  2. 机器学习中,有哪些特征选择的工程方法?
  3. Kotlin 学习笔记01
  4. 记一次 Git 操作的糟心之旅
  5. Installing ROS 2 on Ubuntu20.04 Linux
  6. 看了这一篇,就不用看别的——Java中Object关于锁的的三个方法:wait,notify,notifyAll的作用
  7. aosp 为什么某些目录没有编译_编译Android AOSP代码
  8. 问题 1046: [编程入门]自定义函数之数字后移
  9. C Primer+Plus(十七)高级数据表示 编程练习(二)
  10. 北京化工大学通信工程linux,北京化工大学通信工程专业解读
  11. html5+php调用android手机图片,HTML5拍照上传图片Phonegap封装HTML5调用Android相机拍照上传到PHP端...
  12. The game of life(生命游戏)新算法
  13. 传统CPU架构不再是高性能计算唯一选择
  14. 洛谷P3764 签到题 III
  15. 使用钢琴键盘作为电脑键盘[关闭]
  16. 零和博弈、正和博弈和负和博弈
  17. bzoj 2876: [Noi2012]骑行川藏 拉格朗日数乘
  18. 密码学之DES/AES算法
  19. 苏宁使用API接口范例讲解
  20. 一篇共享自习室的分析

热门文章

  1. 一文教会你Python 随机爬山算法
  2. Unity3d游戏公司面试常见问题全接触
  3. Java数组练习(1)获取四家店的手机最低价min
  4. 360 se html document 广告,360浏览器弹窗广告如何关闭?教你彻底删除屏蔽360se.exe广告!...
  5. 杰里AC692x uart1奇校验使用
  6. 《云计算实践与原理》考试内容及参考答案
  7. alooa是华为什么型号_alooa是华为什么型号
  8. Vue移动端项目模板
  9. Matplotlib画图中文字体乱码设置
  10. MATLAB 批量读取NC文件并转为TIF文件