使用 Python 和 NLTK 进行文本摘要

一、说明

        文本摘要是一种自然语言处理技术,允许用户将大量文本总结为小块,而不会丢失任何重要信息。本文介绍NLP中使用Gensim和Sumy实现文本摘要的步骤。

二、为什么要总结文本?

        互联网包含大量信息,而且每秒都在增加。文本摘要可以通过提供长文本的简单、非正式的摘要来提供帮助。除了摘要之外,它还可以让用户快速准确地识别段落或文章的基本内容。

        总结文本有很多正当理由,包括:

  1. 减少阅读时间
  2. 提高生产力
  3. 不错过重要事实
  4. 使文本轮廓更容易

        文本摘要有两种主要方法:提取式和抽象式。

2.1  抽取文本摘要

        此方法通过从原始文本中选择最常用的短语和句子来创建摘要。最重要的单词和句子以及与该主题相关的信息最多的单词和句子被优先考虑。

 使用提取摘要器的示例:

        长文本:Python 是一种高级、解释性、交互式、面向对象的脚本语言。对于初级程序员来说,Python 是一门很棒的语言。

        摘 要:Python 是一种高级的、解释性的、交互式的、面向对象的脚本语言。

2.2 抽象文本摘要

        抽象摘要方法涉及生成传达源文档含义的全新短语和句子。它利用算法和数学以更短的形式创建原始文本的表示。

让我们用一个简单的例子来理解抽象总结器:

        长文本:Python 是一种高级、解释性、交互式、面向对象的脚本语言。对于初级程序员来说,Python 是一门很棒的语言。

        摘要:Python 是一种高级脚本语言,对于初级程序员很有帮助。

        这两种技术都有各自的用途。对于第一个,人们可以通过从源中挑选最热门的单词来创建简短的摘要。另一方面,第二种方法可以通过添加自己的文字来完全改变摘要,从而使原始消息不会消失。让我们看看如何用 Python 构建这些!

三、构建一个提取文本摘要器

        NLTK(自然语言处理工具包)是一个 Python 库,提供了一组可用于构建文本摘要的工具。

        我们将使用Python 编程维基百科页面内容作为示例。让我们编写一个简单的函数来使用requestsBeautifulSoup从互联网页中抓取数据:

from bs4 import BeautifulSoup
import requestsdef scrape_con(url):res = requests.get(url)soup = BeautifulSoup(res.text,'html.parser') content = soup.findAll("p")data = ""for text in content:data +=text.textreturn datascrape_con('https://en.wikipedia.org/wiki/Python_(programming_language)')

文本摘要的第一步是清理文本。我们将执行一些基本的文本清理,例如将文本转换为小写、删除标点符号等。您可以从我之前关于心跳的文章中阅读有关文本清理的更多信息。

import re
def clean_data(data):text = re.sub(r"\[[0-9]*\]"," ",data)text = text.lower()text = re.sub(r'\s+'," ",text)text = re.sub(r","," ",text)return text
cleaned_data = clean_data(raw_data)

清理数据后,下一步将是创建单词和句子标记并计算每个标记的频率。

import nltk
nltk.download('punkt')
nltk.download('stopwords')
from nltk.tokenize import sent_tokenize,word_tokenizesent_tokens = sent_tokenize(cleaned_data)
word_tokens = word_tokenize(cleaned_data)
word_frequency = {}
stopwords =  set(stopwords.words("english"))for word in word_tokens:if word not in stopwords:if word not in word_frequency.keys():word_frequency[word]=1else:word_frequency[word] +=1
for word in word_frequency.keys():word_frequency[word] = (word_frequency[word]/maximum_frequency)

现在,我们将借助词典生成句子分数word_frequency

sentences_score = {}
for sentence in sent_tokens:for word in word_tokenize(sentence):if word in word_frequency.keys():if (len(sentence.split(" "))) <30:if sentence not in sentences_score.keys():sentences_score[sentence] = word_frequency[word]else:sentences_score[sentence] += word_frequency[word]

        最后,我们使用该heapq库提取前n个句子并将它们包含在最终摘要中。n是用户定义的数字,在下面的示例中我们将其设置为 3。

