每天学一个算法--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 模型基础上构建了一种更符合实际文本分布特性的相关性评分函数,从而在信息检索系统中提供稳定且高效的排序能力。

相关推荐
grant-ADAS2 小时前
Overlay套刻测量
算法
猿长大人2 小时前
算法 | Douglas-Peucker 拯救“腰椎间盘突出的三角形”
算法
HackTorjan2 小时前
深度解析雪花算法及其高性能优化策略
人工智能·深度学习·算法·性能优化·dreamweaver
北顾笙9802 小时前
day35-数据结构力扣
数据结构·算法·leetcode
cpp_25013 小时前
P2249 【深基13.例1】查找
数据结构·c++·算法·题解·二分·洛谷
烤麻辣烫3 小时前
算法--二分搜索
java·开发语言·学习·算法·intellij-idea
山甫aa3 小时前
二叉树算法-----从零开始的算法
数据结构·算法
睡觉就不困鸭4 小时前
第十七天 翻转字符串里的单词
数据结构·算法·哈希算法·散列表
ulias2124 小时前
leetcode热题 - 4
算法·leetcode·职场和发展