TF-IDF算法简介

TF-IDF算法全称为term frequency–inverse document frequency。TF就是term frequency的缩写,意为词频。IDF则是inverse document frequency的缩写,意为逆文档频率。

该算法在信息处理中通常用来抽取关键词。比如,对一个文章提取关键词作为搜索词,就可以采用TF-IDF算法。

要找出一篇文章中的关键词,通常的思路就是,就是找到出现次数最多的词。如果某个词很重要,它应该在这篇文章中多次出现。于是,我们进行"词频"(Term Frequency,缩写为TF)统计。

但是通常,一篇中文的文章中,都会有很多没有实际意义的词,比如“的”,“是”,“了”,这类词是最常用的词,称为停用词,称它们为停用词是因为在文本处理过程中如果遇到它们,则立即停止处理,将其扔掉。将这些词扔掉减少了索引量,增加了检索效率,并且通常都会提高检索的效果。停用词主要包括英文字符、数字、数学字符、标点符号及使用频率特高的单汉字等。

当过滤掉所有的停用词后,剩下的都是实际意义的词,但也不能简单的认为那个词出现的次数多就是关键词。比如在一篇如何组装电脑的文章中,出现“CPU”,“主板”等关键词和出现“说明书”的次数一样多,但很显然,CPU,主板等关键词,更能确定这个文章的特性。也就是说,“CPU”,“主板”等关键词比“说明书”这个关键词更重要,需要排在前面。所以我们就需要一个权重系数,用来调整各个关键词的重要性。如果一个词很少见,但是它在某个文章中反复出现多次,那么可以认为这个词反应了这个文章的特性,可以把它作为关键词。在信息检索中,这个权重非常重要,它决定了关键词的重要度,这个权重叫做"逆文档频率"(Inverse Document Frequency,缩写为IDF),它的大小与一个词的常见程度成反比。

在知道了词频和权重之后,两者相乘,就得到一个词的TF-IDF值,某个词对文章的重要性越高,它的TF-IDF值就越大。所以,排在最前面的几个词,就是这篇文章的关键词。

因此TF-IDF算法的主要工作就是计算出TF*IDF值最大的那几个词,作为文章的关键词。

计算TF*IDF值需要分成以下几步:

首先需要切词,也就是说把一个文章切成一个个可以作为关键字的词语。由于中文不像英文那样,可以通过空格切词,因此到目前为止,中文分词包括三种方法:

1)基于字符串匹配的分词;

2)基于理解的分词;

3)基于统计的分词。

目前还无法证明哪一种方法更准确,第一种方法是最早出现也是最成熟的算法,算法复杂度也是最低的。切词首先需要一个语料库,然后根据这个库,匹配其中的词语。目前较流行很多,但是支持.NET平台的不多见,主要有中科院计算所ICTCLAS系统和盘古分词,功能强大自带词典,同时支持用户词典,并且支持.NET开发者调用。

分词完成后,就可以计算词频。词频就是某歌词在文章中出现的次数,由于文章有长短,为了规格化词频的,取词频为一个相对值,而不是绝对值。这个相对值可以有2种计算方法。

一种

词频(TF)=某关键词出现次数/文章中关键词总数

或者

词频(TF)=某关键词出现次数/文章中出现最多次数关键词的出现次数

接着,计算逆文档频率(IDF)。计算IDF需要一个语料库,它的计算公式很简单

逆文档频率(IDF)=log(语料库文档总数/(包含该词的文档数+1)),之所以要+1是为了防止分母为0。由此可见,当一个词被越多的文档包含,则IDF值就越小,也就是所这个词很常见,不是最重要的能区分文章特性的关键词。

最后将TF和IDF相乘就得到TF-IDF值。

前面提到的盘古分词的词库中,已经包含了IDF的值,因此使用这个分词工具,也可以计算出各个关键词的TF-IDF值,实现排序。

举个例子,如下一个文章。

标题为清华科研团队重大突破 人类有望“饿死”癌细胞

京华时报讯(记者张晓鸽)昨天,清华大学宣布:该校医学院颜宁教授研究组在世界上首次解析了人源葡萄糖转运蛋白GLUT1的晶体结构,初步揭示了它的工作机制以及相关疾病的致病机理,在人类攻克癌症、糖尿病等重大疾病的探索道路上迈出了极为重要的一步。未来,人类有望“饿死”癌细胞。

昨天的英国《自然》杂志以长文的形式正式刊发了这一成果。据介绍,葡萄糖是地球上各种生物最重要、最基本的能量来源,也是人脑和神经系统最主要的供能物质。据估算,大脑平均每天消耗约120克葡萄糖,占人体葡萄糖总消耗量的一半以上。葡萄糖代谢的第一步就是进入细胞,但亲水的葡萄糖溶于水,而疏水的细胞膜就像一层油,因此,葡萄糖自身无法穿过细胞膜进入到细胞内发挥作用,必须依靠转运蛋白这个“运输机器”来完成。葡萄糖转运蛋白镶嵌于细胞膜上,如同在疏水的细胞膜上开了一扇一扇的门,能够将葡萄糖从细胞外转运到细胞内。