def get_key(val): for key, value in sentences_score.items(): if val == value: return key 
key = get_key(max(sentences_score.values()))
summary = heapq.nlargest(n,sentences_score,key=sentences_score.get)  ## n=3
print(" ".join(summary))
通过传递 n = 3,生成的提取摘要为:

python 的名字源自英国喜剧团体 monty python,Python 的创建者 Guido van rossum 在开发该语言时很喜欢这个团体。python 3.10 弃用了 wstr (将在 python 3.12 中删除;意味着届时需要修改 python 扩展)并向该语言添加模式匹配。

        还有其他库以更自动化的方式提供相同的解决方案。我们将在下面探讨它们。

隔离困难的数据样本?彗星可以做到这一点。通过我们的 PetCam 场景了解更多信息并发现彗星文物。

3.1.Gensim

        Gensim 是一个开源库,用于无监督主题建模、文档索引、相似性检索和其他自然语言处理功能,使用现代统计机器学习,如维基百科所述。

        Gensim 有一个summarize带有内置提取文本摘要器的类。让我们使用维基百科中的相同网页并使用gensim摘要器对其进行总结。

import gensim
import re
from gensim.summarization.summarizer import summarize
import requests
from bs4 import BeautifulSoupurl = 'https://en.wikipedia.org/wiki/Python_(programming_language)'res = requests.get(url)
soup = BeautifulSoup(res.text,'html.parser')extracted_rows_content = []
for i in range(len(soup.select('p'))):row_text = soup.select('p')[i].getText().strip()extracted_rows_content.append(row_text)
raw_data = " ".join(extracted_rows_content)import re
def clean_data(data):text = re.sub(r"\[[0-9]*\]"," ",data)text = text.lower()text = re.sub(r'\s+'," ",text)text = re.sub(r","," ",text)return text
cleaned_article_content = clean_data(raw_data)summary = summarize(cleaned_article_content, ratio = 0.01)
summary = re.sub('\[[^\]]*\]','',summary) 
print(summary)

        标准库的部分内容由规范涵盖 - 例如 Web 服务器网关接口 (wsgi) 实现 wsgiref 遵循 pep 333 - 但大多数是由其代码内部文档和测试套件指定的。

3.2. Sumy

        Sumy 是一个用于从 HTML 页面或纯文本中提取摘要的 Python 库。它使用多种算法来准备摘要。例如,我们正在使用 LexRank 算法,其主要思想是,如果一个句子与许多其他句子非常相似,那么它很可能是包含在摘要中的重要句子。

import sumy
from sumy.parsers.plaintext import PlaintextParser
from sumy.nlp.tokenizers import Tokenizer
from sumy.summarizers.lex_rank import LexRankSummarizerimport requests
from bs4 import BeautifulSoupurl = 'https://en.wikipedia.org/wiki/Python_(programming_language)'res = requests.get(url)
soup = BeautifulSoup(res.text,'html.parser')articles = []
for i in range(len(soup.select('p'))):article = soup.select('p')[i].getText().strip()articles.append(article)
raw_data = " ".join(articles)import re
def clean_data(data):text = re.sub(r"\[[0-9]*\]"," ",data)text = text.lower()text = re.sub(r'\s+'," ",text)text = re.sub(r","," ",text)return text
cleaned_article_content = clean_data(raw_data)# For Strings
parser = PlaintextParser.from_string(cleaned_article_content,Tokenizer("english"))summarizer = LexRankSummarizer()
#Summarize the document with 2 sentences
summary = summarizer(parser.document, 2)for sentence in summary:print(sentence)

        除了 LexRank 之外,Sumy 还有其他汇总方法,如Luhn、TextRank、SumBasic和LSA。潜在语义分析(LSA)是近年来最常用的方法。该方法能够识别文本中的同义词以及文档中未明确写入的主题。LsaSummarizer您可以通过从类导入来使用它sumy.summarizers.lsa

