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

相关推荐
洛阳泰山14 分钟前
别再为做 AI 去学 Python 了!MaxKB4j:纯 Java 造的企业级 RAG + 工作流引擎,开箱即用
人工智能·开源·agent
fthux25 分钟前
GitZip Pro:给GitHub仓库“瘦身”的魔法剪刀手
人工智能·chrome·ai·语言模型·开源·github·open source
武子康33 分钟前
Video VAE 不是末端编解码器:5 维-潜网格-主模型 Token 的“表示合同“
人工智能·llm·agent
Sunlly35 分钟前
Transcript 不是 Context:用五组实验拆解 OpenClaw 的上下文生命周期
人工智能
ttwuai37 分钟前
AI 生成后台改数据后,操作日志别只记按钮:Go + MySQL 怎么验
数据库·人工智能·mysql·golang
糖果店的幽灵1 小时前
我用 Codex + Remotion,做了一条唐朝纸片分层动画
人工智能
KaMeidebaby1 小时前
卡梅德生物技术快报 | 核酸适配体文库测序:核酸适配体文库测序的技术原理、实验流程与数据解析
前端·网络·数据库·人工智能·算法
阿里云大数据AI技术1 小时前
AI 时代,零售商超如何用多模态数据"看见"每一排货架?
人工智能
一RTOS一1 小时前
【无标题】
人工智能·鸿道实时操作系统·国产嵌入式操作系统选型·智算控一体
cian_2 小时前
我把 Anthropic 官方的 Claude Cookbook 拆成了 30+ 个能直接跑的例子
人工智能