TF-IDF

来源:互联网 发布:基于大数据的公交规划 编辑:程序博客网 时间:2024/05/01 19:50
  

转自:http://hi.baidu.com/he8819197/blog/item/33e0b9b0a0b7d45e0923028b.html

本篇开始讨论比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相乘。另外还有其他一些方法,在此不再赘述。


原创粉丝点击