TF-IDF 简述

luhn在1958年,汉斯·彼得·卢恩在他的论文《文献摘要的自动创建》中假设“文章中单词出现的频率提供了单词重要性的有用度量”,这直到现在可能仍然是信息检索科学中最重要的概念之一,并且在所有著名的大型和小型搜索引擎中都在使用,从谷歌和雅虎到自定义搜索解决方案如ElasticSearch和Manticore Search。

卢恩的假设的重要性不可低估,许多后续的科学研究都是基于卢恩的假设,尽管并非所有研究都提到这一点,因为随着时间的推移,这似乎已成为公理。

在本文中,我将尽量通过非常清晰的示例展示表示“术语频率”的TF和表示“逆文档频率”的IDF是如何帮助您找到所寻找的内容的。

让我们以5个文档为例:

1. 我的狗不喜欢我所有的宠物,但我和我的妻子都爱它们。 狗不可能是猫爱好者
2. 猫和狗彼此不喜欢,但我的猫喜欢狗
3. 散步带狗是一天的好开始
4. 并非所有的猫都喜欢散步,但有些猫喜欢
5. 所有的狗都喜欢散步,但我的狗不喜欢。 这真是太奇怪了

并试着对它们进行排名(即查找最相关和最不相关以及顺序)以应对不同的查询。

权重 = 如果单词出现则为1,否则为0

查询:’like’.

注意,我们不知道查询中“like”的意思:像“A像B”或“我喜欢某物”。那么,我们可以做什么来对文档进行排名呢?

首先想到的是,如果文档根本不包含单词“like”,那么它可能相关性较低。因此顺序可以是:

1. 我的狗不<b>喜欢</b>我所有的宠物,但我和我的妻子都爱它们。 狗不可能是猫爱好者
2. 猫和狗彼此不<b>喜欢</b>,但我的猫喜欢狗
4. 并非所有的猫<b>喜欢</b>散步,但有些猫喜欢
5. 所有的狗<b>喜欢</b>散步,但我的狗不<b>喜欢</b>。 这<b>像</b>太奇怪了
3. 散步带狗是一天的好开始

我们将文档#3放在最后,因为它不包含“like”。至于其余的我们没有改变它们的顺序,因为它们都包含“like”。这样的排名质量够好吗?我觉得不够,因为在前4个文档中,有2个(#5 和 #2)似乎比其他文档更相关,因为它们提供了与查询词“like”相关的更多事实(记住我们不知道查询中“like”的确切含义),但它们并不是前两名。那么我们该如何处理呢?

权重 = 术语频率

查询:’like’。

如前所述,根据卢恩的假设,包含更多查询词出现次数的文档可能更相关。让我们根据它们的术语频率对文档进行排名(注意这里以及在信息检索领域,“频率”仅仅指计数,而不是像物理学中那样的分数):

5. 所有的狗<b>喜欢</b>散步,但我的狗不<b>喜欢</b>。 这<b>像</b>太奇怪了 | tf = 3
2. 猫和狗彼此不<b>喜欢</b>,但我的猫喜欢狗 | tf = 2
1. 我的狗不<b>喜欢</b>我所有的宠物,但我和我的妻子都爱它们。 狗不可能是猫爱好者 | tf = 1
4. 并非所有的猫<b>喜欢</b>散步,但有些猫喜欢 | tf = 1
3. 散步带狗是一天的好开始 | tf = 0

这样解决了问题,现在文档#5和#2位于最上面。

但现在让我们尝试另一个 查询 - ‘my day’

1. <b>我的</b>狗不喜欢所有<b>我的</b>宠物,但我和<b>我的</b>妻子都爱它们。 狗不可能是猫爱好者 | tf = 3
2. 猫和狗彼此不喜欢,但<b>我的</b>猫喜欢狗 | tf = 1
3. 散步带狗是一天的<b>好开始</b> | tf = 1
4. 并非所有的猫都喜欢散步,但有些猫喜欢 | tf = 0
5. 所有的狗都喜欢散步,但我的狗不喜欢。 这真是太奇怪了 | tf = 0

文档#1和#2获得了最高位置,但这是正确的吗?它们并未提到“day”,只提到“my”:我的宠物,我的妻子,我的猫,这可能也很重要,考虑到查询,但很可能并不是。文档#3得到较低的位置,而这似乎是最相关的。我们该如何将其放得更高?

