BM25的简单计算实例


1. 核心思想

BM25 是一种用于信息检索 的算法,用来计算一个查询 (Query)和一个文档(Document)之间的相关性分数。它的核心思想是:

  • 词频越高,相关性可能越高,但收益会递减(避免过度依赖重复词)。
  • 文档长度:如果文档很长,词频高可能是正常的,所以会对长文档进行惩罚。
  • 逆文档频率:如果某个词在所有文档中都很常见(如"的"、"是"),那么它的区分度就低,权重应该小;反之,罕见词权重高。

2. 假设我们有一个微型文档库

文档库(3个文档):

  • D1 : 苹果 手机 很好 用
  • D2 : 苹果 是一种 水果
  • D3 : 手机 品牌 有 苹果 华为 小米

查询 Q : 苹果 手机


3. 步骤拆解

步骤1:对查询进行分词
  • 查询词:苹果手机
步骤2:计算逆文档频率(IDF)

IDF 公式(常见形式):

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

其中:

  • ( N ) = 文档总数(这里 ( N = 3 ))
  • ( n(q_i) ) = 包含词 ( q_i ) 的文档数量

计算:

  1. "苹果"

    • 出现在 D1、D2、D3 → ( n(\text{苹果}) = 3 )
    • ( IDF(\text{苹果}) = \log\left( \frac{3 - 3 + 0.5}{3 + 0.5} + 1 \right) = \log\left( \frac{0.5}{3.5} + 1 \right) = \log(1.1429) \approx 0.1335 )
      (说明:因为"苹果"出现在所有文档,IDF 很低,区分度小。)
  2. "手机"

    • 出现在 D1、D3 → ( n(\text{手机}) = 2 )
    • ( IDF(\text{手机}) = \log\left( \frac{3 - 2 + 0.5}{2 + 0.5} + 1 \right) = \log\left( \frac{1.5}{2.5} + 1 \right) = \log(1.6) \approx 0.4700 )
步骤3:为每个文档计算每个查询词的得分

BM25 公式(简化常用版):

\\text{Score}(D, Q) = \\sum_{i=1}\^{n} IDF(q_i) \\cdot \\frac{f(q_i, D) \\cdot (k_1 + 1)}{f(q_i, D) + k_1 \\cdot \\left(1 - b + b \\cdot \\frac{\|D\|}{\\text{avgdl}}\\right)}

其中:

  • ( f(q_i, D) ) = 词 ( q_i ) 在文档 D 中出现的次数
  • ( |D| ) = 文档 D 的长度(词数)
  • avgdl = 所有文档的平均长度
  • ( k_1 ) 和 ( b ) 是超参数,通常 ( k_1 \in [1.2, 2.0] ),( b = 0.75 ),这里我们取 ( k_1 = 1.2, b = 0.75 )。

先计算 avgdl:

  • D1 长度 = 4
  • D2 长度 = 4
  • D3 长度 = 6
  • 总词数 = 14,平均长度 avgdl = 14 / 3 ≈ 4.667

步骤4:逐文档计算

D1:苹果 手机 很好 用

  • 长度 = 4
  • "苹果" f = 1
  • "手机" f = 1

对于"苹果":

\\text{TF 部分} = \\frac{1 \\times (1.2+1)}{1 + 1.2 \\times \\left(1 - 0.75 + 0.75 \\times \\frac{4}{4.667}\\right)}

先算括号内:

( 1 - b = 0.25 )

( b \cdot \frac{|D|}{\text{avgdl}} = 0.75 \times \frac{4}{4.667} \approx 0.75 \times 0.857 = 0.64275 )

所以 ( 1 - b + b \cdot \frac{|D|}{\text{avgdl}} \approx 0.25 + 0.64275 = 0.89275 )

分母:( 1 + 1.2 \times 0.89275 \approx 1 + 1.0713 = 2.0713 )

分子:( 1 \times 2.2 = 2.2 )

TF 部分 ≈ ( 2.2 / 2.0713 \approx 1.062 )

乘以 IDF:( 1.062 \times 0.1335 \approx 0.1418 )

对于"手机":

