TF-IDF

来源:互联网 发布:手机合成图片软件 编辑:程序博客网 时间:2024/05/01 12:51

TF-IDF

转载自:http://roba.rushcj.com/?p=178

【介绍】

TF/IDF (term frequency/inverse document frequency) 的概念被公认为信息检索中最重要的发明。在搜索、文献分类和其他相关领域有广泛的应用。讲起 TF/IDF 的历史蛮有意思。IDF 的概念最早是剑桥大学的斯巴克-琼斯[注:她有两个姓] (Karen Sparck Jones)提出来的。斯巴克-琼斯 1972 年在一篇题为关键词特殊性的统计解释和她在文献检索中的应用的论文中提出IDF。遗憾的是,她既没有从理论上解释为什么权重IDF 应该是对数函数 log(D/Dw)(而不是其它的函数,比如平方根),也没有在这个题目上作进一步深入研究,以至于在以后的很多文献中人们提到 TF/IDF 时没有引用她的论文,绝大多数人甚至不知道斯巴克-琼斯的贡献。同年罗宾逊写了个两页纸的解释,解释得很不好。倒是后来康乃尔大学的萨尔顿 (Salton)多次写文章、写书讨论 TF/IDF 在信息检索中的用途,加上萨尔顿本人的大名(信息检索的世界大奖就是以萨尔顿的名字命名的)。很多人都引用萨尔顿的书,甚至以为这个信息检索中最重要的概 念是他提出的。当然,世界并没有忘记斯巴克-琼斯的贡献,2004年,在纪念文献学学报创刊 60 周年之际,该学报重印了斯巴克-琼斯的大作。罗宾逊在同期期刊上写了篇文章,用香农的信息论解释 IDF,这回的解释是对的,但文章写的并不好、非常冗长(足足十八页),把一个简单问题搞复杂了。

【开篇】

本篇开始讨论比Boolean Retrieval更复杂的检索,想象一下我们平常用的搜索引擎,一个很明显的特点是返回的结果是有序的,越相关越重要的结果排得越靠前(竞价排名除外- -),下面主要就讨论如何给文档打分排序的问题。

这回把扯淡的话先放在前面说,我长久以来抱持一个想法:无论外表看上去多么复杂的一个方法或理论,其核心思想或者说原始动机往往都是很朴素很直观的,只不过在其发展、完善、实现的过程中不得不变得复杂,如果我们顺着方法的创始人当初的思路来看问题,看看他当时已知什么,面对的困难是什么,再印证最终的解决方法是如何巧妙地把问题搞定的,这样就不会经常迷失在具体的细节中,知其然不知其所以然了。当然,直观的同时也一定是不严谨的,所以再次回归复杂而严格的表述也必不可少。我不知道这个看法对不对,至少在研究ACM比赛里用到的算法时经常会有这种感觉。所以我在下面讲述方法的时候也往往先描述遇到的困难,再看那些方法是如何解决困难的,而不是一上来就给一坨莫名其妙的数学公式。我认为我的方法是比较符合人的学习过程的,当然因为水平有限,错误在所难免了,呵呵。

扯淡完毕,回到给文档打分的问题。一般来说,如果文档中出现了我们查询的词,我们就认为这篇文档是和此查询相关的。那么很自然的想法就是,如果一篇文档中出现要查询的词的次数越多,相关性应该越大。所以定义一个Term-Frequency TF(t,d)表示单词t在文档d中的出现次数,以它作为一个度量相关度的标准。但是只考虑次数还不够,因为不同词的重要性是不同的,比如考虑一个小型的文本库,里面都是各位ACMer的文章,可以想见,“算法”这个词会出现在大部分的文章中,而“ppmm”这个词只在少数文章中才有。现在我要查询“算法 ppmm”,结果找到两篇文档同时出现了这两个词,第一篇是RoBa写的,里面出现了1次“算法”和10次“ppmm”,另一篇文章是另一位ACMer写的,里面出现了10次“算法”和1次“ppmm”,如果我们只累计TF,会发现两篇文档都是11,但是实际上RoBa的文章应该排在前面,因为“ppmm”这个词相对来说较为稀缺,所以它的权重也应该比较大。为了量化这个稀缺度,引入Inverse Document Frequency(IDF),定义为IDF(t) = log(N / DF(t)),这里的DF(t)是指单词t在多少篇文档中出现过(Document Frequency),N是指总的文档数,log的底数实际上可以随便取,因为最后我们只关心相对大小。容易发现,如果单词越普遍,它的IDF越小,极端情况是DF(t)=N时,IDF(t)=0,从下面的式子能看出,这实际上就起到了stop list的效果。把这两项结合起来,对单词t和文档d,定义TF-IDF(t,d) = TF(t,d) * IDF(t)。直观来解释就是:一个单词在一篇文档中出现次数越多,它的权重越大;文档中单词越是“只此一家别无分店”,它的权重越大。现在我们就有了一个简单的打分方法:一篇文档和一条Query的相关度为Query中所有单词在这篇文档中的TF-IDF值之和。当然还有更强大的计分方法,后面慢慢再提。

另外说一下,TF-IDF并不是唯一的加权方式。比如我们可能认为这个值和term的出现次数成正比这一点太夸张了,一篇出现了10次“ppmm”的文章未必就比一篇出现1次“ppmm”重要10倍,所以可以搞出一个sublinear TF:当tf(t,d)>0时,定义wf(t,d) = 1 + log tf(t,d),然后用这个wf代替tf去和idf相乘。另外还有其他一些方法,在此不再赘述。