让我们思考“my”与“day”和其他单词的不同之处。 “day”似乎更具体,而“my”几乎可以适用于任何东西,并且在 文档中“my”的出现频率远远高于“day”和其他更具体的术语。 这就是“文档频率”的出现 - 公式中的另一个重要部分以及术语加权的第二个基石。

ksj1972年,英国计算机科学家凯伦·斯帕克·琼斯在她的一篇学术论文中说:“文档描述的全面性是它所包含的术语数量,而术语的特异性是与之相关的文档数量”。

我们已经涵盖了前面的部分,现在让我们看看如果我们计算后者,文档的顺序会如何改变。

权重 = 术语频率 * (文档总数 / 文档频率)

查询:‘my day’。

‘我的’出现在2个文档中,‘day’只出现在一个文档中,因此’我的’的IDF(逆文档频率)是5(文档总数)/ 2 = 2.5,‘day’ - 5/1 = 5。

1. <b>我的</b>狗不喜欢所有<b>我的</b>宠物,但我和<b>我的</b>妻子都爱它们。 狗不可能是猫爱好者
权重 = 3('my'的tf) * 2.5('my'的idf) + 0('day'的tf) * 5(它的idf)= 7.5
3. 散步带狗是一天的<b>好开始</b>
权重 = 0 * 2.5 + 1 * 5 = 5
2. 猫和狗彼此不喜欢,但<b>我的</b>猫喜欢狗
权重 = 2.5
4. 并非所有的猫都喜欢散步,但有些猫喜欢
权重 = 0
5. 所有的狗喜欢散步,但我的狗不喜欢。 这事真是太奇怪了
权重 = 0

随着 IDF 的帮助,我们可以将相关文档“遛狗是一天的美好开始”提升一个位置,但它仍然不在最顶部。原因是什么?因为“my”出现的频率太高,超过了“day”的 IDF 重要性。我们该如何解决这个问题?我们需要一些东西来降低 TF 的贡献。多年来,已经提出并研究了许多 TF 规范化的变体,从简单的 log(TF) 到所谓的“术语频率饱和曲线”。为了简单起见,我们就采用对数变体。

权重 = log(1+TF) * (N/df)

log 对数平滑的整个思想与线性函数相比是,参数越高,增长越慢,即,对于较小的 x 增长迅速,对于较高的 x 增长缓慢。函数中的“1+x”是为了不在术语频率 = 0 的情况中出现 0,因为 log(0) 是未定义的,而 log(0+1) 是 0,这正是我们需要的 tf=0 的情况。
让我们看看这是否解决了问题:
查询:‘my day’。

3. Walking a dog is a good start of the <b>day</b>
Weight = log(1+0) * 2,5 + log(1+1) * 5 = 0 + 3,47 = 3,47
1. <b>My</b> dog doesn't like all <b>my</b> pets, but me and <b>my</b> wife do love them all. A dog cannot be a cat lover
Weight = log(1+3) * 2,5 + log(1+0) * 5 = 3,47 + 0 = 3,47

2. Cats and dogs do not like each other, but <b>my</b> cat does like dogs
Weight = 1,73
4. Not all cats like walking, but some cats do
Weight = 0
5. All dogs like walking, but mine doesn't like. It's like so weird
Weight = 0

可以看出,最相关的文档终于位于第 1 个位置,但它与另一份权重相同为 3,47 的文档共享这一位置。这是对还是错?这是个难题,因为我们永远无法确定请求者认为什么是相关的。有可能请求者在询问“my day”时也会认为第二个文档相关,因为它给出了关于“my”的一些事实,而第一个文档仅提到了一个关于“day”的事实。因此,他们得到相同权重可能是相当公平的。
正因为这种不确定性,这可能就是在搜索引擎中通常返回的不仅仅是单个结果,而是一些数字:10 或 20 或其他数字的原因,因此我们就让用户自己做最终决定。

结论

在本文中,我简要展示了 TF-IDF 权重公式的演变,这证明了它的有效性以及每个组成部分的重要性。

TF-IDF 的延续叫做 BM25,它特别基于之前提到的“术语频率饱和曲线”和更加概率化的方法来定义权重公式(再一次提醒,我们永远无法确定什么是真正相关的,因此采用概率方法)。总体而言,它仍然是 TF-IDF(+ 按文档长度规范化),但其根源截然不同。这个主题将在另一篇文章中进行讨论。请与我们保持联系,订阅我们的通讯,以免错过。

安装Manticore Search

安装Manticore Search