Navigation
Share
Breadcrumb

TF-IDF和BM25词匹配算法

[Ash]

​参考:王树森【文本匹配(TF-IDF、BM25、词距)】


TF-IDF

假设我们有一个Query和一个Document,Query通过分词技术分成了许多小的term:

$$ \mathcal{Q}=[\text{Hollywood},\text{Movie},\text{Recommend}] $$

TF: Term Frequency(词频)

其中term就是每一个单词,例如 $t=\text{Hollywood}$,词 $t$ 在文档$d$中出现的次数叫做词频,记作 $tf_{t,d}$,该项越大,说明词和文档越相关。$\sum_{t\in\mathcal{Q}}tf_{t,d}$ 越大,则Query和文档越相关。


文档长度对于词频的影响:$tf$ 是文档中某个词出现的次数,因此如果文档 $d$ 越长,词语 $t$ 在其中出现的次数(即 $tf$ 值)可能会更大。这意味着较长的文档可能会因为它们的长度而获得更高的 $tf$ 值,而不是因为它们与该词语真正相关.

为了消除影响,我们也可以对文档长度进行归一化,也就是:

$$ tf = \sum_{t\in\mathcal{Q}}\frac{tf_{t,d}}{l_d} $$

IDF: Inverse Document Frequency

对不同的分词,我们应该给予不同的权重,而这个权重代表了它们各自的重要性,比如在这个例子里,重要性应该是: $$ \text{Hollywood} > \text{Movie} > \text{Recommend} $$

怎么来的呢?在embedding model等新技术没有出来之前,不能进行语义分析,只有通过词在文档中出现的频率来分析。

比如一个词语在多个文档中出现,那么意味着他可能比较泛化,such as “的”,“it“,”so“。而真正重要的词语往往出现的比较少,比如这里的”Hollywood“,因此出现了 IDF 来作为重要性评判标准。

$$ idf_t = log\frac{N}{df_t} $$

其中 $df_t$ 介于 $0$ 到 $N$ 之间,代表了词 $t$ 在多少文档中出现过(假设一共有 $N$ 篇文档),$df_t$ 越大,表示出现的次数越多,应该设置较小的权重,因此使用倒数。至于为什么使用对数,GPT-4o的回答:

- 缩小差距:对数函数能够将数值范围缩小。当我们计算 IDF 时,通常会得到较大的值(尤其是当某个词只出现在少数几个文档中时)。通过对数缩小这些差距,能够使得 IDF 值更容易处理,避免过大的数值影响计算稳定性。

- 平滑效果:使用对数可以平滑 IDF 值的分布,使得变化更加渐进而不是线性。这种平滑有助于降低极端值对模型的影响。

- 适度惩罚:IDF 的目的是惩罚那些在许多文档中都出现的常见词语,使得这些词对文档的区分能力下降。使用对数能使这种惩罚更适度,而不是过于极端。例如,如果一个词出现在几乎所有文档中,简单计算可能会导致极低的 IDF 值,而对数可以使得惩罚更为温和。

- 数学性质:对数函数具有一些优良的数学性质,例如可导性和单调性,这些性质在优化和计算中非常有用。

所以整个最终的公式为: $$ \text{TF-IDF} = \sum_{t\in\mathcal{Q}}\frac{tf_{t,d}}{l_d} \cdot log\frac{N}{df_t} $$

BM25: Okapi Best Match 25

BM25可以看作是TF-IDF的一种变体,也是最强的一种词匹配分数,其公式为:

$$ \text{BM25}=\sum_{t\in\mathcal{Q}}\frac{tf_{t,d}\cdot(k+1)}{tf_{t,d}+k\cdot(1-b+b\cdot\frac{l_d}{mean(l_d)})}\cdot ln(1+\frac{N-df_t+0.5}{df_t+0.5}) $$

其中其他的都跟TF-IDF差不多,主要多了两个参数k和b:通常$k \in [1.2,2]$,$b=0.75$。

两个参数对BM25的影响可以参考:白話圖解 - 什麼是 BM25

结论:

- k1 控制關鍵字次數本身的影響力:k1 越大,BM25 分數越不會有邊際效應(越容易因出現次數增大)
- b 控制文章長短本身的影響力:b 越小,文章長度越不會影響 BM25 分數

⚠️注意:这里说“文章长度不会影响BM25分数”指的是没有做归一化,这样的话评分仅有关键词决定。