TextRank:Gensim使用的文本摘要算法

Gensim是Python的一个无监督主题模型与自然语言处理的开源库,它有许多高效易用的自然语言处理函数。其中有一个文本摘要函数summarize,可以从大量的文本中提取重要的信息。下面简要介绍一下Gensim中的summarize函数的算法。

文章目录

    • 文本摘要与TextRank
    • PageRank
    • TextRank
    • Gensim中的TextRank
    • 具体摘要算法

文本摘要与TextRank

文本摘要主要分为两种类型,抽取式(Extraction)和摘要式(Abstraction)。其中抽取式是从原文中抽取关键词语、句子或段落,再排列起来形成摘要;摘要式则是通过对原文进行语义分析,再使用自然语言生成技术生成摘要。抽取式摘要不需要大量语料进行训练,模型简洁高效。在抽取式摘要中,以句子为单位的抽取式摘要方法成为在内容的丰富性及语法的正确性上权衡之后获得很多很多模型青睐的算法,本文介绍的TextRank也是其中之一。

TextRank是基于图模型的一种抽取式摘要方法,TextRank不需要很深的语言学知识,也不需要特定领域或语言上的标签,具有很强的泛用性。这种特性使得TextRank在结构性强的文本中有不错的效果,比如新闻稿,会议记录等。TextRank的思路与搜索引擎中常用的PageRank相似,所以先简单介绍一下PageRank。

PageRank

PageRank是一个计算网页的重要程度的算法。借鉴学术界通过论文间的引用来评判论文重要程度的思想,PageRank使用了网页之间的链接来判断网页的重要程度。PageRank有两个重要的假设:

  1. 数量假设:一个网页被其他网页链接到的次数越多,则这个网页越重要。
  2. 质量假设:一个网页越重要,被其链接到的网页就越重要。

网页之间的链接关系用一个图 G ( V , E ) G(V, E) G(V,E)来表示最为直接,其中 V V V是顶点, E E E是边。在PageRank的模型中,每个网页是图 G G G中的一个顶点 v i v_i vi,若 v i v_i vi有链接指向到 v j v_j vj,则 v i v_i vi v j v_j vj之间存在一条边。衡量网页 v i v_i vi的重要性的 P R PR PR值定义为:

P R ( v i ) = ( 1 − d ) + d ∑ v j ∈ I n ( v i ) 1 ∣ O u t ( v j ) ∣ P R ( v j ) ,   i = 1 , 2 , . . . , n PR(v_i) = (1 - d) + d \sum_{v_j \in In(v_i)} \frac{1}{|Out(v_j)|}PR(v_j),\ i=1, 2, ..., n PR(vi)=(1d)+dvjIn(vi)Out(vj)1PR(vj), i=1,2,...,n

其中 I n ( v i ) In(v_i) In(vi)是指链接到网页 v i v_i vi的网页的集合, O u t ( v j ) Out(v_j) Out(vj)是网页 v j v_j vj链接出去的网页的集合, d d d是阻尼系数(damping factor),一般取值为 0.85 0.85 0.85 n n n是网页的总数。阻尼系数可以这么理解:用户到达网页 v i v_i vi后有概率 d d d会在网页上的链接中等概率地选择一个进行跳转,每个链接被选中的概率为 1 ∣ O u t ( v i ) ∣ \frac{1}{|Out(v_i)|} Out(vi)1,还有概率 1 − d 1-d 1d会随机跳转到任意页面。

有了公式以后就可以先给每个网页赋一个 P R PR PR的初值,再通过迭代的方法来计算了。

TextRank

在TextRank中,如果把句子看成图 G G G中的顶点,句子之间的相似度看成在顶点之间跳转的概率,就可以用类似的公式计算出TextRank的值 T R TR TR

T R ( v i ) = ( 1 − d ) + d ∑ v j ∈ I n ( v i ) w i j ∑ v k ∈ O u t ( v j ) w j k T R ( v j ) ,   i = 1 , 2 , . . . , n TR(v_i) = (1 - d) + d \sum_{v_j\in In(v_i)}\frac{w_{ij}}{\sum_{v_k\in Out(v_j)}w_{jk}}TR(v_j),\ i=1, 2, ..., n TR(vi)=(1d)+dvjIn(vi)vkOut(vj)wjkwijTR(vj), i=1,2,...,n

其中 w i j w_{ij} wij为句子 v i v_i vi v j v_j vj的相似度。相似度的计算方式有很多种,其中最简单的就是计算两个句子中有多少相同的词。如果把包含 n i n_i ni个不同的关键词 t 1 i , t 2 i , . . . , t n i i t^i_1, t^i_2, ..., t^i_{n_i} t1i,t2i,...,tnii的句子 v i v_i vi表示成 v i = { t 1 i , t 2 i , . . . , t n i i } v_i=\{t^i_1, t^i_2, ..., t^i_{n_i}\} vi={t1i,t2i,...,tnii},那么句子 v i v_i vi v j v_j vj的相似度 S i m ( v i , v j ) Sim(v_i, v_j) Sim(vi,vj)可以表示为:

S i m ( v i , v j ) = ∣ { t k ∣ t k ∈ v i & t k ∈ v j } ∣ log ⁡ ( ∣ v i ∣ ) + log ⁡ ( ∣ v j ∣ ) Sim(v_i, v_j) = \frac{|\{t_k|t_k \in v_i \& t_k \in v_j\}|}{\log(|v_i|) + \log(|v_j|)} Sim(vi,vj)=log(vi)+log(vj){tktkvi&tkvj}

