🎯 BM25算法

第一步:BM25是什么?

🤔 想象一下...

你有一个超大的图书馆,里面有1000本书。现在你想找关于"苹果"的书,你会怎么找?

简单方法: 看哪本书里"苹果"这个词出现得最多?
问题: 如果一本书有1000页,另一本只有10页,长书肯定更容易出现"苹果"这个词,这不公平!

BM25就是解决这个问题的聪明方法! 它会:

  • ✅ 看词出现的次数(但不能太多,会"饱和")
  • ✅ 看这个词是不是很特别(稀有的词更重要)
  • ✅ 考虑书的长度(长书不会占便宜)

第二步:三个重要概念

1️⃣ 词频(TF)- 这个词出现了几次?

就像数数一样简单!

例子: 文档:"我喜欢苹果,苹果很好吃,苹果很甜"
"苹果"出现了 3次,所以 TF = 3
词出现得越多,说明这个文档和这个词越相关!

2️⃣ 逆文档频率(IDF)- 这个词有多特别?

如果所有书都有"的"这个词,那"的"就不特别。但如果只有几本书有"苹果",那"苹果"就很特别!

例子: 图书馆有100本书
- "的"出现在90本书里 → 很普通,IDF很小
- "苹果"只出现在5本书里 → 很特别,IDF很大
IDF = log(总文档数 ÷ 包含该词的文档数)
越稀有的词,IDF越大,越能帮你找到真正相关的文档!

3️⃣ 文档长度归一化 - 公平竞争

就像比赛时,不能让长跑选手和短跑选手直接比速度,要公平!

问题: 长文档(1000字)更容易包含查询词,这不公平!
解决: BM25会"惩罚"长文档,让短文档和长文档公平竞争

第三步:看图理解

📊 词频饱和效果

词出现1次和出现2次差别很大,但出现100次和101次差别很小!

📊 IDF值对比

看看不同稀有程度的词的IDF值:

第四步:BM25公式

📐 完整的BM25公式

$$\text{BM25}(D, Q) = \sum_{i=1}^{n} \text{IDF}(q_i) \times \frac{\text{TF}(q_i, D) \times (k_1 + 1)}{\text{TF}(q_i, D) + k_1 \times \left(1 - b + b \times \frac{|D|}{\text{avgdl}}\right)}$$
这个公式看起来很复杂,但我们可以把它拆解成几个简单的部分来理解!

🔍 公式拆解:三个部分

部分1:IDF(逆文档频率)

$$\text{IDF}(q_i) = \log\left(\frac{N - n(q_i) + 0.5}{n(q_i) + 0.5}\right)$$

作用:衡量词的稀有程度

  • $N$ = 总文档数
  • $n(q_i)$ = 包含词 $q_i$ 的文档数
  • 0.5 = 平滑参数(防止除零)
例子: 1000个文档中,"苹果"出现在10个文档里
$\text{IDF}(\text{苹果}) = \log\left(\frac{1000 - 10 + 0.5}{10 + 0.5}\right) = \log(94.3) \approx 4.55$

部分2:调整后的词频(TF调整)

$$\frac{\text{TF}(q_i, D) \times (k_1 + 1)}{\text{TF}(q_i, D) + k_1 \times \text{归一化项}}$$

作用:对词频进行"饱和"处理,避免词频无限增长

  • $\text{TF}(q_i, D)$ = 词 $q_i$ 在文档 $D$ 中出现的次数
  • $k_1$ = 词频饱和度参数(通常取 1.5)
  • 归一化项 = 文档长度归一化(见下面)
例子: 词出现1次时,调整后 ≈ 2.5;出现10次时,调整后 ≈ 5.4
可以看到:1次→2次增长快,但10次→11次增长慢(饱和了!)

部分3:文档长度归一化

$$1 - b + b \times \frac{|D|}{\text{avgdl}}$$

