TextRank调研记录

对TextRank算法及其调用方法进行介绍。

从PageRank说起

TextRank算法和PageRank算法类似,都是通过建图对结点的重要程度进行评估,因此这里先介绍PageRank算法。

PageRank是一种经典的网页排序算法,它认为一个网页的质量可以被链接到这个网页的其它网页的质量定义,据此提出了下面的公式:

S(Vi)=(1d)+djIn(Vi)1Out(Vj)S(Vj)S(V_i) = (1-d) + d * \sum_{j \in In(V_i)} \frac 1 {|Out(V_j)|} S(V_j)

其中ViV_i表示某个网页,S(Vi)S(V_i)表示网页ViV_i的PageRank值;VjV_j表示链接到ViV_i的网页,S(Vj)S(V_j)表示网页VjV_j的PageRank值。Out(Vj)|Out(V_j)|表示网页VjV_j链接出去的总数目,dd表示阻尼系数。

公式背后的思想就是,网页的价值被其它链接到该网页的网页价值所定义。当某网页被一些高质量的网页所链接的时候,该网页的价值也理应变大;而当某网页很少有网页链接到它,或者链接到它的网页价值均较低的时候,该网页的价值也较低。

注意PageRank是一个迭代算法,即图中每个结点的PageRank值都按照上面的公式进行迭代计算,直到整体趋于稳定。

TextRank

TextRank也和PageRank的思想类似。在PageRank算法中,图的结点为网页页面;而到了TextRank,结点就变成了某个词语。在TextRank算法中,基于单词在N-gram的中的共现关系进行构图:

TextRank构图示例

考虑到每个词对都会有不同的共现次数,将PageRank中的公式修改如下:

WS(Vi)=(1d)+djIn(Vi)wjiVkOut(Vj)wjkWS(Vj)WS(V_i)=(1-d) + d * \sum_{j \in In(V_i)} \frac {w_{ji}} {\sum_{V_k \in Out(V_j)} w_{jk}} WS(V_j)

和PageRank算法唯一的不同在于引入了权重wijw_{ij}表示第ii个词和第jj个词之间的共现频率。

使用TextRank提取关键词的算法流程

TextRank的算法整体流程如下:

  1. 对给定的文本T进行分句
  2. 对于每个句子进行分词和词性标注,过滤掉停用词,只保留指定词性的词语,如名词、动词、形容词这类实义词
  3. 基于词共现关系(N-gram)构建无向图
  4. 根据上面的公式,迭代计算各个结点的TextRank值,直至收敛
  5. 对每个图结点(单词)根据TextRank值进行排序,选择出最重要的K个词,作为候选关键词
  6. 对于这K个关键词在原文中进行标记,若构成相邻词组,则将这些关键词合并成多词关键词

如何使用(现成的调用工具)

在网上找到了基于TextRank算法实现的工具包summa,可通过pip安装:

1
pip install summa

使用方法如下,输入一段文本段落,自动提取出关键词:
summa使用方法

此外还可以通过参数ratio指定关键词数目占全文比率;通过参数words指定关键词数目(大致数目)等:

改变参数值控制关键词数目

通过设置参数scores=True可以输出每个关键词的分值:
输出关键词的分值

参考

Author: yym6472
Link: https://yym6472.github.io/2020/01/19/TextRank调研记录/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.