让长文档和短文档公平竞争!
假设你要找关于"苹果"的文档:
📄 短文档(100字): 提到"苹果" 5次
📚 长文档(10000字): 提到"苹果" 50次
如果只看次数,长文档得分更高!但这样公平吗?
短文档每20字就提到1次,长文档每200字才提到1次!
短文档明显更相关,但长文档因为"词多"占了便宜!
归一化项公式:
$$\text{归一化项} = 1 - b + b \times \frac{\text{文档长度}}{\text{平均文档长度}}$$横轴是文档长度,纵轴是归一化项的值:
计算过程:
归一化项 = $1 - 0.75 + 0.75 \times \frac{50}{100}$
= $0.25 + 0.75 \times 0.5$
= $0.25 + 0.375$
= 0.625
✅ 归一化项 < 1,分母变小,分数提高!
计算过程:
归一化项 = $1 - 0.75 + 0.75 \times \frac{200}{100}$
= $0.25 + 0.75 \times 2$
= $0.25 + 1.5$
= 1.75
❌ 归一化项 > 1,分母变大,分数降低!
在BM25公式中,归一化项放在分母里:
想象你在分蛋糕:
短文档: 归一化项小 = 分母小 = 分到的蛋糕多 🍰
长文档: 归一化项大 = 分母大 = 分到的蛋糕少 🍰
这样短文档和长文档就能公平竞争了!
✅ 归一化的目的: 让长文档和短文档公平竞争
✅ 归一化公式: $1 - b + b \times \frac{\text{文档长度}}{\text{平均长度}}$
✅ 归一化项 < 1: 短文档,分数提高(占优势)
✅ 归一化项 > 1: 长文档,分数降低(被惩罚)
✅ 参数b: 控制归一化强度,默认0.75效果最好
记住:归一化就是让不同长度的文档可以公平比较!⚖️