颜宁教授介绍称,葡萄糖转运蛋白GLUT1几乎存在于人体的每一个细胞,是大脑、神经系统、肌肉等组织器官中最重要的葡萄糖转运蛋白,对维持人体正常生理功能极为重要。这种转运蛋白的功能完全缺失将致人死亡,功能部分缺失会导致大脑萎缩、智力低下、发育迟缓等疾病。

同时,这种转运蛋白在癌细胞的新陈代谢中也发挥着重要功能。癌细胞需要消耗超量葡萄糖才能维持其生长扩增,转运蛋白GLUT1在细胞中显著过量往往意味着有癌变发生。

“因此,如能研究清楚GLUT1的组成、结果和工作机理,就有可能通过调控它实现葡萄糖转运的人工干预。”颜宁教授说,这样既可以增加正常细胞的葡萄糖供应,达到治疗相关疾病的目的,又可以通过阻断葡萄糖供应“饿死”癌细胞。

使用C#代码调用盘古分词的dll,如下:

static void Main(string[] args)
        {
            string text = ReadFile(@"D:\系统桌面\ar1.txt");
            PanGu.Segment.Init();
            Segment segment = new Segment();
            //调用分词方法
            ICollection<WordInfo> words = segment.DoSegment(text);
            Dictionary<string, double> d = new Dictionary<string, double>();
            foreach (var word in words)
            {
                //统计频率
                float tf = (float)System.Text.RegularExpressions.Regex.Matches(text, word.Word).Count / (float)words.Count;
                if (!d.ContainsKey(word.Word))
                    d[word.Word] = tf * word.Frequency;
            }
            //排序
            var lst = d.Select(x => x.Key).OrderByDescending(x => d[x]).ToList();
            //打印出前5个关键词
            lst.Take(5).ToList().ForEach(x => Console.WriteLine(x));
        }

结果为:

用这几个关键词去百度里面查询,得到的查询结果为:

TF-IDF算法的优点是简单快速,结果比较符合实际情况。缺点是,单纯以"词频"衡量一个词的重要性,不够全面,有时重要的词可能出现次数并不多。而且,这种算法无法体现词的位置信息,出现位置靠前的词与出现位置靠后的词,都被视为重要性相同,这是不正确的。(一种解决方法是,对全文的第一段和每一段的第一句话,给予较大的权重。)

当通过TF-IDF算法找出文章的关键字后,可以运用到一些具体的场景。比如:根据关键字找出相似的文章。

参考文档:

http://www.ruanyifeng.com/blog/2013/03/tf-idf.html

http://zh.wikipedia.org/wiki/TF-IDF

TF-IDF算法简介,布布扣,bubuko.com

时间: 2024-10-03 21:41:12

TF-IDF算法简介的相关文章

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

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

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

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

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

[Elasticsearch] 控制相关度 (四) - 忽略TF/IDF

本章翻译自Elasticsearch官方指南的Controlling Relevance一章. 忽略TF/IDF 有时我们不需要TF/IDF.我们想知道的只是一个特定的单词是否出现在了字段中.比如我们正在搜索度假酒店,希望它拥有的卖点越多越好: WiFi 花园(Garden) 泳池(Pool) 而关于度假酒店的文档类似下面这样: { "description": "A delightful four-bedroomed house with ... " } 可以使用

最小生成树 kruskal算法简介

生成树--在一个图中的一个联通子图  使得所有的节点都被(访问) 最小生成树 (MST) 即联通子图的总代价(路程)最小 已知的一个图 有n个点 m条边 kruskal的算法如下 先对边从小到大排序 从最小的边起,不停的合并这条边的两个节点到一个集合,如果这条边的两个节点已经在一个集合里,则无视,否则形成回路(显然错误)直到所有的节点并到一个集合里 这里需要用到并查集来合并节点 1 int cmp(const int i,const int j) { 2 return w[i] < w[j];

AES算法简介

AES算法简介 一. AES的结构 1.总体结构 明文分组的长度为128位即16字节,密钥长度可以为16,24或者32字节(128,192,256位).根据密钥的长度,算法被称为AES-128,AES-192或者AE-256. 2.明文密钥组织方式 3.一些相关的的术语定义和表示 • 状态(State):密码运算的中间结果称为状态. • State的表示:状态用以字节为基本构成元素的矩阵阵列来表示,该阵列有4行,列数记为Nb. Nb=分组长度(bits)÷ 32.Nb可以取的值为4,对应的分组长