每天学一个算法--BM25(Okapi BM25)

📘 教案 27:BM25(Okapi BM25 · 排序模型)


一、问题模型(从倒排索引自然过渡)

在倒排索引中,我们已经能做到:

找到"包含查询词的文档集合"

但问题是:

这些文档如何排序?


更严格表达

给定:

  • 查询 ( q = {t_1, t_2, ..., t_m} )
  • 文档 ( d )

定义一个评分函数:

score(d,q)\]\[ score(d, q) \]\[score(d,q)

目标:

按照相关性对文档排序


二、基础模型回顾:TF-IDF(不足)


score(d,q)=∑t∈qTF(t,d)⋅IDF(t)\]\[ score(d, q) = \\sum_{t \\in q} TF(t,d) \\cdot IDF(t) \]\[score(d,q)=∑t∈qTF(t,d)⋅IDF(t)


问题


1️⃣ TF 线性增长不合理

text 复制代码
词出现 100 次 ≠ 比出现 10 次重要 10 倍

2️⃣ 文档长度影响严重

text 复制代码
长文档更容易出现更多词 → 被高估

3️⃣ 没有"饱和效应"


三、BM25 的核心思想


BM25 在 TF-IDF 基础上引入两个关键改进:


1️⃣ TF 饱和(Term Frequency Saturation)


TF 不再线性增长,而是逐渐趋于饱和\]\[ TF \\text{ 不再线性增长,而是逐渐趋于饱和} \]\[TF 不再线性增长,而是逐渐趋于饱和


2️⃣ 文档长度归一化(Length Normalization)


防止长文档天然占优势


四、BM25 完整公式


score(d,q)=∑t∈qIDF(t)⋅TF(t,d)⋅(k1+1)TF(t,d)+k1⋅(1−b+b⋅∣d∣avgdl)\]\[ score(d, q) = \\sum_{t \\in q} IDF(t) \\cdot \\frac{TF(t,d) \\cdot (k_1 + 1)} {TF(t,d) + k_1 \\cdot (1 - b + b \\cdot \\frac{\|d\|}{avgdl})} \]\[score(d,q)=∑t∈qIDF(t)⋅TF(t,d)+k1⋅(1−b+b⋅avgdl∣d∣)TF(t,d)⋅(k1+1)


五、逐项解释(必须掌握)


1️⃣ TF(t,d)

词 (t) 在文档 (d) 中出现次数


2️⃣ IDF(t)

IDF(t)=log⁡N−df+0.5df+0.5\]\[ IDF(t) = \\log \\frac{N - df + 0.5}{df + 0.5} \]\[IDF(t)=logdf+0.5N−df+0.5


含义:

  • 出现越少 → 权重越高
  • 区分度越强

3️⃣ 分子部分

TF⋅(k1+1)\]\[ TF \\cdot (k_1 + 1) \]\[TF⋅(k1+1)

👉 增强 TF 影响


4️⃣ 分母部分(关键)

TF+k1⋅(1−b+b⋅∣d∣avgdl)\]\[ TF + k_1 \\cdot (1 - b + b \\cdot \\frac{\|d\|}{avgdl}) \]\[TF+k1⋅(1−b+b⋅avgdl∣d∣)


分成两部分:


(1)TF 饱和控制

TF+k1\]\[ TF + k_1 \]\[TF+k1

👉 TF 越大,增长越慢



(2)长度归一化

∣d∣avgdl\]\[ \\frac{\|d\|}{avgdl} \]\[avgdl∣d∣


👉 文档越长 → 分母越大 → 分数降低


六、参数含义(工程必须会调)


(k_1)(通常 1.2 ~ 2.0)


控制:

text 复制代码
TF 饱和速度

  • 小 → 很快饱和
  • 大 → 更接近线性

(b)(通常 0.75)


控制:

text 复制代码
长度惩罚强度

  • 0 → 不考虑长度
  • 1 → 完全按长度归一化

七、直观理解(核心)


BM25 实际在做三件事:


1️⃣ 词重要吗?

👉 IDF


2️⃣ 在文档中出现多少次?

👉 TF(但有上限)


3️⃣ 文档是不是太长?

👉 长度惩罚


八、与 TF-IDF 的本质区别


维度 TF-IDF BM25
TF 增长 线性 饱和
长度处理 无 有
工程效果 一般 更稳定

👉 BM25 是:

TF-IDF 的工程优化版本


九、与 Top-K 的关系


BM25 是:

text 复制代码
score(d, q)

Top-K 是:

text 复制代码
选最大的 K 个 score

👉 二者组合:

text 复制代码
倒排索引 → BM25 → Top-K

十、工程实现要点


1️⃣ 倒排索引中存储:

text 复制代码
(term → [(docID, tf)])

2️⃣ 查询流程:

text 复制代码
遍历 posting list
→ 计算 BM25
→ 更新 Top-K 堆

3️⃣ 优化:

  • 跳表(skip list)
  • 块级上界(Block Max WAND)
  • 提前终止(Top-K 剪枝)

十一、BM25 的局限


  • 不理解语义(只看词频)
  • 对同义词无感
  • 无上下文理解

👉 所以现代系统会加:

  • 向量检索(Embedding)
  • 深度模型(BERT)

十二、本质总结(严肃表达)


BM25 通过对词频进行非线性缩放并引入文档长度归一化,在 TF-IDF 模型基础上构建了一种更符合实际文本分布特性的相关性评分函数,从而在信息检索系统中提供稳定且高效的排序能力。

相关推荐
yi0117 小时前
LeetCode 219:存在重复元素 II——哈希表记录“最近一次出现的位置”
数据结构·人工智能·笔记·python·算法·leetcode·哈希表
灯澜忆梦9 小时前
【面向对象编程C++】| 基础语法
java·c++·算法
小蒋观天下9 小时前
专项方案:大场景港口AI安防、多干扰环境下的算法调优与落地实操
人工智能·深度学习·算法·安全·机器学习·计算机视觉·ai大模型
Evand J10 小时前
【电机滤波例程5】渐消因子自适应扩展卡尔曼滤波(EKF),MATLAB。PMSM负载突变下的状态估计。附下载链接
算法·matlab
H.莓飛10 小时前
【数据结构】二叉树_OJ题
linux·开发语言·数据结构·算法
好想像大佬一样能够ak所有10 小时前
Leetcode35.搜索插入位置
数据结构·算法·leetcode
aqiu11111110 小时前
【C++算法打怪专栏】LeetCode 165. 比较版本号(双指针与字符串流法)
c++·算法·leetcode
黄金龙PLUS11 小时前
如何基于置换算法来设计对称加密算法
算法·网络安全·密码学·哈希算法·同态加密
不会就选b11 小时前
算法日常・每日刷题--<动态规划>14
算法
赛博守夜人11 小时前
跨境业务与出海合规之九:海外买量投放与营销虚假流量(Ad Fraud):跨国机房群控与归因欺诈识别算法
算法·安全