四、结论

        文本摘要可以通过简短的摘要表示主要事实来减少文章的阅读时间。提取和抽象方法都可以使用不同的方法来做到这一点。这完全取决于您的用例以及您需要哪种方法。当然,在某些情况下,提取摘要器无法在摘要中包含最上面的句子,而抽象摘要器会生成完全不同的摘要。最后,它们都只是需要一定程度的人类评估的算法。

五、推荐读物

1. Abstractive Text Summarization Using Python 
[Kaggle Notebook]
2. An approach to abstractive text summarization 
[IEEE Research Papaer]
3. Abstractive Text Summarization Using Sequence-to-Sequence RNNs and Beyond 
[cornell university (arxiv)]
4. Using Latent Semantic Analysis in Text Summarization and Summary Evaluation 
[By Josef Steinberger and Karel Ježek]5. 使用 Python 和 NLTK 进行文本摘要 |由 Abhay Parashar |心跳 (comet.ml)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/168466.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鼠标点击位置获取几何体对象_vtkAreaPicker_vtkInteractorStyleRubberBandPick

开发环境&#xff1a; Windows 11 家庭中文版Microsoft Visual Studio Community 2019VTK-9.3.0.rc0vtk-example参考代码 demo解决问题&#xff1a;框选或者点选某一区域&#xff0c;并获取区域prop3D对象&#xff08;红线内为有效区域&#xff0c;polydata组成的3d几何对象&a…

力扣刷题篇之排序算法

系列文章目录 前言 本系列是个人力扣刷题汇总&#xff0c;本文是排序算法。刷题顺序按照[力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 - 力扣&#xff08;LeetCode&#xff09; 这个之前写的左神的课程笔记里也有&#xff1a; 左程云算法与数据结构代码汇总之排序&am…

【前端】数据行点击选择

前言 【前篇文章】说了,我们公司的核心价值就是让人越来越懒,能怎么便捷就怎么便捷,主打一个简单实用又快捷,为了实现这个目标,我看成这个列表陷入了深思在想,要不要子表的数据加载在点击这个行时,就可以展示数据,这样就不用每次都要点那个小圆圈啦。 查资料 这显然…

2023.11.25-istio安全

目录 文章目录 目录本节实战1、安全概述2、证书签发流程1.签发证书2.身份认证 3、认证1.对等认证a.默认的宽容模式b.全局严格 mTLS 模式c.命名空间级别策略d.为每个工作负载启用双向 TLS 2.请求认证a.JWK 与 JWKS 概述b.配置 JWT 终端用户认证c.设置强制认证规则 关于我最后 本…

RevCol实战:使用RevCol实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

「Verilog学习笔记」数据串转并电路

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 关于什么是Valid/Ready握手机制&#xff1a; 深入 AXI4 总线&#xff08;一&#xff09;握手机制 - 知乎 时序图含有的信息较多&#xff0c;观察时序图需要注意&#xff1a…

Redis常用操作及应用(一)

一、五种数据结构 二、String结构 1、字符串常用操作 SET key value //存入字符串键值对 MSET key value [key value ...] //批量存储字符串键值对 SETNX key value //存入一个不存在的字符串键值对 GET key //获取一个字符串键值 MGET key [ke…

php获取当前域名方法

使用$_SERVER[HTTP_HOST]变量只获取到域名&#xff1a; $domain $_SERVER[HTTP_HOST]; echo $domain; 获取包含协议和域名的完整URL $protocol isset($_SERVER[HTTPS]) && $_SERVER[HTTPS] on ? https:// : http://; $domain $_SERVER[HTTP_HOST]; $current_url…

C++ 之win32多线程应用总结

InterlockedIncrement 函数的作用&#xff1a; 在多线程同时对一个变量访问时&#xff0c;保证一个线程访问变量时其他线程不能访问 事件是很常用的多线程同步互斥机制 HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes, // SECURITY_ATTRIBUTES结构指针&…

支持Arm CCA的TF-A威胁模型

目录 一、简介 二、评估目标 2.1 假定 2.2 数据流图 三、威胁分析 3.1 威胁评估 3.1.1 针对所有固件镜像的一般威胁 3.1.2 引导固件可以缓解的威胁 3.1.3 运行时EL3固件可缓解的威胁 一、简介 本文针对支持Arm Realm Management Extension (RME)、实现Arm Confidentia…