同样 f=1,文档长度和上面一样,所以 TF 部分也是 ≈ 1.062

乘以 IDF(手机) = ( 1.062 \times 0.4700 \approx 0.4991 )

D1 总分 = 0.1418 + 0.4991 ≈ 0.6409


D2:苹果 是一种 水果

  • 长度 = 4
  • "苹果" f = 1,"手机" f = 0(不出现则该项为 0)

"苹果"部分计算:

文档长度与 D1 相同,所以 TF 部分 ≈ 1.062(同上)

乘以 IDF(苹果) ≈ 0.1418

"手机"得分 = 0

D2 总分0.1418


D3:手机 品牌 有 苹果 华为 小米

  • 长度 = 6
  • "苹果" f = 1,"手机" f = 1

先算长度归一化部分:

( 1 - b + b \cdot \frac{6}{4.667} = 0.25 + 0.75 \times 1.2856 \approx 0.25 + 0.9642 = 1.2142 )

对于"苹果"(f=1):

分母:( 1 + 1.2 \times 1.2142 \approx 1 + 1.4570 = 2.4570 )

分子:( 1 \times 2.2 = 2.2 )

TF 部分 ≈ ( 2.2 / 2.4570 \approx 0.8954 )

乘以 IDF(苹果):( 0.8954 \times 0.1335 \approx 0.1195 )

对于"手机"(f=1,文档长度一样所以 TF 部分相同 0.8954):

乘以 IDF(手机):( 0.8954 \times 0.4700 \approx 0.4208 )

D3 总分 = 0.1195 + 0.4208 ≈ 0.5403


5. 排序结果

  • D1:0.6409
  • D3:0.5403
  • D2:0.1418

所以对于查询"苹果 手机",最相关的文档是 D1("苹果 手机 很好 用"),因为它同时包含两个词且文档长度适中;D3 虽然也包含两个词,但文档更长,受到了长度惩罚;D2 只包含一个词,得分最低。


6. 直观理解

  • "手机"的 IDF 比"苹果"高,因为"苹果"在三个文档都出现,区分度低。
  • D1 长度短,两个词出现一次,因此权重高;D3 长度长,同样频次下分数降低(BM25 认为长文档可能包含更多无关内容,需要惩罚)。
  • BM25 平衡了词频、文档长度、全局词分布,比单纯用 TF-IDF 更健壮。

这就是 BM25 的一个简单手工计算示例。实际应用中,参数可能调整,并且会预先构建倒排索引加速计算。

相关推荐
简简单单做算法18 小时前
基于GA遗传优化的Transformer-LSTM网络模型的时间序列预测算法matlab性能仿真
深度学习·matlab·lstm·transformer·时间序列预测·ga遗传优化·电池剩余寿命预测
龙文浩_18 小时前
AI中NLP的文本张量表示方法在自然语言处理中的演进与应用
人工智能·pytorch·深度学习·神经网络·自然语言处理
极光代码工作室19 小时前
基于BERT的新闻文本分类系统
深度学习·nlp·bert·文本分类
XINVRY-FPGA19 小时前
XC7VX690T-2FFG1157I Xilinx AMD Virtex-7 FPGA
arm开发·人工智能·嵌入式硬件·深度学习·fpga开发·硬件工程·fpga
AI视觉网奇20 小时前
生成GeoGebra
人工智能·深度学习
古希腊掌管代码的神THU20 小时前
【清华代码熊】图解 Gemma 4 架构设计细节
人工智能·深度学习·自然语言处理
Purple Coder20 小时前
7-RNN 循环网络层
人工智能·rnn·深度学习
大写的z先生20 小时前
【深度学习 | 论文精读】Qwen-VL:从“纯文本”到“火眼金睛”,通向多模态大模型的进阶之路
人工智能·深度学习
workflower21 小时前
深度学习是通用型人工智能的基础
人工智能·深度学习·设计模式·软件工程·软件构建·制造
卡梅德生物科技小能手21 小时前
CD40LG(CD40配体)靶点深度解析:免疫调控机制与抗体药物工程化策略
经验分享·深度学习·生活