有一篇很长的文章,我要用计算机提取它的关键词(Automatic Keyphrase extraction),完全不加以人工干预,请问怎样才能正确做到?

这个问题涉及到数据挖掘、文本处理、信息检索等很多领域,但有一个非常简单的经典算法,可以给出令人相当满意的结果,这就是TF-IDF(Term Frequency–Inverse Document Frequency)算法,由于其常被用于挖掘文章中的关键词,而且算法简单高效,被工业界广泛用于最开始的文本数据清洗。

TF-IDF有两层意思,一层是”词频”(Term Frequency,缩写为TF),另一层是”逆文档频率”(Inverse Document Frequency,缩写为IDF)。

单词频率 TF (Term Frequency)

TF表示某一个给定的词语在该文件中出现的频率。TF 背后的隐含的假设是,文档的重要程度,也就是相关度,与单词在文档中出现的频率成正比。比如,“Car” 这个单词在文档 A 里出现了的频率为 0.1,而在文档 B 里出现了 0.2,那么 TF 计算就认为“Car” 这个单词与文档 B 可能更相关。

然而,信息检索工作者很快就发现,仅有 TF 不能比较完整地描述文档的相关度。因为语言的因素,有一些单词可能会比较自然地在很多文档中反复出现,比如英语中的 “The”、“An”、“But” 等等。这些词大多起到了链接语句的作用,是保持语言连贯不可或缺的部分。然而,如果我们要搜索 “How to Build A Car” 这个关键词,其中的 “How”、“To” 以及 “A” 都极可能在绝大多数的文档中出现,这个时候 TF 就无法帮助我们区分文档的相关度了。

逆文档频率 IDF(Inverse Document Frequency)

IDF就在这样的情况下应运而生。这里面的思路其实很简单,那就是我们需要去 “惩罚”(Penalize)那些出现在太多文档中的单词

也就是说,真正携带 “相关” 信息的单词仅仅出现在相对比较少,有时候可能是极少数的文档里。这个信息,很容易用 “文档频率DF” 来计算,也就是,有多少文档涵盖了这个单词。很明显,如果有太多文档都涵盖了某个单词,这个单词也就越不重要,或者说是这个单词就越没有信息量。因此,我们需要对 TF 的值进行修正,而 IDF 的想法是用 DF 的倒数来进行修正。倒数的应用正好表达了这样的思想,DF 值越大越不重要

TF-IDF计算步骤

第一步,计算词频

  • 式子中 是该词在文件 中的出现次数
  • 而分母则是在文件 中所有字词的出现次数之和。

第二步,计算逆文档频率

  • 式子中|D|表示语料库中的文件总数
  • 表示包含词语 的文件数目

第三步,计算TF-IDF

例子

假如一篇文件的总词语数是100个,而词语“火箭”出现了3次,火箭”一词在999份文件出现过,文件总数是10,000,000份的话。

“火箭”一词在该文件中的词频TF就是3/100=0.03
“火箭”一词的文件频率IDF为lg(10,000,000 / (999 + 1))=4
所以TF-IDF的分数为0.03 * 4=0.12


参考文章:
TF-IDF
维基百科tf-idf
TF-IDF与余弦相似性的应用(一):自动提取关键词