使用 Python 和 NLTK 进行文本摘要

news2024/12/25 9:33:29

一、说明

        文本摘要是一种自然语言处理技术,允许用户将大量文本总结为小块,而不会丢失任何重要信息。本文介绍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 requests

def scrape_con(url):
  res = requests.get(url)
  soup = BeautifulSoup(res.text,'html.parser') 
  content = soup.findAll("p")
  data = ""
  for text in content:
    data +=text.text
  return data

scrape_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_tokenize

sent_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]=1
        else:
            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 BeautifulSoup

url = '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 LexRankSummarizer

import requests
from bs4 import BeautifulSoup

url = '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.coloradmin.cn/o/1250201.html

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

相关文章

Java实现求最大值

1 问题 接收用户输入的3个整数&#xff0c;如何将最大值作为结果输出。 2 方法 采用“截图文字代码”的方式描述。 引入输入包调用main()函数&#xff0c;提示并接收用户输入的3个整数&#xff0c;并交由变量a b c来保存。对接收的3个数据进行比较&#xff0c;先比较a和b&#…

『许战海战略文库』打造技术品牌:企业的新成长引擎

引言&#xff1a;随着全球化和技术的快速发展,企业面临的竞争压力也越来越大。在这种环境下,仅仅拥有技术优势是不够的,如何将技术转化为品牌的核心竞争力&#xff0c;从而实现企业的长期和持续发展,成为许多企业面临的核心问题。 产业技术品牌不仅代表企业技术实力&#xff0c…

Vue项目实战之一----实现分类弹框效果

效果图 实现 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><script src"js/vue.js"></script><!-- 引入样式 --><link rel"stylesheet&qu…

p12 63.删除无头结点无头指针的循环链表中所有值为x的结点 桂林电子科技大学2015年 (c语言代码实现)注释详解

本题代码如下 void delete(linklist* L, int x) {lnode* p *L, * q *L;while (p->next ! q)// 从第一个结点开始遍历链表&#xff0c;直到尾结点的前一个结点{if (p->next->data x)//判断是否等于x{lnode* r p->next;//将r指向x的位置p->next r->next;…

热门话题解析:pytest测试用例顺序问题解决方案!

前言 上一篇文章我们讲了在pytest中测试用例的命名规则&#xff0c;那么在pytest中又是以怎样的顺序执行测试用例的呢&#xff1f; 在unittest框架中&#xff0c;默认按照ACSII码的顺序加载测试用例并执行&#xff0c;顺序为&#xff1a;09、AZ、a~z&#xff0c;测试目录、测…

Redis key的类型以及命令

系列文章目录 第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 第四章 Spring Cloud Netflix 之 Eureka 第五章 Spring Cloud Netflix 之 Ribbon 第六章 Spring Cloud 之 OpenFeign 第七章 Spring Cloud 之 GateWay 第八章 Sprin…

常见树种(贵州省):016杜鹃、含笑、桃金娘、金丝桃、珍珠花、观光木

摘要&#xff1a;本专栏树种介绍图片来源于PPBC中国植物图像库&#xff08;下附网址&#xff09;&#xff0c;本文整理仅做交流学习使用&#xff0c;同时便于查找&#xff0c;如有侵权请联系删除。 图片网址&#xff1a;PPBC中国植物图像库——最大的植物分类图片库 一、杜鹃 …

C语言——指针(二)

&#x1f4dd;前言 上篇文章C语言——指针&#xff08;一&#xff09;初步讲解了&#xff1a; 1&#xff0c;指针与指针变量 2&#xff0c;指针变量的基本使用&#xff08;如何定义&#xff0c;初始化&#xff0c;引用&#xff09; 这篇文章我们进一步探讨&#xff0c;使用指针…

【漏洞复现】金蝶云星空管理中心 ScpSupRegHandler接口存在任意文件上传漏洞 附POC

漏洞描述 金蝶云星空是一款云端企业资源管理(ERP)软件,为企业提供财务管理、供应链管理以及业务流程管理等一体化解决方案。金蝶云星空聚焦多组织,多利润中心的大中型企业,以 “开放、标准、社交”三大特性为数字经济时代的企业提供开放的 ERP 云平台。服务涵盖:财务、供…

原始类型 vs. 对象实践应用

● 首先是原始类型的例子 let lastName Williams; let oldLastName lastName; lastName Davis; console.log(lastName.oldLastName);● 然后是对象的例子 const jessica {firstName: Jessica,lastName: Williams,age: 27, }; const marriedJessica jessica; marriedJess…

docker部署phpIPAM

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

2023.11.25-istio安全

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

居家适老化设计第三十条---卫生间之坐便

以上产品图片均来源于淘宝 侵权联系删除 在居家适老化中&#xff0c;马桶是非常重要的设施之一&#xff0c;它能够提供方便、安全、舒适的上厕所体验。以下是一些居家适老化中常见的马桶设计和功能&#xff1a;1. 高度合适&#xff1a;为了方便老年人坐起和站起&#xff0c;马…

js逆向-JS加密破解

一、常见五种js加密手段 &#xff08;一&#xff09;加密位置&#xff1a; 1.Request Payload 加密 2.Request Headers 加密 3.Request URL params 参数加密 4.Response Data 数据加密 5.JS代码混淆加密 &#xff08;二&#xff09;加密算法 base64 编码 哈希算法&…

【从删库到跑路 | MySQL总结篇】数据库基础(增删改查的基本操作)

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】&#x1f388; 本专栏旨在分享学习MySQL的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 重点放前面&am…

常见树种(贵州省):017柳树、喜树、珙桐、木棉、楝、枫杨、竹柏、百日青、翅荚香槐、皂荚、灯台树

摘要&#xff1a;本专栏树种介绍图片来源于PPBC中国植物图像库&#xff08;下附网址&#xff09;&#xff0c;本文整理仅做交流学习使用&#xff0c;同时便于查找&#xff0c;如有侵权请联系删除。 图片网址&#xff1a;PPBC中国植物图像库——最大的植物分类图片库 一、柳树 …

Ubuntu服务器/工作站常见故障修复记录

日常写代码写方案文档&#xff0c;偶尔遇上服务器出现问题的时候&#xff0c;也需要充当一把运维工程师&#xff0c;此帖用来记录服务器报错的一些解决方案&#xff0c;仅供参考&#xff01; 文章目录 一、服务器简介二、机箱拆解三、基本操作3.1 F2进入BIOS3.2 F12进入Boot Me…

sql 动态语句

批量删除用的 foreach

剑指offer(C++)-JZ43:整数中1出现的次数(算法-其他)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 题目描述&#xff1a; 输入一个整数 n &#xff0c;求 1&#xff5e;n 这 n 个整数的十进制表示中 1 出现的次数 例如&#xff0…

Spring原理——基于xml配置文件创建IOC容器的过程

Spring框架的核心之一是IOC&#xff0c;那么我们是怎么创建出来的Bean呢&#xff1f; 作者进行了简单的总结&#xff0c;希望能对你有所帮助。 IOC的创建并不是通过new而是利用了java的反射机制&#xff0c;利用了newInstance方法进行的创建对象。 首先&#xff0c;我们先定义…