然后通过迭代的方法计算出每个句子的 T R TR TR值,最后选取 T R TR TR值最高的几个句子组成摘要。

Gensim中的TextRank

Gensim做文本摘要的算法是TextRank的一个变体。从上面的公式中不难看出,相似度函数的选取非常重要,而Gensim正是使用了一个 TF-IDF \textup{TF-IDF} TF-IDF的变体 B M 25 \mathrm{BM25} BM25作为相似函数,从而在 D U C 2002 \mathrm{DUC2002} DUC2002数据集上获得了 2.92 % 2.92\% 2.92%的提升。

对于句子 v i v_i vi和句子 v j = { t m j ∣ m = 1 , 2 , . . . , n j } v_j=\{t^j_m|m=1,2,...,n_j\} vj={tmjm=1,2,...,nj} B M 25 \mathrm{BM25} BM25的定义如下:

B M 25 ( v i , v j ) = ∑ m = 1 n j I D F ( t m j ) f ( t m j , v i ) ⋅ ( k 1 + 1 ) f ( t m j , v i ) + k 1 ⋅ ( 1 − b + b ⋅ ∣ v i ∣ a v g D L ) \mathrm{BM25}(v_i, v_j) = \sum^{n_j}_{m=1} \mathrm{IDF}(t^j_m) \frac{f(t^j_m, v_i) \cdot (k_1+1)}{f(t^j_m, v_i) + k_1 \cdot (1 - b + b \cdot \frac{|v_i|}{avgDL})} BM25(vi,vj)=m=1njIDF(tmj)f(tmj,vi)+k1(1b+bavgDLvi)f(tmj,vi)(k1+1)

其中 f f f TF-IDF \textup{TF-IDF} TF-IDF中的 T F \mathrm{TF} TF函数, k 1 k_1 k1 b b b是参数,这里取 k 1 = 1.2 k_1=1.2 k1=1.2 b = 0.75 b=0.75 b=0.75 a v g D L avgDL avgDL是整个文本中句子的平均长度, I D F \mathrm{IDF} IDF函数则与 TF-IDF \textup{TF-IDF} TF-IDF中常用的定义不太一样,具体如下:

I D F ( t m j ) = { log ⁡ ( N − n ( t m j ) + 0.5 ) − log ⁡ ( n ( t m j ) + 0.5 )    i f   n ( t m j ) > N / 2 ϵ ⋅ a v g I D F i f   n ( t m j ) ≤ N / 2 \mathrm{IDF}(t^j_m) = \left\{\begin{aligned} &\log(N - n(t^j_m) + 0.5) - \log(n(t^j_m) + 0.5) \ \ &\mathrm{if}\ n(t^j_m) > N/2 \\ &\epsilon \cdot avgIDF &\mathrm{if}\ n(t^j_m) \leq N/2 \end{aligned}\right. IDF(tmj)={log(Nn(tmj)+0.5)log(n(tmj)+0.5)  ϵavgIDFif n(tmj)>N/2if n(tmj)N/2

其中 N N N是文本中句子的总数, n ( t m j ) n(t^j_m) n(tmj)是包含 t m j t^j_m tmj的句子的数量, ϵ \epsilon ϵ是取值在 0.5 0.5 0.5 0.3 0.3 0.3之间的参数,这里取 0.25 0.25 0.25 a v g I D F avgIDF avgIDF是所有词的 I D F IDF IDF的平均值。这里当 n ( t m j ) ≤ N / 2 n(t^j_m) \leq N/2 n(tmj)N/2时取一个固定值的原因是当 n ( t m j ) ≤ N / 2 n(t^j_m) \leq N/2 n(tmj)N/2时按原公式 I D F \mathrm{IDF} IDF的值会是一个负数,影响下一步的计算。

具体摘要算法

  1. 预处理。将输入文本切割成句子 v 1 , v 2 , . . . , v n v_1, v_2, ..., v_n v1,v2,...,vn,再对句子进行分词、去除停止词等操作得到关键词 t t t,此时句子可以表示成 v i = { t 1 i , t 2 i , . . . , t n i i } v_i=\{t^i_1, t^i_2, ..., t^i_{n_i}\} vi={t1i,t2i,...,tnii}
  2. 计算句子相似度。对所有 i , j = 1 , 2 , . . . , n i, j=1,2,...,n i,j=1,2,...,n计算 S i m ( v i , v j ) Sim(v_i, v_j) Sim(vi,vj),并将相似度存入 n × n n \times n n×n的相似度矩阵 M M M中。
  3. 计算句子的TextRank。初始化一个 n n n维的TextRank向量 R R R,迭代计算直至在误差范围内 M R = R MR=R MR=R
  4. 生成摘要。选择TextRank最高的几个句子,并按他们原来的顺序组合成为摘要。

Reference

  • https://www.cnblogs.com/rubinorth/p/5799848.html
  • https://www.cnblogs.com/chenbjin/p/4600538.html
  • https://www.cnblogs.com/Luv-GEM/p/10884493.html
  • https://blog.csdn.net/hhtnan/article/details/78032712
  • Barrios, Federico, et al. “Variations of the Similarity Function of TextRank for Automated Summarization.” Argentine Symposium on Artificial Intelligence (ASAI 2015) - JAIIO 44 (Rosario, 2015), 2016.

你可能感兴趣的:(机器学习,自然语言处理,算法)