作用:让长文档和短文档公平竞争

  • $|D|$ = 文档 $D$ 的长度(词数)
  • $\text{avgdl}$ = 所有文档的平均长度
  • $b$ = 长度归一化参数(通常取 0.75)
例子: 平均长度100词,某文档50词,$b=0.75$
归一化项 = $1 - 0.75 + 0.75 \times \frac{50}{100} = 0.625$
短文档归一化项小 → 分母小 → 分数高(短文档占优势)

⚙️ 两个重要参数:k₁ 和 b

k₁(词频饱和度参数)

默认值: 1.5

作用: 控制词频的影响程度

  • k₁ 越小 → 词频影响越小
  • k₁ 越大 → 词频影响越大
  • 推荐范围:1.2 - 2.0
就像调节音量:k₁小=音量小,k₁大=音量大

b(长度归一化参数)

默认值: 0.75

作用: 控制文档长度的影响

  • b = 0 → 不做长度归一化
  • b = 1 → 完全长度归一化
  • 推荐范围:0.5 - 1.0
就像天平:b=0时不管长度,b=1时完全公平

📝 完整计算示例

让我们用一个具体例子来看BM25是怎么计算的:

场景:
文档库:3个文档
查询:"机器学习"(分词后:["机器", "学习"])

文档1: "我喜欢机器学习" → ["我", "喜欢", "机器", "学习"]
文档2: "机器学习很有趣" → ["机器", "学习", "很", "有趣"]
文档3: "我喜欢编程" → ["我", "喜欢", "编程"]

计算步骤:

步骤1:计算基础统计

  • 总文档数 $N = 3$
  • 平均文档长度 $\text{avgdl} = \frac{4 + 4 + 3}{3} = 3.67$ 词
  • 参数:$k_1 = 1.5$,$b = 0.75$

步骤2:计算IDF值

  • "机器"出现在2个文档中:$\text{IDF}(\text{机器}) = \log\left(\frac{3-2+0.5}{2+0.5}\right) + 1 \approx 0.49$
  • "学习"出现在2个文档中:$\text{IDF}(\text{学习}) = \log\left(\frac{3-2+0.5}{2+0.5}\right) + 1 \approx 0.49$

步骤3:计算文档1的BM25分数

  • 文档长度:$|D| = 4$
  • 归一化项:$1 - 0.75 + 0.75 \times \frac{4}{3.67} = 1.07$
  • "机器"的词频:$\text{TF} = 1$
  • "机器"的调整TF:$\frac{1 \times 2.5}{1 + 1.5 \times 1.07} = 0.96$
  • "机器"的分数:$0.49 \times 0.96 = 0.47$
  • "学习"的分数:同样计算得到 $0.47$
  • 文档1总分:$0.47 + 0.47 = 0.94$

步骤4:计算所有文档分数并排序

  • 文档1:0.94(包含两个查询词)
  • 文档2:0.94(包含两个查询词)
  • 文档3:0.00(不包含查询词)
💡 记住公式的诀窍:
BM25分数 = 所有查询词的分数加起来
每个词的分数 = IDF(词的稀有程度)× 调整后的词频(考虑饱和和文档长度)
词出现得多 + 词很特别 + 文档长度合适 = 高分文档!🎯

第五步:BM25 vs TF-IDF

特性 TF-IDF BM25
词频增长 线性增长(1次→2次→3次,每次都加一样多) 饱和增长(1次→2次加很多,但100次→101次加很少)
长度处理 简单归一化 更灵活的参数控制
效果 基础但有效 通常更好
BM25就像TF-IDF的升级版,更聪明,效果更好!

🎉 总结

✅ BM25是一个聪明的算法,用来找最相关的文档

✅ 它考虑三个因素:词频、词的稀有程度、文档长度

✅ 不需要训练,直接用数学公式计算

✅ 被广泛用于搜索引擎(如Google、百度)

记住:词出现得多 + 词很特别 + 文档长度合适 = 高分文档!🎯