03.03 TF-IDF关键词提取算法的Python实现

关键词提取是词语颗粒度的信息抽取的一种重要的需求,即提取文章中重要的词语。

关键词提取的常用方法包括词频统计、TF-IDF和TextRank等。

其中,词频和TextRank属于单文档算法,即只需一篇文章即可提取出其中的关键词;而TF-IDF则属于多文档宣发,需要其他文档的辅助来提取当前文章的关键词。


TF-IDF原理

因为如果一个词在越多的文档里出现,则越说明这个词不能体现出文档的特色。

相较于词频统计的方法,TF-IDF(term frequency–inverse document frequency)在考虑文档中词语出现频率的同时,还考虑了词语相较于其他文档的稀有程度,即还有多少其他的文档包含这个词语。

TF-IDF的计算方法如下:

TF-IDF关键词提取算法的Python实现

TF-IDF计算公式

其中t表示单词,d表示文档,TF(t,d)表示单词t在文档d中的出现频次,DF(t)表示包含单词t的文档数量,IDF表示DF的倒数。

例如,我们统计1000篇与古风相关的文章的关键词。已知其中有800篇文章都包含“古风”这个词,而只有50篇文章包含“七言律诗”这个词。在文章A中,出现了20次“古风”,10次“七言律诗”。

如果使用词频统计提取关键词,文章A中的关键词,“古风”的权重应为“七言律诗”的2倍;但是如果使用TF-IDF提取关键词,“古风”的权重应为25,而“七言律诗”的权重为200。可见,TF-IDF可以更有效地突出文章的个性。

基于HanLP实现的TF-IDF

我们参考HanLP在Github中的案例进行尝试:

<code>from pyhanlp import *

TfIdfCounter = JClass('com.hankcs.hanlp.mining.word.TfIdfCounter')

if __name__ == '__main__':
counter = TfIdfCounter()
counter.add("《女排夺冠》", "女排北京奥运会夺冠") # 输入多篇文档
counter.add("《羽毛球男单》", "北京奥运会的羽毛球男单决赛")
counter.add("《女排》", "中国队女排夺北京奥运会金牌重返巅峰,观众欢呼女排女排女排!")

counter.compute() # 输入完毕
for id in counter.documents():
print(id + " : " + counter.getKeywordsOf(id, 3).toString()) # 根据每篇文档的TF-IDF提取关键词/<code>

运行结果

<code>《女排》 : [女排=5.150728289807123, 重返=1.6931471805599454, 巅峰=1.6931471805599454]
《女排夺冠》 : [夺冠=1.6931471805599454, 女排=1.2876820724517808, 奥运会=1.0]
《羽毛球男单》 : [决赛=1.6931471805599454, 羽毛球=1.6931471805599454, 男单=1.6931471805599454]/<code>

根据结果可以看到,文档中有效避免了“奥运会”这个在各个句子中都频繁出现的词拥有过高的权重。

学习参考文献:《自然语言处理入门》(何晗):9.2.2


分享到:


相關文章: