TF-IDF算法(1)—算法概述

  假设现在有一篇很长的文章,要从中提取出它的关键字,完全不人工干预,那么怎么做到呢?又有如如何判断两篇文章的相似性的这类问题,这是在数据挖掘,信息检索中经常遇到的问题,然而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的简单结构并不能有效地反映单词的重要程度和特征词的分布情况,使其无法很好的完成对权值的调整功能,所以在一定程度上该算法的精度并不是很高。除此之外,算法也没哟体现位置信息,对于出现在文章不同位置的词语都是一视同仁的,而我们知道,在文章首尾的词语势必重要性要相对高点。据此,我们可以或许也可以将处于文章不同位置的词语赋予不同的权重。

时间: 2024-08-25 19:02:38

TF-IDF算法(1)—算法概述的相关文章

tf–idf算法解释及其python代码实现(下)

tf–idf算法python代码实现 这是我写的一个tf-idf的核心部分的代码,没有完整实现,当然剩下的事情就非常简单了,我们知道tfidf=tf*idf,所以可以分别计算tf和idf值在相乘,首先我们创建一个简单的语料库,作为例子,只有四句话,每句表示一个文档 copus=['我正在学习计算机','它正在吃饭','我的书还在你那儿','今天不上班'] 由于中文需要分词,jieba分词是python里面比较好用的分词工具,所以选用jieba分词,文末是jieba的链接.首先对文档进行分词: i

tf–idf算法解释及其python代码实现(上)

tf–idf算法解释 tf–idf, 是term frequency–inverse document frequency的缩写,它通常用来衡量一个词对在一个语料库中对它所在的文档有多重要,常用在信息检索和文本挖掘中. 一个很自然的想法是在一篇文档中词频越高的词对这篇文档越重要,但同时如果这个词又在非常多的文档中出现的话可能就是很普通的词,没有多少信息,对所在文档贡献不大,例如‘的’这种停用词.所以要综合一个词在所在文档出现次数以及有多少篇文档包含这个词,如果一个词在所在文档出现次数很多同时整个

55.TF/IDF算法

主要知识点: TF/IDF算法介绍 查看es计算_source的过程及各词条的分数 查看一个document是如何被匹配到的 一.算法介绍 relevance score算法,简单来说,就是计算出,一个索引中的文本,与搜索文本,他们之间的关联匹配程度.Elasticsearch使用的是 term frequency/inverse document frequency算法,简称为TF/IDF算法 1.Term frequency 搜索文本中的各个词条在field文本中出现了多少次,出现次数越多,

25.TF&IDF算法以及向量空间模型算法

主要知识点: boolean model IF/IDF vector space model 一.boolean model 在es做各种搜索进行打分排序时,会先用boolean model 进行初步的筛选,boolean model类似and这种逻辑操作符,先过滤出包含指定term的doc.must/must not/should(过滤.包含.不包含 .可能包含)这几种情况,这一步不会对各个doc进行打分,只分过滤,为下一步的IF/IDF算法筛选数据. 二.TF/IDF 这一步就是es为boo

Algorithms算法系列文章概述

(1)blog内所有文章并非全部原创,大部分整理参考自Robert Sedgewick and Kevin Wayne  所著Algorithms视频教程和书中例子中提到的数据源文件均可从http://algs4.cs.princeton.edu官方网站中获取 (2)blog中算法的描述大部分是java实现,部分c/c++ (3)转载请注明 本书框架: 1:基础   包含在随后文章中用来实现分析算法的基本原则和方法.java变成模型,数据抽象,基本数据结构,集合类的抽象数据类型,算法性能分析的方

Elasticsearch学习之相关度评分TF&IDF

relevance score算法,简单来说,就是计算出,一个索引中的文本,与搜索文本,他们之间的关联匹配程度 Elasticsearch使用的是 term frequency/inverse document frequency算法,简称为TF/IDF算法 Term frequency(TF):搜索文本中的各个词条在field文本中出现了多少次,出现次数越多,就越相关 Inverse document frequency(IDF):搜索文本中的各个词条在整个索引的所有文档中出现了多少次,出现的

文本分类学习(三) 特征权重(TF/IDF)和特征提取

上一篇中,主要说的就是词袋模型.回顾一下,在进行文本分类之前,我们需要把待分类文本先用词袋模型进行文本表示.首先是将训练集中的所有单词经过去停用词之后组合成一个词袋,或者叫做字典,实际上一个维度很大的向量.这样每个文本在分词之后,就可以根据我们之前得到的词袋,构造成一个向量,词袋中有多少个词,那这个向量就是多少维度的了.然后就把这些向量交给计算机去计算,而不再需要文本啦.而向量中的数字表示的是每个词所代表的权重.代表这个词对文本类型的影响程度. 在这个过程中我们需要解决两个问题:1.如何计算出适

数据挖掘十大算法--Apriori算法

一.Apriori 算法概述 Apriori 算法是一种最有影响力的挖掘布尔关联规则的频繁项集的 算法,它是由Rakesh Agrawal 和RamakrishnanSkrikant 提出的.它使用一种称作逐层搜索的迭代方法,k- 项集用于探索(k+1)- 项集.首先,找出频繁 1- 项集的集合.该集合记作L1.L1 用于找频繁2- 项集的集合 L2,而L2 用于找L2,如此下去,直到不能找到 k- 项集.每找一个 Lk 需要一次数据库扫描.为提高频繁项集逐层产生的效率,一种称作Apriori

01--STL算法(算法基础)

一:算法概述 算法部分主要由头文件<algorithm>,<numeric>和<functional>组成. <algorithm>是所有STL头文件中最大的一个,其中常用到的功能范围涉及到比较.交换.查找.遍历操作.复制.修改.反转.排序.合并等等. <numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作. <functional>中则定义了一些模板类,用以声明函数对象. STL

分布式唯一ID生成算法-雪花算法

在我们的工作中,数据库某些表的字段会用到唯一的,趋势递增的订单编号,我们将介绍两种方法,一种是传统的采用随机数生成的方式,另外一种是采用当前比较流行的“分布式唯一ID生成算法-雪花算法”来实现. 一.时间戳随机数生成唯一ID 我们写一个for循环,用RandomUtil.generateOrderCode()生成1000个唯一ID,执行结果我们会发现出现重复的ID. /** * 随机数生成util **/ public class RandomUtil { private static fina