一、textrank 论文解读
textrank 的思想是从谷歌的pagerank借鉴的。那我们先来讲一下PageRank的原理,PageRank就是认为 如果一个网页被很多网页链接的话,那就认为这个网页很重要。对于textrank 来讲那就是 如果一个单词出现在很多单词后面,那么说明这个单词很重要。
textrank 是个基于图的算法,类似于熟悉的N-gram算法,在textrank中每一个词与其前面的N个词以及后面的N个词均具有图相邻的关系,与PageRank不同的是,textrank是无向图,又因为在网页浏览的背景下,一个页面包含到另一个页面的多个或部分链接是不寻常的,因此,基于图表的排名的最初定义是假定为“中性”。然而,在我们的模型中,图是从自然语言文本中构建的,并且可能包括从文本中提取的单元之间的多个或部分链接。
基于图的排序算法本质上是一种根据从图中提取的全局信息来决定图中定点重要性的方法。对于G = (V,E),这个图来说,V是顶点,(如果在关键词抽取中对应的单词词组,如果在摘要抽取中对应的是句子),E是边,对于一个顶点,In(Vi)是指指向Vi的所有顶点(前驱节点集合),OUT(Vi)是Vi指向的顶点的集合(后继节点集合)。d是一个阻尼系数,在这里起到平滑的作用,通常设置为0。85。
textrank 的公式为:
TextRank中一个单词的权重取决于与在前面的各个点组成的这条边的权重,以及这个点到其他其他边的权重之和。
textrank 主要分为两种应用:一种是 关键词抽取,一种是生成摘要。
关键词抽取的时候权重是要随机初始化,然后进行迭代。在生成摘要的时候,权重指的是句子的相似度,因为句子我们认为都是相邻的,因为之前会考虑到短语的共现性,认为共现性高的权重大,但是在句子的时候出现共现性的概率很小,所以我们一般默认不考虑。
关键词抽取时的评价方法为:precision recall F1-measure
生成摘要的评价方法为 ROUGE 评价方法,rouge评价方法rouge解释
二、源码解析
生成式摘要 主要用了jieba的代码
三、jieba textrank 应用
这里我们使用了清华大学刘志远老师的中文标记数据,是json形式的,
import json
import jieba.analyse
import codecs
def pre_rec_f1measure(y_pred,y_true):
news_num= len(y_pred)
p_m = 0.0
r_m = 0.0
for i in range(news_num):
lenp = len(y_pred[i])
lent = len(y_true[i])
tp = 0.0
if lenp==0:
if lent ==0:
p=1.0
else:
r = 0.0
elif lent ==0:
if lenp ==0 :
r = 1.0
else:
p = 0.0
else:
for word in y_true[i]:
if word in y_pred[i]:
tp+=1
p = tp/lenp
r = tp/lent
p_m += p
r_m +=r
precision =p_m/news_num
recall = r_m/news_num
f1_measure = 2*precision*recall/(recall+precision)
return precision,recall,f1_measure
def textran(path):
with codecs.open(path,'r','utf-8') as f:
for line in f.readllines():
doc = json.loads(lines)#将json文件转换成python文件
y_true = doc["tags"]
text = doc["content"]
y_pred = jieba.analyse.textrank(text,topK=2,withWeight=True)
return y_pred,y_true
if __name__ = '__main__':
y_pred,y_true = textran(path)
precision,recall,f1_measure = pre_rec_f1measure(y_pred,y_true)
print('precison is %.4f' % precision)
print('recall is %.4f'%recall)
print('f1_measure is %.4f'%f1_measure)