BM25 算法原理探索

在 RAG 技术中,有使用 BM25 算法去检索相关文档,那么他的原理是怎样的?

BM25(Best Matching 25)是一种用于信息检索的算法,广泛应用于搜索引擎和文本挖掘领域。它是对 TF-IDF(词频 - 逆文档频率)模型的改进,主要通过引入文档长度归一化和词频饱和机制,更准确地评估文档与查询之间的相关性

原理

  1. 逆文档频率(IDF)
    用于衡量一个词的 “稀有性”。如果一个词在较少的文档中出现,其 IDF 值越高,表明这个词具有更好的区分能力。

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

其中,N 是文档总数,n (qi​) 是包含词 qi​ 的文档数

  1. 词频(TF)调整
    BM25 引入了词频饱和机制,避免长文档因词频过高而获得不合理的高分

BM25(qi,d)=IDF(qi)(k1+1)TF(qi,d)TF(qi,d)+k1(1b+bdavgdi)BM25(q_i,d) = \text{IDF}(q_i) \cdot \frac{(k_1 + 1) \cdot \text{TF}(q_i,d)}{\text{TF}(q_i,d) + k_1 \cdot (1 - b + b \cdot \frac{d}{\text{avgdi}})}

其中 TF(qi,d)TF(q_i,d) 表示词汇 qi 在文档 d 中出现的次数,k1 和 b 是可调参数,|d | 是文档长度,avgdl 是文档平均长度

  1. 文档长度归一化
    BM25 通过文档长度归一化处理,使得文档长度对权重的影响是非线性的。这避免了长文档仅因词数多而得分更高的问题,即以上公式的 davgdi\frac{d}{\text{avgdi}}

  2. 查询与文档的相关性
    对于一个查询 Q 和文档 d,BM25 的最终得分是查询中每个词与文档相关性的累加

BM25(Q,d)=i=1nBM25(qi,d)BM25(Q,d) = \sum_{i=1}^{n} BM25(q_i,d)

n 表示 Q 中的词汇数量

例子

假设我们有以下文档集合(3 篇文档)和一个查询:

文档集合:

  1. 文档 D1"苹果 苹果 苹果"(3 个词,文档长度为 3)
  2. 文档 D2"苹果"(1 个词,文档长度为 1)
  3. 文档 D3"苹果 香蕉"(2 个词,文档长度为 2)

查询 Q"苹果"

  1. 计算 IDF
    首先,我们需要计算查询词 “苹果” 的逆文档频率(IDF)

IDF("苹果")log(33+0.53+0.5)=log(0.53.5)=log(0.1429)1.90IDF ("苹果") 的 \log \left ( \frac {3 - 3 + 0.5}{3 + 0.5} \right) = \log \left ( \frac {0.5}{3.5} \right) = \log (0.1429) \approx -1.90

注意:这里的 IDF 值是负数,因为 “苹果” 在所有文档中都出现了。在实际应用中,IDF 通常取正值,可以通过调整公式或对结果取绝对值来处理。

  1. 计算文档长度相关参数

接下来,计算文档长度相关的参数

avgdl=D1+D2+D33=3+1+23=2avgdl = \frac{D1 + D2 + D3} {3} = \frac{3 + 1 + 2}{3} = 2

  1. 计算 BM25 分数
    假设参数 k1​=1.2 和 b=0.75,我们分别计算每个文档的 BM25 分数
计算
BM25("苹果",D1)BM25 ("苹果",D1)2.62
BM25("苹果",D2)BM25 ("苹果",D2)2.41
BM25("苹果",D3)BM25 ("苹果",D3)1.9
D3 中包含 “苹果” 和 “香蕉”,而查询只关心 “苹果”,因此 D3 的相关性不如 D1 和 D2。

注:实际情况,查询 Q 可能包含多个词汇