目前主流的文本摘要自动生成有两种方式:抽取式(extractive),另一种是生成式(abstractive)。
- 抽取式顾名思义,就是按照一定的权重,从原文中寻找跟中心思想最接近的一条或几条句子。
- 生成式则是计算机通读原文后,在理解整篇文章意思的基础上,按自己的话生成流畅的翻译。
详细分类如下:
-
Extraction 抽取式
- 传统机器学习模型
- 基于统计:统计词频,位置等信息,计算句子权值,再简选取权值高的句子作为文摘,特点:简单易用,但对词句的使用大多仅停留在表面信息。
- 基于图模型:构建拓扑结构图,对词句进行排序。例如,无监督图模型(TextRank)/LexRank。和 LDA、HMM 等模型不同,TextRank 无需对多篇文档进行训练,仅利用单篇文档本身的信息即可完成关键句提取,从而被业界广泛使用;
- 基于潜在语义:使用主题模型,挖掘词句隐藏信息。例如,采用主题模型(LDA),隐马尔可夫模型(HMM)。
- 基于线路规划:将摘要问题转为线路规划,求全局最优解。
- 深度学习神经网络模型
- 通过对各句子进行二分类来判断是否为关键句。
- 传统机器学习模型
-
Abstraction 生成式
在python语言中用于文本摘要自动提取的库包括goose,SnowNLP,TextTeaser,sumy,TextRank等。
一、PageRank
TextRank算法是根据google的pagerank算法改造得来的,google用pagerank算法来计算网页的重要性。textrank在pagerank的原理上用来计算一个句子在整个文章里面的重要性,下面通过一个例子来说明一下:
图中每个球都代表了一张网页,每一个箭头代表该网页上有其它网页的超链接,如D球,它有指向A的箭头,代表D网页上有A的连接,而E指向了D表示E网页上有D的连接。被引用的越多代表该网页的重要性越大。表格如下
通过这张表可以计算每张网页被其它网页引用的次数,从而算出这张网页的重要程度,计算公式如下:
式中d代表阻尼系数,d∈[0,1],一般取d=0.85。对于B来说,有三个页面推荐了B,S(vi)代表的是页面的初始分数,这里一般设置为1,也可以设置成其他。所以S(B)=(1-0.85)+0.85*((1/2)*1+(1/2)*1+(1/2)*1)便是页面B的分数,依次计算得到所有页面的分数。再将页面分数rank取topN就可以得到N个最重要的页面。
二、TextRank
TextRank用于关键词提取的流程如下:
- 第一步是把所有文章整合成文本数据
- 接下来把文本分割成单个句子
- 然后,我们将为每个句子找到向量表示(词向量);可以使用word2vec将句子向量化
- 计算句子向量间的相似性并存放在矩阵中;
- 然后将相似矩阵转换为以句子为节点、相似性得分为边的图结构,用于句子TextRank计算。
- 最后,一定数量的排名最高的句子构成最后的摘要。
在 TextRank 中,人们用句子的相似性来取代网页之间的相互链接的个数。
前面提到计算两个网页之间的互相引用的次数从而得打网页的重要性,那么句子之间的连续如何建立了?
传统的方法是比较句子中相同单词的个数,比如“I am a dog”,“you are a dog"这两个句子有连个相同的单词"a”,“dog”。这两个单词同属于两个句子,因此 S ( s i , s j ) = 2 / l o g ( 4 ) + l o g ( 4 ) S(s_i,s_j)=2/log(4)+log(4) S(si,sj)=2/log(4)+log(4)。
有了句子的相似度,我们就可以建立邻接矩阵。注意到相似度是不分出度和入度的,因此邻接矩阵是关于对角线对称的矩阵。
通过相似度矩阵,我们就可以通过以下公式来计算上图中顶点
S
i
S_i
Si (句子
V
i
V_i
Vi)的重要性分数
S
(
V
i
)
S(V_i)
S(Vi):
S
(
V
i
)
=
(
1
−
d
)
+
d
∗
∑
V
j
∈
A
d
j
c
e
n
t
(
V
i
)
e
(
V
i
,
V
j
)
∑
V
k
∈
A
d
j
c
e
n
t
(
V
j
)
e
(
V
j
,
V
k
)
∗
S
(
V
j
)
S(V_{i})=(1-d)+d*\sum_{V_{j}\in Adjcent(V_{i})}\frac{e(V_i,V_j)}{\sum_{V_{k}\in Adjcent(V_{j})}e(V_j,V_k)}*S(V_{j})
S(Vi)=(1−d)+d∗Vj∈Adjcent(Vi)∑∑Vk∈Adjcent(Vj)e(Vj,Vk)e(Vi,Vj)∗S(Vj)
- V i V_i Vi 代表文档中第 i i i 个句子;
- 图中顶点 V i V_i Vi 和 V j V_j Vj 之间边的权重表示为 e ( V i , V j ) e(V_i,V_j) e(Vi,Vj), e ( V i , V j ) e(V_i,V_j) e(Vi,Vj) 的值等于两个句子间的相似度 s i m ( V i , V j ) sim(V_i,V_j) sim(Vi,Vj);
- 针对图中给定顶点 V i V_i Vi, A d j e c t ( V i ) Adject(V_i) Adject(Vi) 代表与它的相邻的一组顶点
参考资料:
TEXTRANK算法原理及应用示例
PageRank算法详解
PageRank算法–从原理到实现
GitHub项目:TextRank4ZH
GitHub项目:Text-Auto-Summarization
GitHub项目:Automatic-generation-of-text-summaries
GitHub项目:W2V_TextRank
GitHub项目:word2vec_textrank
TextRank算法详细讲解与代码实现(完整)
基于TextRank的抽取式文本摘要(英文)
基于TextRank算法的文本摘要(处理英文)(附Python代码)
TextRank