文章目录
如果你做搜索、问答系统(RAG)、文档召回,TF-IDF 和 BM25 几乎是绕不开的基础。
这篇文章会把它们的核心思想、公式、差异、适用场景讲透,并配上图示与实践建议。
- TF-IDF:一种“词重要性”权重模型,简单、直观、速度快。
- BM25:在 TF-IDF 上做了关键改进(词频饱和 + 文档长度归一化),通常检索效果更好,是很多搜索引擎默认基线。
- 在现代 RAG 中:常见做法是 BM25(关键词)+ 向量检索(语义)混合召回。
问题背景:为什么需要这类算法?
我们要回答一个问题:
对于查询 q q q,语料库里哪个文档 D D D 最相关?
最朴素方法:只看关键词出现次数(TF)。
问题:
- 常见词(比如“的”“系统”)会干扰结果
- 超长文档天然含词更多,容易“占便宜”
- 词出现 20 次并不一定比出现 5 次“相关 4 倍”
于是就有了 TF-IDF,再进一步发展到 BM25。
TF-IDF:关键词权重的第一性原理
TF-IDF 由两部分构成:
TF-IDF ( t , D ) = TF ( t , D ) ⋅ IDF ( t ) \text{TF-IDF}(t, D)=\text{TF}(t,D)\cdot \text{IDF}(t) TF-IDF(t,D)=TF(t,D)⋅IDF(t)
1. TF(Term Frequency,词频)
表示词 t t t 在文档 D D D 里有多“突出”。常见定义:
-
原始词频:
TF ( t , D ) = f ( t , D ) \text{TF}(t,D)=f(t,D) TF(t,D)=f(t,D) -
归一化词频:
TF ( t , D ) = f ( t , D ) ∣ D ∣ \text{TF}(t,D)=\frac{f(t,D)}{|D|} TF(t,D)=∣D∣f(t,D) -
对数词频(常用):
TF ( t , D ) = 1 + log f ( t , D ) ( f > 0 ) \text{TF}(t,D)=1+\log f(t,D)\quad (f>0) TF(t,D)=1+logf(t,D)(f>0)
其中 f ( t , D ) f(t,D) f(t,D) 是出现次数, ∣ D ∣ |D| ∣D∣ 是文档长度。
2. IDF(Inverse Document Frequency,逆文档频率)
表示词在整个语料里有多“稀有”。
IDF ( t ) = log N n t \text{IDF}(t)=\log \frac{N}{n_t} IDF(t)=logntN
- N N N:文档总数
- n t n_t nt:包含词 t t t 的文档数
常见平滑版本(避免除零和极端值):
IDF ( t ) = log N + 1 n t + 1 + 1 \text{IDF}(t)=\log \frac{N+1}{n_t+1}+1 IDF(t)=lognt+1N+1+1
3. TF-IDF 的直觉
- 在某篇文档中出现多(TF 高)→ 可能重要
- 在全库中不常见(IDF 高)→ 区分度高
- 两者相乘→ 既“局部重要”又“全局稀有”
TF-IDF 的局限:为什么还要 BM25?
TF-IDF 虽好,但有三个痛点:
- 词频线性增长不合理:出现 20 次并非是 2 次的 10 倍价值。
- 长度处理较粗糙:长文档仍可能偏占优。
- 排序目标不够“检索导向”:更像权重建模,不是专为相关性排序细致调参。
BM25 正是为检索排序而生。
BM25:在 TF-IDF 基础上的工业改进
BM25 的打分(Okapi BM25):
score ( D , q ) = ∑ t ∈ q IDF ( t ) ⋅ f ( t , D ) ⋅ ( k 1 + 1 ) f ( t , D ) + k 1 ⋅ ( 1 − b + b ⋅ ∣ D ∣ a v g d l ) \text{score}(D,q)=\sum_{t\in q}\text{IDF}(t)\cdot \frac{f(t,D)\cdot (k_1+1)} {f(t,D)+k_1\cdot \left(1-b+b\cdot \frac{|D|}{avgdl}\right)} score(D,q)=t∈q∑IDF(t)⋅f(t,D)+k1⋅(1−b+b⋅avgdl∣D∣)f(t,D)⋅(k1+1)
其中:
- f ( t , D ) f(t,D) f(t,D):词频
- ∣ D ∣ |D| ∣D∣:文档长度
- a v g d l avgdl avgdl:平均文档长度
- k 1 ∈ [ 1.2 , 2.0 ] k_1\in[1.2,2.0] k1∈[1.2,2.0] 常用,控制词频饱和速度
- b ∈ [ 0 , 1 ] b\in[0,1] b∈[0,1] 常用 0.75 0.75 0.75,控制长度归一化强度
常用 IDF 形式之一:
IDF ( t ) = log N − n t + 0.5 n t + 0.5 \text{IDF}(t)=\log\frac{N-n_t+0.5}{n_t+0.5} IDF(t)=lognt+0.5N−nt+0.5
实现中常会加 + 1 +1 +1 或做裁剪,防止负值过大(不同库有差异)。
1. BM25 的两个关键改进
A) 词频饱和(TF Saturation)
分子分母同含
f
(
t
,
D
)
f(t,D)
f(t,D),导致随词频上升收益递减。
这符合直觉:同词重复太多次,新增信息有限。
B) 文档长度归一化(Length Normalization)
∣ D ∣ a v g d l \frac{|D|}{avgdl} avgdl∣D∣ 会抑制超长文档的天然优势,使短文和长文更公平。
TF-IDF 与 BM25 关系图(Mermaid)
检索流程图
实战建议(特别是 RAG)
- 先上 BM25 做关键词召回基线,再考虑复杂策略。
- 中文场景先做好分词与同义词归一化,收益巨大。
- 与向量检索做 Hybrid Search(如 RRF 融合)通常优于单一路径。
- 参数起步:
- k 1 = 1.2 ∼ 1.8 k_1=1.2\sim1.8 k1=1.2∼1.8
-
b
=
0.6
∼
0.85
b=0.6\sim0.85
b=0.6∼0.85
然后在验证集网格调参。
- 不同 BM25 实现的 IDF 略有差别,注意离线评估口径统一。

691

被折叠的 条评论
为什么被折叠?