Spark SQL 时间格式处理

初始化Spark Sql package pbcp_2023.clear_dataimport org.apache.spark.SparkConf import org.apache.spark.sql.SparkSession import org.apache.spark.sql.functions.{current_date, current_timestamp}object twe_2 {def main(args: Array[String]): Unit {val con new …

认识Linux操作系统

什么是操作系统&#xff1f; 操作系统是一款软硬件资源管理的软件Linux是一款具体的操作系统的品类&#xff08;Linux内核是用C语言写的&#xff09;centos7是一款具体的Linux操作系统 为什么要有操作系统&#xff1f; Linux操作系统 Linux是一种自由和开放源代码的类UNIX操…

Linux时间命令—— 显示时间,日历等

目录 1.date显示时间 1.1 常用的标记列表&#xff1a; 1.2 设定时间&#xff1a; 2.cal显示日历 3.时间戳 1.date显示时间 date 用法&#xff1a;date [OPTION] ... [FORMAT] 1.1 常用的标记列表&#xff1a; %H : 小时 (00..23) %M : 分钟 (00..59) %S : 秒 (00..61…

基于Python的面向对象分类实例Ⅱ

接上一部分继续介绍~ 一、地类矢量转栅格 这一步是为了能让地类值和影像的对象落在同一区域&#xff0c;从而将影像中的分割对象同化为实际地物类别。 train_fn r".\train_data1.shp" train_ds ogr.Open(train_fn) lyr train_ds.GetLayer() driver gdal.GetDrive…

python之pyqt专栏3-QT Designer

从前面两篇文章python之pyqt专栏1-环境搭建与python之pyqt专栏2-项目文件解析&#xff0c;我们对QT Designer有基础的认识。 QT Designer用来创建UI界面&#xff0c;保存的文件是"xxx.ui"文件&#xff0c;"xxx.ui"可以被pyuic转换为"xxx.py",而&…

Spring AOP:什么是AOP? 为什么要用AOP?如何学习AOP?

文章目录 &#x1f386;前言1.为什么要用 AOP3.如何学习去 AOP?3.1 AOP 的组成切面&#xff08;Aspect&#xff09;连接点&#xff08;Join Point&#xff09;切点&#xff08;Pointcut&#xff09;通知&#xff08;Advice&#xff09; 3. Spring AOP 实现3.1 普通的方式实现 …

Ubuntu20.04安装搜狗输入法

1、安装包下载 搜狗输入法linux-首页搜狗输入法for linux—支持全拼、简拼、模糊音、云输入、皮肤、中英混输https://shurufa.sogou.com/linux点击立即下载&#xff0c;根据自己的硬件选择deb安装包。 2、输入法安装 当第一步完成以后&#xff0c;页面会自动跳转至搜狗的安装…

【opencv】计算机视觉:实时目标追踪

目录 前言 解析 深入探究 前言 目标追踪技术对于民生、社会的发展以及国家军事能力的壮大都具有重要的意义。它不仅仅可以应用到体育赛事当中目标的捕捉&#xff0c;还可以应用到交通上&#xff0c;比如实时监测车辆是否超速等&#xff01;对于国家的军事也具有一定的意义&a…

25 Linux I2C 驱动

一、I2C简介 I2C老朋友了&#xff0c;在单片机里面也学过&#xff0c;现在再复习一下。I2C使用两条线在主控制器和从机之间进行数据通信。一条是 SCL(串行时钟线)&#xff0c;另外一条是 SDA(串行数据线)&#xff0c;这两条数据线需要接上拉电阻&#xff0c;总线空闲的时候 SCL…

docker部署phpIPAM

0说明 IPAM&#xff1a;IP地址管理系统 IP地址管理(IPAM)是指的一种方法IP扫描&#xff0c;IP地址跟踪和管理与网络相关的信息的互联网协议地址空间和IPAM系统。 IPAM软件和IP的工具,管理员可以确保分配IP地址仍然是当前和足够的库存先进的IP工具和IPAM服务。 IPAM简化并自动化…