一文讲清 TF-IDF 与 BM25:从“词频统计”到“工业级关键词检索”

如果你做搜索、问答系统(RAG)、文档召回,TF-IDFBM25 几乎是绕不开的基础。
这篇文章会把它们的核心思想、公式、差异、适用场景讲透,并配上图示与实践建议。


  • 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 里有多“突出”。常见定义:

  1. 原始词频:
    TF ( t , D ) = f ( t , D ) \text{TF}(t,D)=f(t,D) TF(t,D)=f(t,D)

  2. 归一化词频:
    TF ( t , D ) = f ( t , D ) ∣ D ∣ \text{TF}(t,D)=\frac{f(t,D)}{|D|} TF(t,D)=Df(t,D)

  3. 对数词频(常用):
    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 虽好,但有三个痛点:

  1. 词频线性增长不合理:出现 20 次并非是 2 次的 10 倍价值。
  2. 长度处理较粗糙:长文档仍可能偏占优。
  3. 排序目标不够“检索导向”:更像权重建模,不是专为相关性排序细致调参。

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)=tqIDF(t)f(t,D)+k1(1b+bavgdlD)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.5Nnt+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} avgdlD 会抑制超长文档的天然优势,使短文和长文更公平。


TF-IDF 与 BM25 关系图(Mermaid)

词频 TF

TF-IDF

逆文档频率 IDF

发现问题: TF线性增长 & 长文偏置

BM25

词频饱和 k1

长度归一化 b

更稳健的相关性排序


检索流程图

TF-IDF

BM25

用户查询 q

分词/标准化

倒排索引召回候选文档

打分函数

按 TF-IDF 排序

按 BM25 排序

Top-K 结果


实战建议(特别是 RAG)

  1. 先上 BM25 做关键词召回基线,再考虑复杂策略。
  2. 中文场景先做好分词与同义词归一化,收益巨大。
  3. 与向量检索做 Hybrid Search(如 RRF 融合)通常优于单一路径。
  4. 参数起步:
    • k 1 = 1.2 ∼ 1.8 k_1=1.2\sim1.8 k1=1.21.8
    • b = 0.6 ∼ 0.85 b=0.6\sim0.85 b=0.60.85
      然后在验证集网格调参。
  5. 不同 BM25 实现的 IDF 略有差别,注意离线评估口径统一
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TracyCoder123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值