第二步:三个重要概念
1️⃣ 词频(TF)- 这个词出现了几次?
就像数数一样简单!
例子: 文档:"我喜欢苹果,苹果很好吃,苹果很甜"
"苹果"出现了 3次,所以 TF = 3
词出现得越多,说明这个文档和这个词越相关!
2️⃣ 逆文档频率(IDF)- 这个词有多特别?
如果所有书都有"的"这个词,那"的"就不特别。但如果只有几本书有"苹果",那"苹果"就很特别!
例子: 图书馆有100本书
- "的"出现在90本书里 → 很普通,IDF很小
- "苹果"只出现在5本书里 → 很特别,IDF很大
IDF = log(总文档数 ÷ 包含该词的文档数)
越稀有的词,IDF越大,越能帮你找到真正相关的文档!
3️⃣ 文档长度归一化 - 公平竞争
就像比赛时,不能让长跑选手和短跑选手直接比速度,要公平!
问题: 长文档(1000字)更容易包含查询词,这不公平!
解决: BM25会"惩罚"长文档,让短文档和长文档公平竞争
第四步: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(词的稀有程度)× 调整后的词频(考虑饱和和文档长度)
词出现得多 + 词很特别 + 文档长度合适 = 高分文档!🎯