掌握 BM25:深入了解算法及其在 Milvus 中的应用

我们可以通过 Milvus 轻松实现 BM25 算法,将文档和查询转化为稀疏向量。然后,这些稀疏向量可用于向量搜索,根据特定查询找到最相关的文档。

信息检索算法在搜索引擎中非常重要,可确保搜索结果与用户的查询相关。

想象一下,我们正在寻找一个特定主题的研究论文。当我们在搜索引擎中输入 "RAG "作为关键词时,我们显然希望得到的是关于不同 RAG 方法的论文集,而不是其他一般的 NLP 方法。这就是信息检索算法发挥作用的地方。它们能确保我们获得与关键词高度相关的论文。

有两种常用的信息检索算法:TF-IDF 和 BM25。在本文中,我们将讨论有关 BM25 的一切。不过,在深入探讨之前,我们最好先了解一下 TF-IDF 的基本原理,因为 BM25 基本上是 TF-IDF 的扩展。

TF-IDF 的基本原理

词频-反向文档频率(TF-IDF)是一种基于统计方法的信息检索算法。它衡量文档中的关键词相对于文档集合的重要性。

从其名称可以看出,TF-IDF 由两部分组成:术语频率(TF)和反向文档频率(IDF)。它们衡量的是不同的方面,但最终,我们会将这两个部分相乘,得到最终的分数,从而估算出文档中某个词的相关性。

传统 TF-IDF 的 TF 部分衡量文档中特定关键词的出现率。

上述等式非常直观:我们在文档中找到的关键词实例越多,TF 值就越高。

另一方面,IDF 部分衡量的是包含关键词的文档在文档集中所占的比例。换句话说,这一部分告诉我们有多少文档中出现了我们的关键词。

我们可以看到,关键词在文档中出现的频率越高,其 IDF 分数就越低。这是因为我们要惩罚 “a”、“an”、"is "等常用词,因为它们往往出现在许多文档中。

计算完 TF 和 IDF 分量后,我们将结果相乘,得到关键词的最终 TF-IDF 分数。

从上面的最后一个等式中,我们可以看出,TF-IDF 能够捕捉到关键词的重要性,如果关键词在某一文档中出现的频率很高,而在其他文档中出现的频率却很低,那么它就会获得更高的分数。

在给定用户关键词或查询时,搜索引擎可以使用 TF-IDF 分数来衡量关键词与文档集之间的相关性。然后,搜索引擎可以对文档进行排序,并将最相关的文档呈现给用户。

TF-IDF 的问题

TF-IDF 公式有两个问题可以改进。

首先,假设我们有一个查询词 "兔子 "和两个要比较的文档。在文档 A 中,"兔子 "出现了 10 次,而该文档有 1000 个单词。另一方面,我们的关键词在文档 B 中只出现了一次,而该文档有 10 个单词。

仔细观察后,我们就会发现 TF-IDF 的局限性。文档 A 的 TF 得分为 10,而文档 B 的得分为 1。因此,与文档 B 相比,文档 A 将被推荐给我们。

但是,如果考虑到文件的长度,我们可能会说,与文件 A 相比,我们更喜欢文件 B。

如果一篇文档很短,但只出现了一次 “兔子”,那就更能说明该文档确实在谈论兔子。反之,如果一篇文档有数千字,但其中有 10 次提到 “兔子”,我们就不能确定该文档是否具体谈论了兔子。

为了解决这个问题,TF-IDF 的规范化变体将 TF 除以文档长度。这样,TF 部分的 TF 等式就是这样的:

但仍有一个问题需要优化,那就是关键词饱和度。

如果我们看一下 TF-IDF 的 TF 部分,我们在文档中找到的关键词越多,TF 就会越高。这种关系是线性的,这似乎是件好事,因为我们希望不断奖励包含我们关键词的文档。但是,如果我们在一篇文档中找到关键词 "兔子 "400 次,这是否真的意味着这篇文档的相关性是另一篇只出现 200 次的文档的两倍呢?

我们可以说,如果关键字 "兔子 "在一篇文档中出现了这么多次,我们就可以说这篇文档肯定与我们的关键字相关。该文档中关键词的额外出现次数不应该线性地增加其相关性的可能性。

文档中关键字出现次数从 2 次到 4 次所造成的分数跃升应该比从 200 次到 400 次的跃升影响更大。而这正是 TF-IDF 公式目前所缺少的。

从上面的可视化图中可以看到,由于我们将文档中的字数固定为 100,TF-IDF 的 TF 分数随着关键词出现率的增加而线性增加。

那么,我们该如何改进 TF-IDF 呢?这就是我们需要 BM25 算法的地方。

BM25 的基本原理

最佳匹配 25 (BM25) 算法可以看作是对传统 TF-IDF 算法的改进,它解决了上一节提到的所有问题。

我们先来讨论关键词饱和的问题。TF-IDF 的 TF 部分会随着文档中关键词出现次数的增加而线性增长。从 2 个关键词到 4 个关键词的得分跃升与从 50 个关键词到 52 个关键词的得分跃升相同。

与 TF-IDF 相比,BM25 为 TF 部分引入了一个略有不同的公式,我们将逐一慢慢揭示每个组成部分,以便让我们更容易理解引擎盖下发生了什么。

首先,BM25 在其 TF 公式中引入了一个新参数,而不是仅仅依赖关键词的出现次数:

上述参数 k 的作用是控制关键词每次递增对 TF 分数的贡献。让我们看看下面的可视化图,了解 k 的影响。

正如您所看到的,最初出现的几个关键词对整体 TF 分数的影响很大。但是,随着我们的关键词在文档中出现的次数越来越多,它对整体 TF 分数的贡献就变得越来越无关紧要了。k 值越大,每次出现的关键词对 TF 分数的贡献增长就越慢。这就解决了 TF-IDF 与关键词饱和度相关的缺点。

与传统的 TF-IDF 相比,BM25 的另一个基本改进是 BM25 将文档长度考虑在内。有了 BM25,包含一个关键词的 10 字文档会比包含 10 个关键词的 1000 字文档更有价值。

术语 ∣D∣ 代表文档长度,而 avg(D) 代表语料库中文档的平均长度。我们已经可以看到文档标准化对 k 参数的影响。如果文档比平均长度短,TF/(TF+k)的值就会增加,反之亦然。换句话说,较短的文档会比较长的文档更快接近饱和点。

不过,我们不能以同样的方式对待所有语料库。在某些语料库中,文档的长度非常重要,而在另一些语料库中,文档的长度则根本不重要。因此,我们在 TF 公式中引入了一个附加参数 b,以控制文档长度在总分中的重要性。


我们可以看到,如果我们将 b 的值设置为 0,那么 D/avgD 的比值就根本不会被考虑,这意味着我们并不重视文档的长度。而值为 1 则表示我们非常重视文档的长度。

以上等式是 BM25 中使用的 TF 部分的最终等式。那么 IDF 部分呢?

BM25 的 IDF 部分方程与 TF-IDF 稍有不同。BM25 的 IDF 公式定义如下:

其中,N 是语料库中的文档总数,DF 是包含关键词的文档数量。上述等式源于研究人员的经验观察,他们希望能推导出一个能够捕捉排

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值