算法浅入浅出之Textrank

蹲街弑〆低调 提交于 2020-03-01 01:34:27

一 自动文摘的方法

       自动文摘(Automatic Summarization)的方法主要有两种:Extraction和Abstraction。

              Extraction是抽取式自动文摘方法,通过提取文档中已存在的关键词,句子形成摘要;

              Abstraction是生成式自动文摘方法,通过建立抽象的语意表示,使用自然语言生成技术,形成摘要。由于生成式自动摘要方法需要复杂的自然语言理解和生成技术支持,应用领域受限。

  目前主要方法有:

  • 基于统计:统计词频,位置等信息,计算句子权值,再简选取权值高的句子作为文摘,特点:简单易用,但对词句的使用大多仅停留在表面信息。
  • 基于图模型:构建拓扑结构图,对词句进行排序。例如,TextRank/LexRank
  • 基于潜在语义:使用主题模型,挖掘词句隐藏信息。例如,采用LDA,HMM
  • 基于整数规划:将文摘问题转为整数线性规划,求全局最优解。

二. TextRank算法

 TextRank 算法是一种用于文本的基于图的排序算法。其基本思想来源于谷歌的 PageRank算法, 通过把文本分割成若干组成单元(单词、句子)并建立图模型, 利用投票机制对文本中的重要成分进行排序, 仅利用单篇文档本身的信息即可实现关键词提取、文摘。和 LDA、HMM 等模型不同, TextRank不需要事先对多篇文档进行学习训练, 因其简洁有效而得到广泛应用。

  TextRank 一般模型可以表示为一个有向有权图 G =(V, E), 由点集合 V和边集合 E 组成, E 是V ×V的子集。图中任两点 Vi , Vj 之间边的权重为 wji , 对于一个给定的点 Vi, In(Vi) 为 指 向 该 点 的 点 集 合 , Out(Vi) 为点 V指向的点集合。点 Vi 的得分定义如下:

  其中, d 为阻尼系数, 取值范围为 0 到 1, 代表从图中某一特定点指向其他任意点的概率, 一般取值为 0.85。使用TextRank 算法计算图中各点的得分时, 需要给图中的点指定任意的初值, 并递归计算直到收敛, 即图中任意一点的误差率小于给定的极限值时就可以达到收敛, 一般该极限值取 0.0001

 

举个例子:


上图表示了三张网页之间的链接关系,直觉上网页A最重要。可以得到下面的表:
   结束\起始 A B C
A 0 1 1
B 0 0 0
C 0 0 0



横栏代表其实的节点,纵栏代表结束的节点。若两个节点间有链接关系,对应的值为1。

根据公式,需要将每一竖栏归一化(每个元素/元素之和),归一化的结果是:

 

   结束\起始 A B C
A 0 1 1
B 0 0 0
C 0 0 0



上面的结果构成矩阵M。我们用matlab迭代100次看看最后每个网页的重要性:

  1. M = [0 1 1
  2. 0 0 0
  3. 0 0 0];
  4. PR = [1; 1 ; 1];
  5. for iter = 1:100
  6. PR = 0.15 + 0.85*M*PR;
  7. disp(iter);
  8. disp(PR);
  9. end

运行结果(省略部分):

 

  1. ......
  2. 95
  3. 0.4050
  4. 0.1500
  5. 0.1500
  6. 96
  7. 0.4050
  8. 0.1500
  9. 0.1500
  10. 97
  11. 0.4050
  12. 0.1500
  13. 0.1500
  14. 98
  15. 0.4050
  16. 0.1500
  17. 0.1500
  18. 99
  19. 0.4050
  20. 0.1500
  21. 0.1500
  22. 100
  23. 0.4050
  24. 0.1500
  25. 0.1500

最终A的PR值为0.4050,B和C的PR值为0.1500。

如果把上面的有向边看作无向的(其实就是双向的),那么: 

  1. M = [0 1 1
  2. 0.5 0 0
  3. 0.5 0 0];
  4. PR = [1; 1 ; 1];
  5. for iter = 1:100
  6. PR = 0.15 + 0.85*M*PR;
  7. disp(iter);
  8. disp(PR);
  9. end

运行结果(省略部分):

 

  1. .....
  2. 98
  3. 1.4595
  4. 0.7703
  5. 0.7703
  6. 99
  7. 1.4595
  8. 0.7703
  9. 0.7703
  10. 100
  11. 1.4595
  12. 0.7703
  13. 0.7703

依然能判断出A、B、C的重要性。

 

3. 基于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

  1.     cm = defaultdict(int)
  2. #切词
  3. words = tuple(self.tokenizer.cut(sentence))
  4. for i, wp in enumerate(words): #(enumerate枚举的方式进行)
  5. #过滤词性,停用词等
  6. if self.pairfilter(wp):
  7. for j in xrange(i + 1, i + self.span):
  8. if j >= len(words):
  9. break
  10. if not self.pairfilter(words[j]):#过滤
  11. continue
  12. #保存到字典中
  13. if allowPOS and withFlag:
  14. cm[(wp, words[j])] += 1
  15. else:
  16. cm[(wp.word, words[j].word)] += 1

资料来源

https://www.cnblogs.com/chenbjin/p/4600538.html

https://www.bbsmax.com/A/E35poxwEJv/

http://blog.csdn.net/aijianiula/article/details/54728422

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!