TF-IDF 与 BM25:经典信息检索算法详解
前言
开放域问答(Open-Domain Question Answering, ODQA)中的检索通常使用 TF-IDF 或 BM25 来实现,它通过倒排索引有效地匹配关键字,可以看作是用高维稀疏向量(带加权)表示问题和上下文。
一、TF-IDF
TF-IDF(词频 - 逆文档频率)是信息检索领域最经典的特征加权方法,用于衡量一个词在文档中的重要程度。
1.1 核心公式
TF-IDF 的核心公式如下所示:
TF(t,D) = f_{t,D} / |D|
IDF(t,D) = log(N / n_t)
其中:
- n_t:包含词项 t 的文档数
- N:语料库中文档总数
- |D|:文档 D 的总词数(文档长度)
- f_{t,D}:词项 t 在文档 D 中的出现次数
- D:当前文档(document)
- t:词项(term)
- Q:完整的查询
1.2 举例说明
假设查询为'苹果手机'。
有以下三个文档库:
- D1:'苹果公司发布了新款手机,这款手机搭载了先进芯片。'
- D2:'今天吃了一个红苹果,非常甜。'
- D3:'手机市场竞争激烈,苹果手机销量领先。'
(1)首先使用分词库(例如 jieba 中文分词)对文档进行分词:
- D1:["苹果", "公司", "发布", "新款", "手机", "手机", "搭载", "先进", "芯片"](总词数 9)
- D2:["今天", "吃", "红", "苹果", "非常", "甜"](总词数 6)
- D3:["手机", "市场", "竞争", "激烈", "苹果", "手机", "销量", "领先"](总词数 8)
(2)计算 TF: 计算各个词项 t 对各个文档的 TF:
- D1:TF(苹果,D1) = 1/9 ≈ 0.111; TF(手机,D1) = 2/9 ≈ 0.222
- D2:TF(苹果,D2) = 1/6 ≈ 0.167; TF(手机,D2) = 0/6 = 0
- D3:TF(苹果,D3) = 1/8 = 0.125; TF(手机,D3) = 2/8 = 0.250
(3)计算 IDF:
- 包含"苹果"的文档数:n_苹果 = 3
- 包含"手机"的文档数:n_手机 = 2
- IDF(苹果) = log(3/3) = 0
- IDF(手机) = log(3/2) ≈ 0.176
(4)计算各个词项 t 对各个文档的 TF-IDF:
- D1:TF-IDF(苹果,D1) = 0.111 × 0 = 0; TF-IDF(手机,D1) = 0.222 × 0.176 ≈ 0.039
- D2:TF-IDF(苹果,D2) = 0.167 × 0 = 0; TF-IDF(手机,D2) = 0
- D3:TF-IDF(苹果,D3) = 0.125 × 0 = 0; TF-IDF(手机,D3) = 0.250 × 0.176 ≈ 0.044
(5)文档 - 查询相关性得分: 将查询中所有词项 t 的 TF-IDF 值相加:
- D1 得分 = 0 + 0.039 = 0.039
- D2 得分 = 0 + 0 = 0
- D3 得分 = 0 + 0.044 = 0.044
排序结果:D3 > D1 > D2
二、BM25
BM25(Best Matching 25)是 TF-IDF 的改进版本,通过引入非线性词频处理和文档长度归一化,显著提升了检索效果。
2.1 核心公式
BM25 的核心公式如下所示:
Score(Q, D) = sum(IDF(t) * (f_{t,D} * (k_1 + 1)) / (f_{t,D} + k_1 * (1 - b + b * |D| / avgdl)))
IDF(t):逆文档频率,衡量词 t 的全局重要性。公式如下: IDF(t) = log((N - n_t + 0.5) / (n_t + 0.5))
参数说明:

