使用TextRank算法为文本生成关键字和摘要

发表于1年前(2014-12-01 21:31)   阅读(10282) | 评论(27) 155人收藏此文章, 我要收藏
赞15
摘要 TextRank算法基于PageRank,用于为文本生成关键字和摘要。

pagerank textrank 自动摘要 关键词 提取

目录[-]

  • PageRank
  • 使用TextRank提取关键字
  • 使用TextRank提取关键短语
  • 使用TextRank提取摘要
  • 实现TextRank
TextRank算法基于PageRank,用于为文本生成关键字和摘要。其论文是:

Mihalcea R, Tarau P. TextRank: Bringing order into texts[C]. Association for Computational Linguistics, 2004.

先从PageRank讲起。

PageRank

PageRank最开始用来计算网页的重要性。整个www可以看作一张有向图图,节点是网页。如果网页A存在到网页B的链接,那么有一条从网页A指向网页B的有向边。

构造完图后,使用下面的公式:

S(Vi)是网页i的中重要性(PR值)。d是阻尼系数,一般设置为0.85。In(Vi)是存在指向网页i的链接的网页集合。Out(Vj)是网页j中的链接存在的链接指向的网页的集合。|Out(Vj)|是集合中元素的个数。

PageRank需要使用上面的公式多次迭代才能得到结果。初始时,可以设置每个网页的重要性为1。上面公式等号左边计算的结果是迭代后网页i的PR值,等号右边用到的PR值全是迭代前的。

举个例子:


上图表示了三张网页之间的链接关系,直觉上网页A最重要。可以得到下面的表:

   结束\起始 A B C
A 0 1 1
B 0 0 0
C 0 0 0

横栏代表其实的节点,纵栏代表结束的节点。若两个节点间有链接关系,对应的值为1。

根据公式,需要将每一竖栏归一化(每个元素/元素之和),归一化的结果是:

   结束\起始 A B C
A 0 1 1
B 0 0 0
C 0 0 0

上面的结果构成矩阵M。我们用matlab迭代100次看看最后每个网页的重要性:

?
1
2
3
4
5
6
7
8
9
10
11
M = [0 1 1
    0 0 0
    0 0 0];
PR = [1; 1 ; 1];
for iter = 1:100
    PR = 0.15 + 0.85*M*PR;
    disp(iter);
    disp(PR);
end

运行结果(省略部分):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
......
    95
    0.4050
    0.1500
    0.1500
    96
    0.4050
    0.1500
    0.1500
    97
    0.4050
    0.1500
    0.1500
    98
    0.4050
    0.1500
    0.1500
    99
    0.4050
    0.1500
    0.1500
   100
    0.4050
    0.1500
    0.1500

最终A的PR值为0.4050,B和C的PR值为0.1500。

如果把上面的有向边看作无向的(其实就是双向的),那么:

?
1
2
3
4
5
6
7
8
9
10
11
M = [0 1 1
    0.5 0 0
    0.5 0 0];
PR = [1; 1 ; 1];
for iter = 1:100
    PR = 0.15 + 0.85*M*PR;
    disp(iter);
    disp(PR);
end

运行结果(省略部分):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
.....
    98
    1.4595
    0.7703
    0.7703
    99
    1.4595
    0.7703
    0.7703
   100
    1.4595
    0.7703
    0.7703

依然能判断出A、B、C的重要性。

使用TextRank提取关键字

将原文本拆分为句子,在每个句子中过滤掉停用词(可选),并只保留指定词性的单词(可选)。由此可以得到句子的集合和单词的集合。

每个单词作为pagerank中的一个节点。设定窗口大小为k,假设一个句子依次由下面的单词组成:

w1, w2, w3, w4, w5, ..., wn

w1, w2, ..., wk、w2, w3, ...,wk+1、w3, w4, ...,wk+2等都是一个窗口。在一个窗口中的任两个单词对应的节点之间存在一个无向无权的边。

基于上面构成图,可以计算出每个单词节点的重要性。最重要的若干单词可以作为关键词。

