假设现在有一篇很长的文章,要从中提取出它的关键字,完全不人工干预,那么怎么做到呢?又有如如何判断两篇文章的相似性的这类问题,这是在数据挖掘,信息检索中经常遇到的问题,然而TF-IDF算法就可以解决。这两天因为要用到这个算法,就先学习了解一下。
TF-IDF概述
在接触一个新算法时,首先当然是先去了解这个算法的本质,在此,我们先引用百度百科上的解释:TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术。用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类,也就可以作为上文中所提到的关键字。
这样我们大概就对这个算法有了一些了解,至少知道了它是通过加权来判定字词对于文章的重要性的,那么算法是如何实现的呢?下来我们一步步进行学习:
词频(TF)和逆文档频率IDF
首先,就算法的命名说起,当然你会好奇这里的TF是什么,IDF是什么。现在回到之前我们提到的问题,要在一篇很长的文章中寻找关键字(词),就一般的理解,如果一个词对于文章而言很关键的话那出现的次数就比较多,于是我们就采用“词频”(Term Freqency)进行统计,这里的词频就是TF。
那么你肯定会说像“的”、“是”、“了”这类词的出现次数应该是最多的了,它们叫做停用词,对找到结果完全毫无帮助,是我们必须要过滤掉的词,
假设我们现在过滤掉了所有的那些词,那么又会遇到一个问题,假定我们现在要在一个关于聚类的文章中找寻关键字。我们可能发现“聚类”和“算法”的出现次数一样多,那么它们的重要性就是一样的么?答案当然是否定的,相对于“聚类”而言,“算法”更为常见,出现次数同样多,我们就有理由认为“聚类”的重要程度要大于“算法”。也可以这样理解,如果某个词比较少见,但是它在这篇文章中多次出现,那它很可能就能反映本篇文章的特性,也就可以作为我们所要寻找的关键词。
联系到层次分析法这类算法的思想,可以赋予每个词特定的权重,像那类最常见的词赋予很小的权重,相应的较少见的词赋予较大的权重,这个权重在这里叫做“逆文档频率”(Inverse Doucument Frequency,缩写为IDF),它的大小与一个词的常见程度成反比。而TF-IDF值就是将词频TF和逆文档频率IDF相乘,值越大,该词对文章的重要性越高。
步骤
(1)计算词频
词频 = 某个词在文章中出现的总次数
当然为了消除不同文章大小之间的差异,便于不同文章之间的比较,我们在此标准化词频:
词频 = 某个词在文章中出现的总次数/文章的总词数
或者:词频 = 某个词在文章中出现的总次数/文章中出现次数最多的词的个数
(2)计算逆文档频率
在此,首先需要一个语料库来模拟语言的使用环境。
逆文档频率(IDF) = log(词料库的文档总数/包含该词的文档数+1)
为了避免分母为0,所以在分母上加1.
(3)计算TF-IDF值
基于之前的分析了解,有:TF-IDF值 = TF * IDF。
在此有:TF-IDF值与该词的出现频率成正比,与在整个语料库中的出现次数成反比,符合之前的分析。
(4)求出关键字
计算出文章中每个词的TF-IDF值之后,进行排序,选取其中值最高的几个作为关键字。
(5)计算文章的相似性
计算出每篇文章的关键词,从中各选取相同个数的关键词,合并成一个集合,计算每篇文章对于这个集合中的词的词频,生成两篇文章各自的词频向量,进而通过欧氏距离或余弦距离求出两个向量的余弦相似度,值越大就表示越相似。
优缺点
1.优点是算法的容易理解,便于实现。
2.缺点:IDF的简单结构并不能有效地反映单词的重要程度和特征词的分布情况,使其无法很好的完成对权值的调整功能,所以在一定程度上该算法的精度并不是很高。除此之外,算法也没哟体现位置信息,对于出现在文章不同位置的词语都是一视同仁的,而我们知道,在文章首尾的词语势必重要性要相对高点。据此,我们可以或许也可以将处于文章不同位置的词语赋予不同的权重。