⚖️ BM25归一化公式

让长文档和短文档公平竞争!

第一步:为什么需要归一化?

🏃‍♂️ 想象一场不公平的比赛

假设你要找关于"苹果"的文档:

📄 短文档(100字): 提到"苹果" 5次
📚 长文档(10000字): 提到"苹果" 50次

如果只看次数,长文档得分更高!但这样公平吗?
短文档每20字就提到1次,长文档每200字才提到1次!
短文档明显更相关,但长文档因为"词多"占了便宜!

🎯 归一化要解决的问题

  • 问题: 长文档容易包含更多关键词,但不一定更相关
  • 解决: 归一化让长文档和短文档公平竞争
  • 💡 方法: 不是看"绝对数量",而是看"相对密度"

第二步:生活中的类比

📊 类比1:考试正确率

考试A: 10道题,答对8道 → 正确率80%
考试B: 100道题,答对60道 → 正确率60%

只看答对数量,考试B更多,但考试A正确率更高!

🏀 类比2:投篮命中率

球员A: 投10次,中8次 → 命中率80%
球员B: 投100次,中60次 → 命中率60%

只看进球数,球员B更多,但球员A命中率更高!
归一化就像看"正确率"或"命中率",而不是只看"绝对数量"!

第三步:BM25归一化公式

归一化项公式:

$$\text{归一化项} = 1 - b + b \times \frac{\text{文档长度}}{\text{平均文档长度}}$$

🔍 公式拆解

公式的每个部分:

  1. 文档长度: 当前文档有多少个词
  2. 平均文档长度: 所有文档的平均词数
  3. b(平衡参数): 控制归一化的强度(通常取0.75)
  4. 1 - b: 基础值,保证归一化项不会太小
  5. b × (文档长度/平均长度): 根据文档长度调整的部分

📐 参数b的作用

b = 0: 不做归一化,所有文档同等对待
b = 0.75: 部分归一化(默认值,效果最好)
b = 1: 完全归一化,长文档影响最大
就像调节"公平程度"的旋钮:b越大,对长文档的"惩罚"越重!

第四步:看图表理解

📊 归一化项随文档长度变化

横轴是文档长度,纵轴是归一化项的值:

归一化项 < 1:短文档,分数会提高(占优势)
归一化项 = 1:平均长度文档,分数不变
归一化项 > 1:长文档,分数会降低(被惩罚)

第五步:具体计算例子

📝 场景设置

假设文档库的平均长度是 100词,参数 b = 0.75

📄 短文档(50词)

计算过程:

归一化项 = $1 - 0.75 + 0.75 \times \frac{50}{100}$

= $0.25 + 0.75 \times 0.5$

= $0.25 + 0.375$

= 0.625

✅ 归一化项 < 1,分母变小,分数提高!

📚 长文档(200词)

计算过程:

归一化项 = $1 - 0.75 + 0.75 \times \frac{200}{100}$

= $0.25 + 0.75 \times 2$

= $0.25 + 1.5$

= 1.75

❌ 归一化项 > 1,分母变大,分数降低!

第六步:动手试试!

🎮 实时计算归一化项

0.75

第七步:归一化在BM25中的作用

🔧 归一化项如何影响分数?

在BM25公式中,归一化项放在分母里:

$$\text{调整后的词频} = \frac{\text{TF} \times (k_1 + 1)}{\text{TF} + k_1 \times \text{归一化项}}$$

关键理解:

  1. 归一化项小(短文档): 分母小 → 分数大 ✅
  2. 归一化项大(长文档): 分母大 → 分数小 ❌
  3. 归一化项=1(平均长度): 分数不变 ⚖️

💡 形象理解

想象你在分蛋糕:

短文档: 归一化项小 = 分母小 = 分到的蛋糕多 🍰
长文档: 归一化项大 = 分母大 = 分到的蛋糕少 🍰

这样短文档和长文档就能公平竞争了!

🎉 总结

归一化的目的: 让长文档和短文档公平竞争

归一化公式: $1 - b + b \times \frac{\text{文档长度}}{\text{平均长度}}$

归一化项 < 1: 短文档,分数提高(占优势)

归一化项 > 1: 长文档,分数降低(被惩罚)

参数b: 控制归一化强度,默认0.75效果最好

记住:归一化就是让不同长度的文档可以公平比较!⚖️