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相乘。另外还有其他一些方法,在此不再赘述。
分享到:
相关推荐
TF-IDF算法的优点是简单快速,结果比较符合实际情况
tf-idf算法简单分析多个pdf文件关键词
Keyword extraction based on TF-IDF of specific corpus. 基于特定语料库的TF-IDF的中文关键词提取
TF-IDF 简介。浅显易懂,值得学习。
实现基于TF-IDF算法抽取,对关键词进行抽取的算法,程序
而传统的特征词权重TF-IDF(Term Frequency and Inverted Document Frequency)算法主要考虑TF和IDF两个方面的因素,未考虑到新词这一新兴词类的优势。针对特征项中的新词对分类结果的影响,提出基于网络新词改进...
基于特定语料库的TF-IDF的中文关键词提取 使用前按照说明操作。
基于Word2vec和改进TF-IDF算法的深度学习模型研究.pdf
本实验文档详细叙述了TF-IDF算法原理、伪代码、TF矩阵的构造、IDF向量的构造、TF-IDF矩阵的计算和文件输出以及实验结果的分析这些内容,希望对大家有所帮助。
我的博客:TF-IDF原理及算法实现...该资源是有关中文文章的数据集,适合进行TF-IDF词频分析,数据集中的词已经用分词工具按空格切割过,可以直接使用,代码实现部分在博客中有写
LDA和TF-IDF算法的相关论文;
文本分类中计算文档中每一个词的tf-idf的值
计算TF-IDF的程序,使用java编写,能计算出输入文档的TF-idf值
在使用TF-IDF算法进行自然语言处理时,大家在处理文本时会首先进行切割,生成包含所有词的词典,但此时往往会有许多重复的词,这些词可能是经常使用的词,比如”的“,这样的词语太多会影响处理效果,因此需要去掉...
用MapReduce实现TF-IDF,手敲完成,但非原创,总体思想见PDF,需要源码的话可以点到我的主页查看
该资源属于代码类,用C语言和Python实现了TF-IDF算法,适用于文本分类等特征权重抽取
基于TF-IDF算法和LDA主题模型数据挖掘技术在电力客户抱怨文本中的应用.pdf
使用python进行朴素贝叶斯的数据分析,使用TF-IDF方法整理数据
python实现knn、naive bayes、vsm、tf-idf模型。并包含数据集