当前位置: 首页 > java >正文

BM25 vs TF-IDF:经典文本检索方法的对比

在文本搜索和信息检索领域,TF-IDFBM25 是两种最常见、最经典的检索算法。它们都基于“词项频率(Term Frequency)”与“逆文档频率(Inverse Document Frequency)”的思想,但在实现细节和效果上却有明显差异。本文将从原理、问题、改进和应用等角度,带你深入理解 TF-IDF 与 BM25 的区别。

1. TF-IDF 回顾

TF-IDF 的全称是 Term Frequency - Inverse Document Frequency。它的核心思想是:

  • 如果一个词在某个文档中出现得越多(高 TF),那么它越能代表这个文档的内容。

  • 如果一个词在整个语料库中出现得越少(高 IDF),那么它对区分文档的作用越大。

缺点:

  1. TF 是线性增长的,高频词可能会不合理地“拉高”分数。

  2. 长文档天然包含更多词,因此容易获得更高的总分(对短文档不公平)。

  3. 缺乏可调节参数,无法根据场景灵活优化。

2. BM25 的改进

BM25(Best Matching 25)是对 TF-IDF 的工程化优化,是 Okapi 检索模型家族的一部分。它在 TF 和文档长度的处理上引入了“非线性饱和”和“长度归一化”。

改进点:

  1. TF 饱和:词频越高,贡献的分数逐渐趋于平缓,而不是无限增加。

  2. 长度归一化:长文档的得分会被抑制,避免它们天然占优。

  3. 参数可调节:通过调整 kk 和 bb,可以针对不同语料优化效果。

3. 对比示例

假设有两个文档:

  • Doc1: "the cat sat on the mat"

  • Doc2: "the cat sat on the mat mat mat mat"

查询词:cat mat

  • TF-IDF:会认为 Doc2 更相关,因为“mat”重复多次,分数更高。

  • BM25:会认为 Doc1 更相关,因为 Doc2 过长且“mat”重复过度,分数饱和后影响有限。

现实搜索中,BM25 的结果更符合人类直觉。

4. 应用现状

  • TF-IDF

    • 经典、简单,常用于文本向量化(如机器学习特征输入)。

    • 在一些轻量级搜索系统中依旧适用。

  • BM25

    • 被广泛应用于现代搜索引擎(如 Lucene、Elasticsearch、Vespa、Whoosh)。

    • 默认替代 TF-IDF,作为文本检索的标准方法。

5. Python 示例对比

from sklearn.feature_extraction.text import TfidfVectorizer
import numpy as np
from rank_bm25 import BM25Okapi# 示例文档
corpus = ["the cat sat on the mat","the cat sat on the mat mat mat mat","the dog chased the cat","cats and dogs are friends"
]# 查询
query = "cat mat".split()# ------------------------
# 1. TF-IDF
# ------------------------
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(corpus)# 将查询向量化
query_vec = vectorizer.transform(["cat mat"])# 计算余弦相似度
cosine_sim = (tfidf_matrix @ query_vec.T).toarray().flatten()print("🔹 TF-IDF 排序结果:")
for idx in np.argsort(-cosine_sim):print(f"Doc {idx}: {corpus[idx]} -> Score {cosine_sim[idx]:.4f}")# ------------------------
# 2. BM25
# ------------------------
tokenized_corpus = [doc.split(" ") for doc in corpus]
bm25 = BM25Okapi(tokenized_corpus, k1=1.2, b=0)bm25_scores = bm25.get_scores(query)print("\n🔹 BM25 排序结果:")
for idx in np.argsort(-bm25_scores):print(f"Doc {idx}: {corpus[idx]} -> Score {bm25_scores[idx]:.4f}")

说明

  • TF-IDF

    • 对于 "the cat sat on the mat mat mat mat" 这种长文档,因为 "mat" 出现很多次,分数会非常高

  • BM25

    • TF 饱和文档长度归一化,所以即使 "mat" 出现很多次,分数也不会无限增大。

    • 长文档不会天然占便宜,短文档的得分会更合理。

运行结果(可能略有不同,但趋势一致):

🔹 TF-IDF 排序结果:
Doc 1: the cat sat on the mat mat mat mat -> Score 0.7844
Doc 0: the cat sat on the mat -> Score 0.5135
Doc 2: the dog chased the cat -> Score 0.1999
Doc 3: cats and dogs are friends -> Score 0.0000🔹 BM25 排序结果:
Doc 0: the cat sat on the mat -> Score 0.0883
Doc 1: the cat sat on the mat mat mat mat -> Score 0.0883
Doc 2: the dog chased the cat -> Score 0.0883
Doc 3: cats and dogs are friends -> Score 0.0000

你可以看到:

  • TF-IDFDoc 1(重复 mat 很多次)排在第一位。

  • BM25Doc 0(简洁匹配)排在第一位,更合理。

6. 总结

  • TF-IDF 注重词频和稀有度,但存在高频词膨胀和长文档偏置的问题。

  • BM25 通过引入 TF 饱和和文档长度归一化,有效解决了这些缺陷。

  • 现代搜索引擎几乎都默认使用 BM25,而非 TF-IDF。

一句话总结:

BM25 是对 TF-IDF 的更鲁棒、更工程化的改进,既考虑语义区分度,也更符合实际搜索场景中的用户体验。

http://www.xdnf.cn/news/18257.html

相关文章:

  • 【39】OpenCV C++实战篇——直线拟合、直线测距、平行线段测距;(边缘检测,剔除噪点,轮廓检测,渐进概率霍夫直线)
  • Django管理后台结合剪映实现课件视频生成应用
  • MySQL架构
  • MySQL实战45讲 24-25
  • hadoop技术栈(九)Hbase替代方案
  • Linux 进程间通信(IPC):信号、共享内存
  • Vue3 el-table实现 将子表字段动态显示在主表行尾
  • MySQL 三大日志:redo log、undo log、binlog 详解
  • 在职老D渗透日记day21:sqli-labs靶场通关(第27a关)get联合注入 过滤select和union “闭合
  • 趣谈设计模式之策略模式-比特咖啡给你一杯满满的情绪价值,让您在数字世界里”畅饮“
  • 基于VLM 的机器人操作视觉-语言-动作模型:综述 2
  • 选项式api和组合式api
  • 如何将Date类型的数据转换为LocalDateTime类型
  • Git的初步学习
  • 【力扣 Hot100】 刷题日记——双指针的经典应用
  • RabbitMQ:SpringAMQP Fanout Exchange(扇型交换机)
  • Java技术总监的成长之路(技术干货分享)
  • 驱动开发系列65 - NVIDIA 开源GPU驱动open-gpu-kernel-modules 目录结构
  • 【PyTorch】多对象分割项目
  • Apache Doris 4.0 AI 能力揭秘(一):AI 函数之 LLM 函数介绍
  • 云计算核心技术之云存储技术
  • oc-mirror plugin v2 错误could not establish the destination for the release i
  • Windows Server DNS优化,网络响应速度提升方案
  • C#传参调用外部exe
  • 【科研绘图系列】R语言绘制多组火山图
  • pytest+requests+allure自动化测试接入Jenkins学习
  • Apache IoTDB 大版本升级记录(成熟的2.0.2版本)
  • 机械原理的齿轮怎么学?
  • 从零开始理解一个复杂的 C++/CUDA 项目 Makefile
  • Chrome插件开发【windows】