跟我一起学Python3.X之——TextRank算法为文本生成关键字和摘要

2024-02-21 18:32

本文主要是介绍跟我一起学Python3.X之——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最重要。可以得到下面的表:

结束\起始

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

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

结束\起始

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

M = [0 1 1 0 0 00 0 0];PR = [1; 1 ; 1];for iter = 1:100PR = 0.15 + 0.85*M*PR;disp(iter);disp(PR);
end

运行结果(省略部分):

 
  1. ......

  2.  
  3. 95

  4.  
  5. 0.4050

  6. 0.1500

  7. 0.1500

  8.  
  9. 96

  10.  
  11. 0.4050

  12. 0.1500

  13. 0.1500

  14.  
  15. 97

  16.  
  17. 0.4050

  18. 0.1500

  19. 0.1500

  20.  
  21. 98

  22.  
  23. 0.4050

  24. 0.1500

  25. 0.1500

  26.  
  27. 99

  28.  
  29. 0.4050

  30. 0.1500

  31. 0.1500

  32.  
  33. 100

  34.  
  35. 0.4050

  36. 0.1500

  37. 0.1500

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

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

M = [0 1 1 0.5 0 00.5 0 0];PR = [1; 1 ; 1];for iter = 1:100PR = 0.15 + 0.85*M*PR;disp(iter);disp(PR);
end

运行结果(省略部分):

 
  1. .....

  2.  
  3. 98

  4.  
  5. 1.4595

  6. 0.7703

  7. 0.7703

  8.  
  9. 99

  10.  
  11. 1.4595

  12. 0.7703

  13. 0.7703

  14.  
  15. 100

  16.  
  17. 1.4595

  18. 0.7703

  19. 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

下面是一个例子:

#-*- encoding:utf-8 -*-import codecs
from textrank4zh import TextRank4Keyword, TextRank4Sentencetext = 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)) # 重要性最高的三个句子

运行结果如下:

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

另外, jieba 分词提供的基于TextRank的关键词提取工具。 snownlp

也实现了关键词提取和摘要生成。

原文地址:https://blog.csdn.net/xiaocong1990/article/details/72614430

这篇关于跟我一起学Python3.X之——TextRank算法为文本生成关键字和摘要的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/732685

相关文章

MybatisGenerator文件生成不出对应文件的问题

《MybatisGenerator文件生成不出对应文件的问题》本文介绍了使用MybatisGenerator生成文件时遇到的问题及解决方法,主要步骤包括检查目标表是否存在、是否能连接到数据库、配置生成... 目录MyBATisGenerator 文件生成不出对应文件先在项目结构里引入“targetProje

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭

c# checked和unchecked关键字的使用

《c#checked和unchecked关键字的使用》C#中的checked关键字用于启用整数运算的溢出检查,可以捕获并抛出System.OverflowException异常,而unchecked... 目录在 C# 中,checked 关键字用于启用整数运算的溢出检查。默认情况下,C# 的整数运算不会自

Python使用qrcode库实现生成二维码的操作指南

《Python使用qrcode库实现生成二维码的操作指南》二维码是一种广泛使用的二维条码,因其高效的数据存储能力和易于扫描的特点,广泛应用于支付、身份验证、营销推广等领域,Pythonqrcode库是... 目录一、安装 python qrcode 库二、基本使用方法1. 生成简单二维码2. 生成带 Log

通过C#获取PDF中指定文本或所有文本的字体信息

《通过C#获取PDF中指定文本或所有文本的字体信息》在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响,然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文... 目录引言C# 获取PDF中指定文本的字体信息C# 获取PDF文档中用到的所有字体信息引言在设计和出

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南

《Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南》在日常数据处理工作中,我们经常需要将不同Excel文档中的数据整合到一个新的DataFrame中,以便进行进一步... 目录一、准备工作二、读取Excel文件三、数据叠加四、处理重复数据(可选)五、保存新DataFram

SpringBoot生成和操作PDF的代码详解

《SpringBoot生成和操作PDF的代码详解》本文主要介绍了在SpringBoot项目下,通过代码和操作步骤,详细的介绍了如何操作PDF,希望可以帮助到准备通过JAVA操作PDF的你,项目框架用的... 目录本文简介PDF文件简介代码实现PDF操作基于PDF模板生成,并下载完全基于代码生成,并保存合并P

Python3中Sanic中间件的使用

《Python3中Sanic中间件的使用》Sanic框架中的中间件是一种强大的工具,本文就来介绍Python3中Sanic中间件的使用,具有一定的参考价值,感兴趣的可以了解一下... 目录Sanic 中间件的工作流程中间件的使用1. 全局中间件2. 路由中间件3. 异常处理中间件4. 异步中间件5. 优先级

详解Java中如何使用JFreeChart生成甘特图

《详解Java中如何使用JFreeChart生成甘特图》甘特图是一种流行的项目管理工具,用于显示项目的进度和任务分配,在Java开发中,JFreeChart是一个强大的开源图表库,能够生成各种类型的图... 目录引言一、JFreeChart简介二、准备工作三、创建甘特图1. 定义数据集2. 创建甘特图3.