TF-IDF与文章关键词提取实践

—— 结合实例分析TF-IDF的文章关键词提取流程

momo314相同方式共享非商业用途署名转载



TF-IDF简介

TF-IDF(term frequency–inverse document frequency)是自然语言处理NLP中非常基础、非常简单且经典的算法。他可以从一段文字中分析和提取关键词,当然,前提是,你得有一个语料库。

TF: term frequency, 词频。

IDF: inverse document frequency, 逆文档频率。

语料库:可以通俗的理解为包含了足够多的文章一个数据集。


使用TF-IDF提取关键词

下面,我们以一个实例来分析TF-IDF提取关键词的详细过程。

首先,我们以 《住在我楼上的绝命毒师》 这篇文章为例;而且我们假设你已经有一个现成的语料库了(语料库在网上可以下载到,甚至可以按文章类型分类)。

步骤一:对文章分词并统计每个词语的出现次数

中文分词比英文分词要更加麻烦,不过现成的模块还是有很多的,本文以结巴分词为例,毕竟,如果你的分词结果能够区分词性的话,将会使关键词的提取更为准确。

在这一步中,我们得到了一个字典,key为词语本身,value则是词语在这篇文章中的出现次数。此时就很容易想到,词语的出现次数越高,则越有可能就是本文的关键词。

所以,按照词语在文章中的出现次数做倒序排序。可是做完排序之后,我们通常就会发现:出现次数最多的词永远都是:“的”、“是”、“说”、“在” 这种词。显然,这些没有任何意义的词是不能作为文章关键词的。

此时,我们需要引入一个新的概念:停用词。

步骤二:过滤停用词

停用词(stop words):通俗的解释为,在文章中频繁出现,但又并无实际意义或无法单独表示明确含义的,且对分析和检索无法提供帮助的词语。按照词性来说,助词、连词、数词、量词、代词、介词、语气词、拟声词、形副词、叹词、方位词、时间词,甚至是动副词、动介词等,都有极高的概率是停用词。但需要注意的是,按照你的应用程序功能,或者分析文章的类型不同,停用词表并不是通用的。

经过这一步之后,我们就可以得到一个有序的、且有意义的词语列表了。

那么这个结果做排序之后,直接提取出现次数最多的几个有意义的词,就可以做关键词了吗?当然不行,原因有二:

  1. 从上帝视角来看,毕竟我们的两个重点:TFIDF 画一个都没出场呢...
  2. 从实际情况具体分析来看,算了,这个原因待会儿再说...

步骤三:计算每个词语的词频(TF / term frequency)

词频:故名思意,一个词在文章中出现的频率。计算公式如下:

TF(w,d) = AppearanceTimes(w,d) / TotalWords(d)

  • TF(w,d):词语w在文档d中出现的频率,即词频。
  • AppearanceTimes(w,d):词语w在文档d中出现的次数。
  • TotalWords(d):文档d中的词语总数

经过这一步的计算,实际上列表的排序没有发生任何变化(不管是以词语的出现次数排序还是以词语的词频排序),所以这一步的结果自然也没有办法作为最终的文章关键词。

好了,说原因:

为什么不能以文章内的词语出现次数或者词频(TF)直接作为提取文章关键词的依据呢?

首先,我们阅读这篇文章,用事实说话。以两个词为例:“公司”一次,出现了20多次;而“制毒”一词,只出现了区区6次。是不是“公司”一词比“制毒”一词更能代表文章的主旨呢?用脚想都知道不可能,明明“制毒”一词跟文章主旨更为相关。那么问题到底出现在哪呢?这就是 IDF(inverse document frequency, 逆文档频率) 要解决的问题了。关于IDF如何解决这个问题,继续往下看。

步骤四:计算每个词语的逆文档频率(IDF / inverse document frequency)

IDF:nverse document frequency, 逆文档频率。

继续使用上面的例子(“公司”和“制毒”二词)。为了让“制毒”一词胜出,最常用的方法就是加权,为每个词语配上不同的权重。

那么怎么通过一个更为通用的方法,使得“制毒”一词的权重超过“公司”一词呢?

这就该语料库出场了。通常情况下,一个完整的语料库基本能够代表一门语言的正常使用情况(每个词语在语料库中的出现频率也代表了在这门语言的整体语境中出现的频率),而一个词语在语料库中出现的越频繁,他的权重也就应该越低才对(低到极限,它就变成了停用词)。想象一下,“公司”一词的出现频率显然要远远高于“制毒”一词。通过这种方法,我们就可以提升“制毒”一词的权重,使其在关键词分析中更有可能战胜“公司”一词。

公式如下:

IDF(w) = log( AllDocumentCount() / (DocumentCount(w) + 1) )

  • IDF(w):词语w的逆文档频率。
  • AllDocumentCount():语料库中的文档总数。
  • DocumentCount(w):语料库中包含词语w的文档总数。
  • +1:防止被除数为0。

步骤五:计算每个词语的最终频率,并排序取出Top(X)的关键词

F(w,d) = TF(w,d) * IDF(w)

  • F(w,d):词语w在文档d中的最终频率。
  • TF(w,d):词语w在文档d中出现的频率,即词频
  • IDF(w):词语w的逆文档频率。

计算完每个词语的最终频率之后,按照最终频率进行倒序排序,直接获取Top(X),就是文章的关键词列表了。


优缺点分析

开篇提到了,TF-IDF算法算是NLP中非常非常基础的算法,基础到甚至都不需要高等数学。所以呢,优点很明显:

  1. 简单,因为简单,所以高效,快速;
  2. 对于算法的复杂程度来说,结果还算比较理想。

说到缺点呢,通过对多篇文章的分析结果来看:

  1. 对语料库的依赖过重

    目前看来,比较无解,各种机器学习算法的依赖更重,所以也不算缺点吧。

  2. 只能提取文章中出现过的词语

    举例来说,一片讲修辞手法的文章出现更多的词可能是“拟人”、“比喻”、“排比”等,而不是“修辞手法”这个词,CBOW的词预测貌似可以解决这个缺陷。

  3. 结果不够精确,无法适应对结果有高精度要求的场景

    更高精度可以考虑下机器学习,比如 Word2Vec / Doc2Vec。

  4. 另外,算法中没有考虑词与词之间的位置和语义上的关系。

    这也是导致结果不够精准的原因之一

✎﹏ 本文来自于 momo314和他们家的猫,文章原创,转载请注明作者并保留原文链接。