使用TF-IDF进行关键词抓取 郝伟,2020/12/21
[TOC]
1. TF-IDF简介
TF-IDF(词频反转文档频率,term frequency-inverse document frequency)是一种统计方法,能够实现各种关键字段中的停用词过滤,文本摘要和分类等,被大量应用于用于评估单词与文档集中的文档的相关性、文档搜索和信息检索中。它的作用原理是与单词在文档中出现的次数成正比地增加,但与包含该单词的文档的数量相抵消。因此,每个文档中都通用的单词(例如该单词以及单词是否排名很低,即使它们可能出现多次),因为它们对该文档的意义并不大。TF-IDF主要通过两个度量来完成:在文件中某单词的出现频次和单词在一组文档中的逆文档的出现频次。TF-IDF有着广泛的用途,其中最觉的是在自然语言处理中的文本内容分析,尤其是对单词的重要度评分有着非常的作用。
在常规的关键字提取算法中,一般使用分词和频率统计来实现。举例来说,术语“自然语言处理”,经分词后得到“自然”、“语言”和“处理”三个关键词。通常来说,如果一篇文章含有这三个词的频次越多,那么这这篇文章与这个短语和这三个关键词的相关度越高。但我们不能完全依赖于此,因为在实际应用中,往往会出现文章长度很长导致更多的关键词出现的情况。这样会造成这三个关键词与短文章的相关性被明显降低了。所以,为了更加公平地判断这些术语的相关度,还需要对关键词的频率进行归一化处理,即用关键词出现的次数除以文章中的总词数,称为“关键词的频率”(Term Frequency),比如篇文章中共有10000个词数,而“自然”、“语言”和“处理”的出现的次数分别为150次、180次和30次,那么他们的词频分别就是0.015、0.018和0.003。然后我们再把三者相加,得到0.036就是“自然语言处理”的“关键词频率”。但是,这样的内容实际是无法在实际中起作用的,原因是因为有大量的词的词频很高从而影响最终的结果,比如“的”,“但是”,“如果”等。这些词,我们也不能直接就移除,因为在有些时候,这些词可能也会成为关键字。所以,如何从文档中提取关键词需要进一步的思考。
2. TF-IDF核心思想
为了解析出关键词,首先我们需要理解什么叫关键词。很多人不自觉地就会说出,关键词就是自然就是“关键”的词啊。但是这就是用概念来解释概念,并没有说出关键词的本质。我们人在读书的时候,往往会从文章中读取一个主题,然后通过主题来识别关键字,比如在读人工智能的技术文章时,我们就会先入为主地有个意识,文章中会介绍与人工智能相关的知识,那么必然有一个主题及围绕主题展开的关键词,如本文中的“TF-IDF”、“频率”、“关键词”等内容。看上去非常自然的想法,在程序中却很难实现,程序没有办法象人类一样形成这样的意部,所以我们需要一种新的方法来定义关键字为什么“关键”。
在TF-IDF的定义中,基原理其实很简单:对每个词在所有的出现的文章中,对其出现的频率进行统计,就可以得到其平均出现频率,那么如果在某篇文章中其出现频率明显高于这个值,则就可以认为这个词是关键词。也就是说,一个词关键与否,可以由它的出现的频率的变化来判断。这种思想其实在生活中我们也经常使用,比如电视电影中,某个人物甚至是物品,如果出场次数要明显高于其应有的频率,那么就应该是关键人物或道具。
3. TF-IDF定义
给定语料库 $L$,其中的文章总数为 $N$,在这些文档中,出现术语 $t$ 的文章分别为 $a_1, a_2, ..., a_n$,总数量为$n$篇,那么 TF-IDF 的权重定义如下:
- TF:术语频率,用于测量术语在某文档中出现的频率。由于每个文档的长度都不同,因此一个术语在长文档中出现的次数可能会比短文档中出现的次数更多。因此,作为标准化的一种方式,经常将术语频率除以文档长度(也就是文档中术语的总数): $TF(a, t) =(术语t在文档中a中出现的次数)/(文档a中术语的总数)$
- IDF:逆文档频率,用于衡量术语在多个文件中的重要性。在计算TF时,所有术语都被视为同等重要。但是,众所周知,某些术语(如 “是”、“属于”、“那个”等)虽然会经常出现,但是往往其意义却不大。因此,我们需要通过计算以下内容来权衡常用术语: $IDF(L, t)= log(语料库中L文档总数/其中带有术语t的文档数)$ 另外,需要指出一点,在公式中使用指数的目的,是为了放大计算出来的结果,从而更好地体现出IDF的特性。
所以,TF-IDF实际是由TF和IDF两部分组成,前者一般是表示某文章中的权值,而后者是所有文章的权值,最终的结果是两者的乘积。这样的计算方式能够有效地提高关键字在提取时的精准程序。下面,让我们来通过示例理解其计算过程。
假定以在上的例子中,在某篇文章长度为1000的文章中,出现了“自然语言处理”5次,那么可以得到TF值为 5/1000 = 0.005。所用到的语料库中共有1000万篇文章,其中包括“自然语言处理”的文章有1000篇,那么IDF的值为 log(10,000,000/1,000) = 4。因此“自然语言处理”在此文中的TF-IDF的权值为 0.005*4=0.02。
经过计算,我们可以得到每一个词的TF-IDF值。在进行文章的关键字抽取中,可以使用排名算法对所有的术语进行排名以文章的关键词。其中,最简单的排名算法之一就是直接将TF-IDF权值排序,列出值最大的几个。为了提高选择结果,还有许多排名算法,但基本上都是在此版本上的改进。
通过本节的学习,我们可以看到TF-IDF算法简单,也非常容易实现。实践表明,只要有足够的语料库进行学习,提取效果很好,所以作为一种常用的关键字提取的算法得到比较广泛的应用。不过,也需要提出一些,由于在TF-IDF算法中,只对出现的频率进行统计计算,对所有的术语的每一次出现都“平等”对待,所以需要语料有一定的容量才可以避免因为一些“不平等”的情况的偏差导致的提取精度的问题,最终取得比较好的效果。
4. 推荐阅读
- What is TF-IDF 内容不错,很基础,而且解释的也很清楚。
- TF-IDF的定义及计算 以具体的实例展示了计算过程,可以借鉴。
- 对TF-IDF的理解与数学推导 有大量数据公式,可以参考。
- What does tf-idf mean? 介绍了TF-IDF核心思想和基本原理。
- 代码示例 This is an open-source Python implementation of Tf-idf.
- Absolute and Weighted Frequency of Words in Text In this tutorial, you'll learn about absolute and weighted word frequency in text mining and how to calculate it with defaultdict and pandas DataFrames.