前言:我大致介绍一下TextRank算法的实现,对于细节和相关公式的介绍不做过多的介绍,感兴趣的同学可以去看TextRank算法的论文(英文版)里面有具体的实现,文章下载地址
一、TextRank算法简介
TextRank算法主要用于文档的关键词抽取和摘要的抽取,TextRank主要借鉴了PageRank的思想来实现的。PageRank是由Google用来体现网页之间的相关性和重要性,它是通过网页之间的超链接来计算网页的重要性。通过网页之间超链接之间的关系将不同的页面划分成不同的等级,页面划分等级的依据是根据各个页面之间给其他页面之间的投票来进行衡量的。而,TextRank提取关键词也正是采用了这种思想来实现的,它需要将一片文章先进行分词,然后将每个词语作为一个无向图的节点,最后通过单词之间的投票计算出权重。
二、TextRank实现
1、将给定输入的文章,进行分词,如何将文章进行分词可以使用jieba来实现。
2、对于分词的词语,我们可以对其词性进行标注处理,并可以过滤掉一些停用词(如:的、有...),只保留我们需要的词性的单词,名词或者动词或形容词。
3、将上述我们需要的词语构建一个关键词图,其中词语为图的节点,然后通过共现关系构造任意两点之间的变,两个节点之间存在边仅当他们对应的词汇在长度为k的窗口中共现,K表示窗口的大小,即一个窗口单词的个数默认是5.
4、然后根据公式计算,最后可以等到每个单词的权重,我们可以根据顺序选取权重最大的前几个。
5、对节点的权重进行排序,逆序排序,选取权重最大的前几个作为文章的关键词。
三、TextRank算法的测试
测试文章
有很多不同的数学公式可以用来计算tf-idf。
这边的例子以上述的数学公式来计算。
词频(tf)是一词语出现的次数除以该文件的总词语数。
假如一篇文件的总词语数是100个,而词语“母牛”出现了3次,
那么“母牛”一词在该文件中的词频就是3/100=0.03。
一个计算文件频率(DF)的方法是测定有多少份文件出现过“母牛”一词,
然后除以文件集里包含的文件总数。所以,如果“母牛”一词在1,000份文件出现过,
而文件总数是10,000,000份的话,其逆向文件频率就是log(10,000,000 / 1,000)=4。
最后的tf-idf的分数为0.03 * 4=0.12。
实现代码,使用jieba实现的
import sys
sys.path.append('../')
import jieba
import jieba.analyse
from optparse import OptionParser
file_name = "../txt/test.txt"
content = open(file_name, 'rb').read()
#topK表示输出多少个关键词,withWeight表示是否输出权重,如果想要获取权重,for x,w并将withWeight=True
#allowPOS表示输出的词性
for x in jieba.analyse.textrank(content,topK=20,withWeight=False,allowPOS=('ns','n','vn','v')):
print('%s' % (x))
输出结果
文件
出现
计算
词语
数学公式
份文件
频率
母牛
测定
集里
总数
包含
次数
用来
词频
逆向
方法
例子
四、TF-IDF测试结果
import sys
sys.path.append('../')
import jieba
import jieba.analyse
from optparse import OptionParser
file_name = "../txt/test.txt"
content = open(file_name, 'rb').read()
#10表示输出的前10个
tags = jieba.analyse.extract_tags(content, topK=10)
print(",".join(tags))
输出结果
000,文件,母牛,词语,tf,词频,100,0.03,idf,10
总结:对比TextRank算法和TF-IDF算法的结果,我们可以发现TextRank算法提取的关键词更能表现出文章的意思,而TF-IDF算法主要还是依靠词频来判断一个词语是否为文章的关键词。当然,如果你想要提高TF-IDF算法的准确性可以根据自己的业务需要,来使用适合自己业务的语料库和设置词语的权重来达到自己想要的效果,TF-IDF算法相对于TextRank算法来说,效率较高。但是,TextRank算法不需要自己来训练数据。