-->

AI内参_33_031_经典搜索核心算法TF-IDF及其变种

你好,我是洪亮杰。

今天我和你分享的主题是TFIDF算法及其变种。

从本周开始啊,我们进入人工智能核心技术模块。

本周我会集中讲解经典的搜索核心算法。

今天我先来介绍,TFIDF算法在信息检索文本挖掘以及自然语言处理领域,TFIDF算法都可以说是鼎鼎有名。

虽然在这些领域中,目前也出现了不少以深度学习为基础的新的文本表达和算分方法。

但是,TFIDF作为一个最基础的方法,依然在很多应用中发挥着不可替代的作用。

了解和掌握TFIDF算法对于初学者大有裨益,能够帮助初学者更快的理解其他更加深入复杂的文本挖掘算法和模型。

今天呢我就来谈一谈TFIDF的历史算法本身的细节,以及基于TFIDF的几个变种算法。

先来看看TFIDF的历史,把查询关键字和文档都转换成向量,并且尝试用线性代数等数学工具来解决信息检索问题。

这样的努力至少可以追溯到二十世纪七十年代一九七一年,美国康奈尔大学教授杰拉德索尔顿发表了smart检索系统自动文档处理实验一文。

文中呢首次提到了把查询关键字和文档都转化成向量,并且给这些向量中的元素赋予不同的值。

一篇论文中描述的smart检索系统,特别是其中对TFIDF及其变种的描述,成了后续很多工业级系统的重要参考。

一九七二年的时候,英国的计算机科学家卡伦琼斯在从统计的观点看词的特殊性及其在文档检索中的应用一文中,第一次详细的阐述了IDF的应用。

其后,卡伦又在检索目录中的词赋值权重一文中,对TF和IDF的结合进行了论述。

可以说啊卡伦是第一位从理论上对TFIDF进行完整论证的计算机科学家。

因此,后世也有很多人把TFIDF的发明归结于卡伦杰拉德本人,被认为是信息检索之父。

他一九二七年出生于德国的纽伦堡,并于一九五零年和一九五二年先后从纽约的布鲁克林学院获得数学学士和硕士学位。

一九五八年从哈佛大学获得了应用数学博士学位,之后,来到了康奈尔大学,参与组建计算机系。

为了致敬杰拉德本人对现代信息检索技术的卓越贡献。

现在呢美国计算机协会SM每三年颁发一次杰拉德索尔顿奖,用于表彰对信息检索技术有突出贡献的研究人员。

凯伦琼斯在一九八八年获得了第二届杰拉德索尔顿奖的殊荣。

下面我来讲一讲TFIDF的算法细节,要理解TFIDF算法。

第一个步骤是理解TFIDF的应用背景。

Tfidf来源于一个最经典,也是最古老的信息检索模型。

向量空间模型。

简单来说呢,向量空间模型就是希望把查询关键字和文档都表达成向量。

因为利用向量之间的运算来进一步表达向量间的关系。

比如一个比较常用的运算,就是计算查询关键字所对应的向量和文档所对应的向量之间的相关度。

因为有了向量的表达,相关度往往可以用向量在某种意义上的相似度来进行近似。

比如余弦相似性或者是点积,这样相关度就可以用一个值来进行表达。

不管是余弦相似度还是点积,都能够从线性代数或者几何的角度来解释计算的合理性。

在最基本的向量空间模型的表达中,查询关键字或是文档的向量都有v维度。

这里的v是整个词汇表的总长度,比如我们如果有一万个常用的英文单词,那么这个v的取值就是一万。

而查询关键字和每个文档的向量都是一个一万维的向量。

对于这个向量中的每一个维度都表示英文中的一个单词没有重复。

你可以看到,在这样的情况下,如果当前的词出现在这个向量所对应的文档或者关键字里,就用一来表达。

如果这个词没出现,就用零来表达。

那么这就是给每个维度赋值的最简单的方法。

Tfidf就是在向量空间模型的假设下的一种更加复杂的赋值方法。

Tfidf最基础的模式,顾名思义就是TF和IDF的乘积。

Tf其实是单词频率的简称。

意思就是说,我们计算一个查询关键字中某一个单词在目标文档中出现的次数。

举例说来,如果我们查询car insurance,那么对于每一个文档,我们都计算car这个单词在其中出现了多少次?Insurance这个单词在其中出现了多少次?这个就是TF的计算方法。

Tf背后的隐含的假设是,查询关键字中的单词应该相对于其他单词更加重要,而文档的重要程度,也就是相关度与单词在文档中出现的次数成正比。

比如car这个单词在文档a里出现了五次,而在文档a里出现了二十次。

那么TF计算就认为文档b可能更相关。

然而,信息检索工作者很快就发现,仅有TF不能比较完整的描述文档的相关度。

因为语言的因素,有一些单词可能会比较自然的,在很多文档中反复出现,比如英语中的the and but等等。

这些词大多起到了链接语句的作用,是保持语言连贯不可或缺的部分。

然而,如果我们要搜索how to build a car这个关键词,其中how to以及a都极可能在绝大多数的文档中出现。

这个时候TF就无法帮助我们区分文档的相关度了。

Idf也就是逆文档频率就在这样的情况下应运而生。

这里面的思路其实很简单,那就是我们需要去惩罚那些出现在太多文档中的单词。

也就是说真正携带相关信息的单词仅仅出现在相对比较少。

有时候可能是极少数的文档里,这个信息很容易用文档频率来计算,也就是有多少文档涵盖了这个单词。

很明显,如果有太多文档都涵盖了某个单词,这个单词也就越不重要,或者说是这个单词就越没有信息量。

因此,我们需要对TF的值进行修正,而IDF的想法是用DF的倒数来进行修正。

倒数的应用正好表达了这样的思想,DF值越大越不重要。

在了解了TF和IDF的基本计算方法后,我们就可以用这两个概念的乘积来表达某个查询单词在一个目标文档中的重要性了。

值得一提的是呢,虽然我们在介绍TFIDF这个概念的时候,并没有提及怎么把查询关键字和文档分别表达成向量。

其实啊TFIDF算法隐含了这个步骤。

具体来说,对于查询关键字向量的长度是v也就是我们刚才说过的词汇表的大小。

然后其中关键字的单词出现过的维度是一,其他维度是零。

对于目标文档而言,关键词出现过的维度是TFIDF的数值,而其他维度是零。

在这样的表达下,如果我们对两个文档进行点击操作,则得到的相关度打分就是TFIDF作为相关度的打分结果。

以上就是TFIDF算法本身的细节很明显,经典的TFIDF算法有很多因素没有考虑。

在过去的很长一段时间里,研究人员和工程师开发出了很多种TFIDF的变种。

这里我们就介绍几个比较经典的变种。

首先很多人注意到TF的值在原始的定义中没有任何上限。

虽然我们一般认为一个文档包含查询关键词多次,相对于来说表达了某种相关度,但这样的关系很难说是线性的。

拿我们刚才举过的关于car insurance的例子来说,文档a可能包含car这个词一百次,而文档b可能包含二百次,是不是说文档b的相关度就是文档a的两倍呢?其实啊很多人意识到超过了某个阈值之后,这个TF也就没那么有区分度了。

用log,也就是对数函数。

对TF进行变换,就是一个不让TF线性增长的技巧。

具体来说,人们常常用一加log f这个值来代替原来的TF取值。

在这样新的计算下,假设卡尔出现一次新的值是一出现一百次,新的值是五点六,而出现二百次新的值是六点三。

很明显,这样的计算保持了一个平衡,既有区分度,但也不至于完全线性增长。

另外一个关于TF的观察则是经典的计算,并没有考虑长文档和短文档的区别。

一个文档a有三千个单词,一个文档b有二百五十个单词。

很明显,即使卡尔在这两个文档中都同样出现过二十次,也不能说这两个文档都同等相关。

对TF进行标准化,特别是根据文档的最大TF值进行标准化,成了另外一个比较常用的技巧。

第三个常用的技巧也就是利用了对数函数进行变换的,是对IDF进行处理。

相对于直接使用IDF来作为惩罚因素,我们可以使用n加一,然后除以DF作为一个新的DF的倒数。

并且再在这个基础上,通过一个对数变化,这里的n是所有文档的总数。

这样做的好处就是,第一,使用了文档总数来做标准化,很类似上面提到的标准化的思路。

第二,利用对数来达到非线性增长的目的。

还有一个重要的TFIDF变种,则是对查询关键字、向量以及文档向量进行标准化,使得这些向量能够不受向量里有效元素多少的影响。

也就是不同的文档可能有不同的长度。

在线性代数里可以把向量都标准化为一个单位向量的长度,这个时候再进行点击运算,就相当于在原来的向量上进行余弦相似度的运算。

所以另外一个角度利用这个规则,就是直接在多数时候进行余弦相似度运算,以代替点击运算。

今天呢我为你讲了文档检索领域或者搜索领域里最基本的一个技术。

Tfidf.我们可以看到,TFIDF有两个核心概念组成,分别是词在文档中的频率和文档频率。

Tfidf背后隐含的是基于向量空间模型的假设,一起来回顾一下要点。

第一,简要介绍了TFIDF的历史。

第二,详细介绍了TFIDF算法的主要组成部分。

第三,简要介绍了TFIDF的四个变种算法,最后给你留一个思考题。

如果要把TFIDF应用到中文环境中,是否需要做一些预处理的步骤呢?欢迎你给我留言,和我一起讨论。