关于textrank的原理和使用,提取文章摘要

                         从Page_rank 到 text_rank的摘要提取

text-rank结果优化和完整的代码可见我的github 链接:https://github.com/ouprince/text-rank

1.关于page-rank

page_rank本为解决网页和网页之间的关系,计算网页重要性而提出的一种算法.PageRank算法计算每一个网页的PageRank值,然后根据这个值的大小对网页的重要性进行排序。它的思想是模拟一个悠闲的上网者,上网者首先随机选择一个网页打开,然后在这个网页上呆了几分钟后,跳转到该网页所指向的链接,这样无所事事、漫无目的地在网页上跳来跳去,PageRank就是估计这个悠闲的上网者分布在各个网页上的概率。

假设 A 网页有到B网页的连接,表示成 A --> B的一条有向边,如图:

A --->B ---->C---->A

因为不好制图,只能这样表示一下, 就是 A 网页有到 B 网页的出链, B 网页又有到 C 网页的出链,C网页有到A 网页的出链。

那么假设你正在 A 网页,那么如果你要点击,只能跳转到 B 网页,(假设A网页还有到C 网页的出链,那么有 1/2 的概率会到C网页,1/2 的概率到B 网页)表示成矩阵如下:A-->A = 0,A-->B = 1.0 ,A-->C = 0 (按假设就是 A -->A =0,A-->B = 0.5, A-->C =0.5),这就是矩阵的第一列,同样第二列第三列类似。M = 

设定网页A B C 的初始pr值为 1/N = 1/3 

即 U = [1/3  1/3 1/3] 的转置矩阵,分别表示 A B C 的初始 pr值,M的第一行代表 A , B,C 网页出链到 A 网页的概率,第二行代表 A,B,C 网页出链到 B 网页的概率,第三行代表 A,B,C网页出链到 C 网页的概率

进行迭代计算 U1 = MU = [1/3  1/3  1/3] 还是 A,B ,C 网页的pr值都是 1/3

然后继续 Un = M Un-1 ,直到收敛,可以看到,由于这个例子比较特殊,其实 U = [1/3  1/3  1/3]就是收敛值

因为这个例子 A B C网页组成了一个循环有向图,所以权重都是 1/3。

 

以上是page_rank的基本思想,接下来我们考虑一般化,假设 C网页仅仅存在到 自己本身的出链,那么可以证明,矩阵M=

可以证明迭代收敛于 U = [0  0  1] 也就是其他网页 A 和B 都会在迭代中pr值变成 0 ,这明显有点不合理,因为如果C 网页仅存在自身的出链的时候,没有人会傻到一直点击到 C网页的循环链接。因此对上面的迭代算法进行改进,引入了阻尼系数 alph,通常alph = 0.85 。

于是一般化公式变为: Un = α (M Un-1) + (1-α)U0,(U0 就是 [1/N,1/N....1/N]的初始pr值矩阵)

将阻尼系数引入后,上述收敛值为[0.05  0.0925   0.8575]

即不再是 [0  0  1]

 2.引入text-rank

 基于page-rank的思想,如果将网页权重的情景引入到文本句子,就产生了text-rank,我们可以把一篇文章分成好多个句子,每个句子类似于上面的网页,而网页跟网页之间的链接关系类比于句子与句子的相似性,也就是我们可以把 n 个句子想象成 n 个网页,A -->B 的概率等价于 句子 A 和 B 之间的相似度,进行page-rank算法,同样可以得到一个收敛值,这就是一个文章中句子的权重,我们只要挑出权重比较大的句子,就可以形成文章的一个摘要。

关于句子相似度怎么计算,可以用公式 Similarity =  共同词数 / (log(句子1长度) + log(句子2 长度))

但这种算法获得的准确度不如用词向量那么准确。可以先这么做,得到句子相似度后,可以先生成一个矩阵

graph = np.zeros((sentences_num, sentences_num))  # sentences_num 是文章句子数量

 for x in xrange(sentences_num):
        for y in xrange(x, sentences_num):
            similarity = sim_func( sentences[x], sentences[y] ) #计算句子相似度
            graph[x, y] = similarity
            graph[y, x] = similarity     #赋予句子节点间的链接关系

nx_graph = nx.from_numpy_matrix(graph)  # nx 就是 import networkx as nx

scores = nx.pagerank(nx_graph, alpha = 0.85) #调用networkx 里面的pagerank算法

sorted_scores = sorted(scores.items(), key = lambda item: item[1], reverse=True) #将计算结果按权重从大到小排序,取权重在前面的几个句子

备注:通过实际对比,这里的相似度算法在摘要提取上不如使用词向量算法那么好。另外在提取出权重比较大的几个句子时,最好按原文顺序重新排列生成摘要。

你可能感兴趣的:(github,NLP)