Gensim是Python的一个无监督主题模型与自然语言处理的开源库,它有许多高效易用的自然语言处理函数。其中有一个文本摘要函数summarize,可以从大量的文本中提取重要的信息。下面简要介绍一下Gensim中的summarize函数的算法。
文本摘要主要分为两种类型,抽取式(Extraction)和摘要式(Abstraction)。其中抽取式是从原文中抽取关键词语、句子或段落,再排列起来形成摘要;摘要式则是通过对原文进行语义分析,再使用自然语言生成技术生成摘要。抽取式摘要不需要大量语料进行训练,模型简洁高效。在抽取式摘要中,以句子为单位的抽取式摘要方法成为在内容的丰富性及语法的正确性上权衡之后获得很多很多模型青睐的算法,本文介绍的TextRank也是其中之一。
TextRank是基于图模型的一种抽取式摘要方法,TextRank不需要很深的语言学知识,也不需要特定领域或语言上的标签,具有很强的泛用性。这种特性使得TextRank在结构性强的文本中有不错的效果,比如新闻稿,会议记录等。TextRank的思路与搜索引擎中常用的PageRank相似,所以先简单介绍一下PageRank。
PageRank是一个计算网页的重要程度的算法。借鉴学术界通过论文间的引用来评判论文重要程度的思想,PageRank使用了网页之间的链接来判断网页的重要程度。PageRank有两个重要的假设:
网页之间的链接关系用一个图 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)=(1−d)+dvj∈In(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 1−d会随机跳转到任意页面。
有了公式以后就可以先给每个网页赋一个 P R PR PR的初值,再通过迭代的方法来计算了。
在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)=(1−d)+dvj∈In(vi)∑∑vk∈Out(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∣)∣{tk∣tk∈vi&tk∈vj}∣
然后通过迭代的方法计算出每个句子的 T R TR TR值,最后选取 T R TR TR值最高的几个句子组成摘要。
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={tmj∣m=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=1∑njIDF(tmj)f(tmj,vi)+k1⋅(1−b+b⋅avgDL∣vi∣)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(N−n(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的值会是一个负数,影响下一步的计算。
Reference