TF-IDF / BM25:经典的传统信息检索算法

前言

开放域问答(Open-Domain Question Answering, ODQA)中的检索通常使用TF-IDF或BM25来实现,它通过倒排索引有效地匹配关键字,可以看作是用高维稀疏向量(带加权)表示问题和上下文。


一、TF-IDF

TF-IDF(词频-逆文档频率)是信息检索领域最经典的特征加权方法,用于衡量一个词在文档中的重要程度。

1.1 核心公式

TF-IDF的核心公式如下所示:

等式右边的第一项为,第二项为。其中:

  • :完整的查询

  • :词项(term)

  • :当前文档(document)

  • :词项 在文档 中的出现次数

  • :文档 的总词数(文档长度)

  • :语料库中文档总数

  • :包含词项 的文档数


1.2 举例说明

假设查询为 "苹果手机"

有以下三个文档库:

D1:"苹果公司发布了新款手机,这款手机搭载了先进芯片。"

D2:"今天吃了一个红苹果,非常甜。"

D3:"手机市场竞争激烈,苹果手机销量领先。"

(1)首先使用分词库(例如jieba中文分词)对文档进行分词:

D1:["苹果", "公司", "发布", "新款", "手机", "手机", "搭载", "先进", "芯片"](总词数 9)

D2:["今天", "吃", "红", "苹果", "非常", "甜"](总词数 6)

D3:["手机", "市场", "竞争", "激烈", "苹果", "手机", "销量", "领先"](总词数 8)

(2)计算TF:

计算各个词项 对各个文档的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

(4)计算各个词项 对各个文档的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)文档-查询相关性得分:

将查询中所有词项 的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的核心公式如下所示:

  • 表示文档, 表示查询,​ 为查询中的词项。

  • :词项 在文档 中的出现次数。

  • :文档长度(单词数)。

  • :语料库中所有文档的平均长度。

  • :控制词频饱和度的参数(通常取 1.2~2.0)。

  • :控制文档长度归一化强度的参数(通常取 0.75)。

  • :逆文档频率,衡量词 ​ 的全局重要性。公式如下:

其中 是文档总数, 是包含词项 的文档数。


2.2 举例说明

假设查询为 "苹果手机"

有以下三个文档库:

D1:"苹果公司发布了新款手机,这款手机搭载了先进芯片。"

D2:"今天吃了一个红苹果,非常甜。"

D3:"手机市场竞争激烈,苹果手机销量领先。"

(1)首先使用分词库(例如jieba中文分词)对文档进行分词:

D1:["苹果", "公司", "发布", "新款", "手机", "手机", "搭载", "先进", "芯片"](总词数 9)

D2:["今天", "吃", "红", "苹果", "非常", "甜"](总词数 6)

D3:["手机", "市场", "竞争", "激烈", "苹果", "手机", "销量", "领先"](总词数 8)

(2)计算基础统计量:

  • 文档总数

  • 各文档长度:

  • 平均长度

  • 设为 (经典默认值)

(3)计算TF:

假设,计算各个词项 对各个文档的TF:

D1:

苹果 = 1,手机 = 2

  • TF(苹果, D1)

  • TF(手机, D1)

D2:

苹果 = 1,手机 = 0

  • TF(苹果, D2)

  • TF(手机, D2) = 0

D3:

苹果 = 1,手机 = 2

  • TF(苹果, D3)

  • TF(手机, D3)

(4)计算IDF:

  • 包含"苹果"的文档数:n_苹果 = 3

  • 包含"手机"的文档数:n_手机 = 2

(5)计算各个词项 对各个文档的TF-IDF:

D1:

  • TF-IDF(苹果, D1) = 0.9275 × 0.05799 ≈ 0.05378

  • TF-IDF(手机, D1) = 1.3527 × 0.20412 ≈ 0.2760

D2:

  • TF-IDF(苹果, D2) = 1.1084 × 0.05799 ≈ 0.06427

  • TF-IDF(手机, D2) = 0 × -0.2218 ≈ 0

D3:

  • TF-IDF(苹果, D3) = 0.9808 × 0.05799 ≈ 0.05687

  • TF-IDF(手机, D3) = 1.4089 × 0.20412 ≈ 0.28748

(6)文档-查询相关性得分:

将查询中所有词项 的TF-IDF值相加(即求和):

  • D1得分 = 0.05378 + 0.2760 = 0.32978

  • D2得分 = 0.06427 + 0 = 0.06427

  • D3得分 = 0.05687 + 0.28748 = 0.34435

排序结果:D3 > D1 > D2

相关推荐
Mintopia13 分钟前
OpenClaw 对软件行业产生的影响
人工智能
陈广亮1 小时前
构建具有长期记忆的 AI Agent:从设计模式到生产实践
人工智能
会写代码的柯基犬1 小时前
DeepSeek vs Kimi vs Qwen —— AI 生成俄罗斯方块代码效果横评
人工智能·llm
Mintopia1 小时前
OpenClaw 是什么?为什么节后热度如此之高?
人工智能
爱可生开源社区2 小时前
DBA 的未来?八位行业先锋的年度圆桌讨论
人工智能·dba
叁两4 小时前
用opencode打造全自动公众号写作流水线,AI 代笔太香了!
前端·人工智能·agent
前端付豪5 小时前
LangChain记忆:通过Memory记住上次的对话细节
人工智能·python·langchain
strayCat232555 小时前
Clawdbot 源码解读 7: 扩展机制
人工智能·开源
王鑫星5 小时前
SWE-bench 首次突破 80%:Claude Opus 4.5 发布,Anthropic 的野心不止于写代码
人工智能