先说一下自动文摘的方法。自动文摘(Automatic Summarization)的方法主要有两种:Extraction和Abstraction。其中Extraction是抽取式自动文摘方法,经过提取文档中已存在的关键词,句子造成摘要;Abstraction是生成式自动文摘方法,经过创建抽象的语意表示,使用天然语言生成技术,造成摘要。因为生成式自动摘要方法须要复杂的天然语言理解和生成技术支持,应用领域受限。因此本人学习的也是抽取式的自动文摘方法。css
目前主要方法有:python
textrank算法web
TextRank算法基于PageRank,用于为文本生成关键字和摘要。算法
PageRank最开始用来计算网页的重要性。整个www能够看做一张有向图图,节点是网页。若是网页A存在到网页B的连接,那么有一条从网页A指向网页B的有向边。shell
构造完图后,使用下面的公式:
S(Vi)是网页i的中重要性(PR值)。d是阻尼系数,通常设置为0.85。In(Vi)是存在指向网页i的连接的网页集合。Out(Vj)是网页j中的连接存在的连接指向的网页的集合。|Out(Vj)|是集合中元素的个数。
PageRank须要使用上面的公式屡次迭代才能获得结果。初始时,能够设置每一个网页的重要性为1。上面公式等号左边计算的结果是迭代后网页i的PR值,等号右边用到的PR值全是迭代前的。
举个例子:
上图表示了三张网页之间的连接关系,直觉上网页A最重要。能够获得下面的表:学习
结束\起始 | A | B | C |
A | 0 | 1 | 1 |
B | 0 | 0 | 0 |
C | 0 | 0 | 0 |
横栏表明其实的节点,纵栏表明结束的节点。若两个节点间有连接关系,对应的值为1。
根据公式,须要将每一竖栏归一化(每一个元素/元素之和),归一化的结果是:
ui
结束\起始 | A | B | C |
A | 0 | 1 | 1 |
B | 0 | 0 | 0 |
C | 0 | 0 | 0 |
上面的结果构成矩阵M。咱们用matlab迭代100次看看最后每一个网页的重要性:lua
M = [0 1 1 0 0 0 0 0 0]; PR = [1; 1 ; 1]; for iter = 1:100 PR = 0.15 + 0.85*M*PR; disp(iter); disp(PR); end
运行结果(省略部分):
spa
......
95
0.4050 0.1500 0.1500 96 0.4050 0.1500 0.1500 97 0.4050 0.1500 0.1500 98 0.4050 0.1500 0.1500 99 0.4050 0.1500 0.1500 100 0.4050 0.1500 0.1500
最终A的PR值为0.4050,B和C的PR值为0.1500。
若是把上面的有向边看做无向的(其实就是双向的),那么:
3d
M = [0 1 1 0.5 0 0 0.5 0 0]; PR = [1; 1 ; 1]; for iter = 1:100 PR = 0.15 + 0.85*M*PR; disp(iter); disp(PR); end
运行结果(省略部分):
.....
98
1.4595 0.7703 0.7703 99 1.4595 0.7703 0.7703 100 1.4595 0.7703 0.7703
依然能判断出A、B、C的重要性。
TextRank
TextRank 算法是一种用于文本的基于图的排序算法。其基本思想来源于谷歌的 PageRank算法, 经过把文本分割成若干组成单元(单词、句子)并创建图模型, 利用投票机制对文本中的重要成分进行排序, 仅利用单篇文档自己的信息便可实现关键词提取、文摘。和 LDA、HMM 等模型不一样, TextRank不须要事先对多篇文档进行学习训练, 因其简洁有效而获得普遍应用。
TextRank 通常模型能够表示为一个有向有权图 G =(V, E), 由点集合 V和边集合 E 组成, E 是V ×V的子集。图中任两点 Vi , Vj 之间边的权重为 wji , 对于一个给定的点 Vi, In(Vi) 为 指 向 该 点 的 点 集 合 , Out(Vi) 为点 Vi 指向的点集合。点 Vi 的得分定义以下:
其中, d 为阻尼系数, 取值范围为 0 到 1, 表明从图中某一特定点指向其余任意点的几率, 通常取值为 0.85。使用TextRank 算法计算图中各点的得分时, 须要给图中的点指定任意的初值, 并递归计算直到收敛, 即图中任意一点的偏差率小于给定的极限值时就能够达到收敛, 通常该极限值取 0.0001。
1. 基于TextRank的关键词提取
关键词抽取的任务就是从一段给定的文本中自动抽取出若干有意义的词语或词组。TextRank算法是利用局部词汇之间关系(共现窗口)对后续关键词进行排序,直接从文本自己抽取。其主要步骤以下:
(1)把给定的文本T按照完整句子进行分割,即
(2)对于每一个句子,进行分词和词性标注处理,并过滤掉停用词,只保留指定词性的单词,如名词、动词、形容词,即
,其中
是保留后的候选关键词。
(3)构建候选关键词图G = (V,E),其中V为节点集,由(2)生成的候选关键词组成,而后采用共现关系(co-occurrence)构造任两点之间的边,两个节点之间存在边仅当它们对应的词汇在长度为K的窗口中共现,K表示窗口大小,即最多共现K个单词。
(4)根据上面公式,迭代传播各节点的权重,直至收敛。
(5)对节点权重进行倒序排序,从而获得最重要的T个单词,做为候选关键词。
(6)由(5)获得最重要的T个单词,在原始文本中进行标记,若造成相邻词组,则组合成多词关键词。例如,文本中有句子“Matlab code for plotting ambiguity function”,若是“Matlab”和“code”均属于候选关键词,则组合成“Matlab code”加入关键词序列。
TextRank源码解析
1.读入文本,并切词,对切词结果统计共现关系,窗口默认为5,保存大cm中
cm = defaultdict(int) #切词 words = tuple(self.tokenizer.cut(sentence)) for i, wp in enumerate(words): #(enumerate枚举的方式进行) #过滤词性,停用词等 if self.pairfilter(wp): for j in xrange(i + 1, i + self.span): if j >= len(words): break if not self.pairfilter(words[j]):#过滤 continue #保存到字典中 if allowPOS and withFlag: cm[(wp, words[j])] += 1 else: cm[(wp.word, words[j].word)] += 1