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

相关推荐
二十七日秋8 分钟前
算法刷题笔记「Day 1|四道 OJ 入门题里的深坑」
c语言·汇编·数据结构·c++·笔记·python·算法
晚风叙码22 分钟前
Linux 进程概念(下):程序地址空间与虚拟内存
linux·服务器·算法
silvamux_42 分钟前
微头条爆款体平台适配实测:把交付要求变成可计算的指标
java·线性代数·算法·决策树·矩阵
重生之小比特1 小时前
【算法拾光】前缀和|连续的子数组和 + 和相同的二元子数组
算法·leetcode·哈希算法
一去不复返的通信er1 小时前
力扣15:盛最多水的容器
算法·leetcode
Navigator_Z1 小时前
LeetCode //C - 1309. Decrypt String from Alphabet to Integer Mapping
c语言·算法·leetcode
潇湘秦1 小时前
SQL Server 2016+ 整数类型元数据扩宽(秒级变更)完整说明
数据库·算法
Figo_Cheung3 小时前
Figo基于结构空间算法假设(SSAH)的生成式大模型优化范式与工程实现边界研究——提出适应AGI架构演化的自适应拓扑感知表征机制
算法·架构·agi
旖旎夜光3 小时前
LCR 170:交易逆序对的总数(归并排序) —— 题解
c++·学习·算法·leetcode·排序算法
微尘hjx11 小时前
【ByteTrack 04】多轨迹算法ByteTrack改进点
算法·yolo·目标检测·目标跟踪·bytetrack·ultralytics·车跟踪