使用TextRank提取关键短语

参照“使用TextRank提取关键词”提取出若干关键词。若原文本中存在若干个关键词相邻的情况,那么这些关键词可以构成一个关键短语。

例如,在一篇介绍“支持向量机”的文章中,可以找到三个关键词支持、向量、机,通过关键短语提取,可以得到支持向量机。

使用TextRank提取摘要

将每个句子看成图中的一个节点,若两个句子之间有相似性,认为对应的两个节点之间有一个无向有权边,权值是相似度。

通过pagerank算法计算得到的重要性最高的若干句子可以当作摘要。

论文中使用下面的公式计算两个句子Si和Sj的相似度:

分子是在两个句子中都出现的单词的数量。|Si|是句子i的单词数。

由于是有权图,PageRank公式略做修改:

实现TextRank

因为要用测试多种情况,所以自己实现了一个基于Python 2.7的TextRank针对中文文本的库TextRank4ZH。位于:

https://github.com/someus/TextRank4ZH

下面是一个例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#-*- encoding:utf-8 -*-
import codecs
from textrank4zh import TextRank4Keyword, TextRank4Sentence
text = codecs.open('./text/01.txt', 'r', 'utf-8').read()
tr4w = TextRank4Keyword(stop_words_file='./stopword.data' # 导入停止词
#使用词性过滤,文本小写,窗口为2
tr4w.train(text=text, speech_tag_filter=True, lower=True, window=2
print '关键词:'
# 20个关键词且每个的长度最小为1
print '/'.join(tr4w.get_keywords(20, word_min_len=1)) 
print '关键短语:'
# 20个关键词去构造短语,短语在原文本中出现次数最少为2
print '/'.join(tr4w.get_keyphrases(keywords_num=20, min_occur_num= 2)) 
     
tr4s = TextRank4Sentence(stop_words_file='./stopword.data')
# 使用词性过滤,文本小写,使用words_all_filters生成句子之间的相似性
tr4s.train(text=text, speech_tag_filter=True, lower=True, source = 'all_filters')
print '摘要:'
print '\n'.join(tr4s.get_key_sentences(num=3)) # 重要性最高的三个句子

运行结果如下:

?
1
2
3
4
5
6
7
8
关键词:
媒体/高圆圆/微/宾客/赵又廷/答谢/谢娜/现身/记者/新人/北京/博/展示/捧场/礼物/张杰/当晚/戴/酒店/外套
关键短语:
微博
摘要:
中新网北京12月1日电(记者 张曦) 30日晚,高圆圆和赵又廷在京举行答谢宴,诸多明星现身捧场,其中包括张杰(微博)、谢娜(微博)夫妇、何炅(微博)、蔡康永(微博)、徐克、张凯丽、黄轩(微博)等
高圆圆身穿粉色外套,看到大批记者在场露出娇羞神色,赵又廷则戴着鸭舌帽,十分淡定,两人快步走进电梯,未接受媒体采访
记者了解到,出席高圆圆、赵又廷答谢宴的宾客近百人,其中不少都是女方的高中同学

另外, jieba分词提供的基于TextRank的关键词提取工具。 snownlp也实现了关键词提取和摘要生成。

使用TextRank算法为文本生成关键字和摘要相关推荐

  1. python textrank_使用TextRank算法为文本生成关键字和摘要

    TextRank算法基于PageRank,用于为文本生成关键字和摘要.其论文是: Mihalcea R, Tarau P. TextRank: Bringing order into texts[C] ...

  2. 使用TextRank算法进行文本摘要提取(python代码)

    文本摘要是自然语言处理(NLP)的一种应用,随着人工智能的发展文本提取必将对我们的生活产生巨大的影响.随着网络的发展我们处在一个信息爆炸的时代,通读每天更新的海量文章/文档/书籍会占用我们大量的时间, ...

  3. 基于TextRank算法的文本摘要(附Python代码)

    基于TextRank算法的文本摘要(附Python代码): https://www.jiqizhixin.com/articles/2018-12-28-18

  4. 独家 | 基于TextRank算法的文本摘要(附Python代码)

    作者:Prateek Joshi 翻译:王威力 校对:丁楠雅 本文约3300字,建议阅读10分钟. 本文介绍TextRank算法及其在多篇单领域文本数据中抽取句子组成摘要中的应用. TextRank ...

  5. textrank算法提取文本摘要

    TextRank算法的基本思想是将文档看作一个词的网络(一种基于图的排序方法,用于提取相关句子或查找关键字),该网络中的链接表示词与词之间的语义关系. TextRank算法主要包括:关键词抽取.关键短 ...

  6. 【自然语言处理】TextRank算法

    TextRank算法 TextRank算法基于PageRank,用于为文本生成关键字和摘要.其论文是:  Mihalcea R, Tarau P. TextRank: Bringing order i ...

  7. TextRank算法学习及使用

    文章目录 一.算法思想 二.python代码实现 三.TextRank算法使用 1.textrank4zh模块的安装 2.实例介绍 总结 参考资料:    文本关键词抽取.文本摘要生成是自然语言处理( ...

  8. 文本生成图像工作简述3--技术难点、研究意义、应用领域和目前的局限性

    文本生成图像(text-to-image)指的是使用人工智能技术将文本转换为图像的过程,其可以根据给定文本生成符合描述的真实图像,其是多模态机器学习的任务之一,具有巨大的应用潜力,如视觉推理.图像编辑 ...

  9. 自动摘要生成(二):由PageRank转变而来的TextRank算法

    一.瞎扯 这是我2019年写的第一篇博客,开篇说点题外话,翻了一下博客的记录,上一遍新闻自动摘要生成(一)的博客还是去年7月写的,这大半年的时间里,忙着秋招,忙着找工作,忙着实习,忙着完成毕业设计,以 ...

最新文章

  1. How can I create an Asynchronous function in Javascript?
  2. Docker实战9 之Dockerfile深入实践
  3. 【Android 应用开发】多点触控 ( 多点触控事件 | PointerId | PointerIndex | 坐标获取 | 触摸点个数 )
  4. 第四次作业——黄渗茹
  5. linux下日志管理系统,Linux管理日志系统详解
  6. 26.python常用端口号
  7. php ajax session死锁,session过期,ajax请求处理
  8. Uber如何使用go语言创建高效的查询服务
  9. 深入Redis持久化 1
  10. jQuery LigerUI 初次发布一睹为快(提供Demo下载)
  11. php 写入.csv文件注意点
  12. 工业级交换机芯片选择的注意事项
  13. 高跟鞋,五角星与黄金分割比
  14. 日期转农历日期的一个插件
  15. #最短路径,最小生成树#CH 6202 黑暗城堡
  16. SELECT数据查询例题4——分组查询
  17. APP端测试常见的功能点
  18. ACP slave interface 学习
  19. Python数据分析之数据预处理(数据清洗、数据合并、数据重塑、数据转换)学习笔记
  20. 工作流(审批业务、流程)设计关键

热门文章

  1. c 语言如何处理表格文件中的数据库,C#程序从Excel表格中读取数据并进行处理
  2. 浅谈Linux服务器究竟设置多大交换分区合适
  3. client-go入门之1:创建连接Kubernetes集群的客户端
  4. 用计算机计算线性卷积的基本规则,实验三_线性卷积与圆周卷积的计算.doc
  5. java中char占的二进制,java数据类型与二进制详细介绍
  6. 1071 mysql_mysql 出现1071错误怎么办
  7. python调用gitlab api自动合并分支_Python3 如何使用 GitLab API 进行批量的合并分支
  8. java 定义类变量初始化吗_Java的变量有哪些类型?变量如何定义?如何初始化?请说明理由并举例_学小易找答案...
  9. 孙鑫VC++课程中用到的函数一览
  10. 理解 Kotlin 中的属性(property)