TF-IDF算法简介

  1. 云栖社区>
  2. 博客>
  3. 正文

TF-IDF算法简介

技术小甜 2017-11-09 14:43:00 浏览1408
展开阅读全文

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,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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<stringdouble> d = new Dictionary<stringdouble>();
            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));
        }

结果为:

4a8b1968bb7148caa79c710a643c7b2b[15]

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

eaef8dabe30d4703bb9a25215803e74d[15]

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

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


参考文档:

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

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












本文转自cnn23711151CTO博客,原文链接: http://blog.51cto.com/cnn237111/1423795,如需转载请自行联系原作者


网友评论

登录后评论
0/500
评论
技术小甜
+ 关注