当前位置: 首页 > news >正文

基于 Python 的自然语言处理系列(44):Summarization(文本摘要)

        在这一部分中,我们将探讨如何使用 Transformer 模型将长文档压缩为摘要,这个任务被称为文本摘要。文本摘要是 NLP 领域中最具挑战性的任务之一,因为它需要理解长篇文本并生成连贯的总结,捕捉文档中的核心主题。然而,当文本摘要任务处理得当时,它能够极大地提高各种业务流程的效率,减轻专家阅读长篇文档的负担。

        虽然 Hugging Face Hub 上已经有许多用于文本摘要的预训练模型,但这些模型几乎都只适用于英文文档。因此,在本节中,我们将增加一些变化,训练一个可以处理英语和西班牙语的双语模型。

1. 加载数据

准备多语言语料库

        我们将使用多语言亚马逊评论语料库(Multilingual Amazon Reviews Corpus)来创建双语摘要模型。该语料库包含六种语言的亚马逊产品评论,通常用于多语言分类器的基准测试。由于每条评论都有一个简短的标题,我们可以将这些标题作为目标摘要,让模型从中学习!首先,让我们从 Hugging Face Hub 下载英语和西班牙语的子集:

import osos.environ['http_proxy']  = ''
os.environ['https_proxy'] = 'from datasets import load_datasetspanish_dataset = load_dataset("amazon_reviews_multi", "es")
english_dataset = load_dataset("amazon_reviews_multi", "en")
english_dataset

        每种语言的训练集有 20 万条评论,验证集和测试集各有 5,000 条评论。我们感兴趣的评论信息包含在 review_body(评论内容)和 review_title(评论标题)列中。让我们定义一个函数,从训练集中随机抽取几条样本,看看评论和标题的样子:

def show_samples(dataset, num_samples=3, seed=42):sample = dataset["train"].shuffle(seed=seed).select(range(num_samples))for example in sample:print(f"\n'>> Title: {example['review_title']}'")print(f"'>> Review: {example['review_body']}'")show_samples(english_dataset)

        这样我们就可以看到评论和标题的多样性,评论内容从积极到消极不等。训练一个能够处理所有 40 万条评论的模型需要耗费大量时间,因此我们决定专注于为单一产品领域生成摘要。

        我们将重点放在书籍评论领域,筛选出书籍(book)和电子书购买(digital_ebook_purchase)相关的评论:

def filter_books(example):return (example["product_category"] == "book"or example["product_category"] == "digital_ebook_purchase")spanish_books = spanish_dataset.filter(filter_books)
english_books = english_dataset.filter(filter_books)
show_samples(english_books)

        接着,我们将英语和西班牙语的评论合并为一个 DatasetDict 对象,并随机打乱数据,以确保模型不会只关注某一种语言:

from datasets import concatenate_datasets, DatasetDictbooks_dataset = DatasetDict()for split in english_books.keys():books_dataset[split] = concatenate_datasets([english_books[split], spanish_books[split]])books_dataset[split] = books_dataset[split].shuffle(seed=42)show_samples(books_dataset)

        在处理文本摘要任务时,短参考摘要可能会使模型输出极简的结果,因此我们通过过滤掉标题过短的样本,确保模型可以生成更有意义的摘要:

books_dataset = books_dataset.filter(lambda x: len(x["review_title"].split()) > 2)

2. 数据预处理

        文本摘要任务与机器翻译类似,我们需要将长文本“翻译”成一个更短的版本。大多数用于摘要任务的 Transformer 模型采用编码器-解码器架构,如 mT5,它是一种多语言 Transformer 模型。

        首先,我们加载与预训练模型 mt5-small 相关的 tokenizer,并测试它是否能够正确处理输入文本:

from transformers import AutoTokenizermodel_checkpoint = "google/mt5-small"
tokenizer = AutoTokenizer.from_pretrained(model_checkpoint)inputs = tokenizer("I loved reading the Hunger Games!")
inputs

        接下来,为了确保模型不会处理过长的输入和输出,我们在对评论和标题进行标记时,对它们进行截断:

max_input_length = 512
max_target_length = 30def preprocess_function(examples):model_inputs = tokenizer(examples["review_body"],max_length=max_input_length,truncation=True,)labels = tokenizer(examples["review_title"], max_length=max_target_length, truncation=True)model_inputs["labels"] = labels["input_ids"]return model_inputstokenized_datasets = books_dataset.map(preprocess_function, batched=True)

3. 文本摘要的评估指标

        文本摘要任务的常用评估指标是 ROUGE 分数。它衡量生成摘要和参考摘要之间的重叠程度。我们可以使用 evaluate 库中的 rouge_score 来计算这些分数:

import evaluaterouge_score = evaluate.load("rouge")scores = rouge_score.compute(predictions=["I absolutely loved reading the Hunger Games"],references=["I loved reading the Hunger Games"]
)
scores

4. 创建强大的基线模型

        一个常见的文本摘要基线是提取文章的前三个句子。我们可以使用 nltk 库来处理句子边界,创建一个简单的函数来提取前三个句子并计算 ROUGE 分数:

from nltk.tokenize import sent_tokenizedef three_sentence_summary(text):return "\n".join(sent_tokenize(text)[:3])def evaluate_baseline(dataset, metric):summaries = [three_sentence_summary(text) for text in dataset["review_body"]]return metric.compute(predictions=summaries, references=dataset["review_title"])score = evaluate_baseline(books_dataset["validation"], rouge_score)
score

5. 模型

        我们加载预训练的 mt5-small 模型,并使用 DataCollatorForSeq2Seq 来动态填充输入和标签。接下来,设置数据加载器和优化器,并将模型和数据加载器传递给 Accelerator.prepare() 进行训练:

from transformers import AutoModelForSeq2SeqLM, DataCollatorForSeq2Seq, AdamW, get_scheduler, Acceleratormodel = AutoModelForSeq2SeqLM.from_pretrained(model_checkpoint)
data_collator = DataCollatorForSeq2Seq(tokenizer, model=model)train_dataloader = DataLoader(tokenized_datasets["train"], shuffle=True, collate_fn=data_collator, batch_size=8
)optimizer = AdamW(model.parameters(), lr=2e-5)
lr_scheduler = get_scheduler("linear", optimizer=optimizer, num_warmup_steps=0, num_training_steps=len(train_dataloader) * 3
)accelerator = Accelerator()
model, optimizer, train_dataloader, eval_dataloader = accelerator.prepare(model, optimizer, train_dataloader, eval_dataloader
)

6. 训练

        我们实现训练循环,包括生成摘要、计算 ROUGE 分数和将结果上传到 Hugging Face Hub:

from tqdm.auto import tqdm
import numpy as npprogress_bar = tqdm(range(len(train_dataloader) * 3))for epoch in range(3):model.train()for step, batch in enumerate(train_dataloader):outputs = model(**batch)loss = outputs.lossaccelerator.backward(loss)optimizer.step()lr_scheduler.step()optimizer.zero_grad()progress_bar.update(1)model.eval()generated_tokens = []for step, batch in enumerate(eval_dataloader):with torch.no_grad():outputs = model.generate(batch["input_ids"], attention_mask=batch["attention_mask"])generated_tokens.append(outputs)rouge_score.add_batch(predictions=generated_tokens, references=batch["labels"])print(f"Epoch {epoch}:", rouge_score.compute())

7. 推理

        训练完成后,我们可以使用 pipeline 进行推理,生成书评的摘要:

from transformers import pipelinesummarizer = pipeline("summarization", model="Chaklam/test-summ-accelerate")def print_summary(idx):review = books_dataset["test"][idx]["review_body"]title = books_dataset["test"][idx]["review_title"]summary = summarizer(books_dataset["test"][idx]["review_body"])[0]["summary_text"]print(f"'>>> Review: {review}'")print(f"\n'>>> Title: {title}'")print(f"\n'>>> Summary: {summary}'")print_summary(100)

        这样,我们就可以生成模型的摘要,并与测试集中未见过的书评进行比较。

结语      

       在本篇博文中,我们介绍了如何通过使用 mT5 Transformer 模型来完成文本摘要任务。我们从多语言亚马逊评论语料库中提取了英文和西班牙文的书籍评论,并将其标题作为摘要任务的参考。接着,通过预处理、使用 mT5 模型进行训练,并利用 ROUGE 分数来评估生成摘要的质量,我们成功构建了一个双语文本摘要系统。
        在实践中,文本摘要能够帮助用户快速理解长文档的核心内容,而训练一个双语模型可以扩展其应用范围至多语言环境。随着训练的不断深入和数据集的多样性提升,该模型有望生成更加简洁和准确的摘要。这一流程不仅展示了 Transformer 模型在自然语言生成任务中的强大能力,也为其他多语言任务提供了借鉴和参考。

如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!

欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。

谢谢大家的支持!

相关文章:

基于 Python 的自然语言处理系列(44):Summarization(文本摘要)

在这一部分中,我们将探讨如何使用 Transformer 模型将长文档压缩为摘要,这个任务被称为文本摘要。文本摘要是 NLP 领域中最具挑战性的任务之一,因为它需要理解长篇文本并生成连贯的总结,捕捉文档中的核心主题。然而,当…...

RabbitMQ安装部署

安装Erlang 由于RabbitMQ是用Erlang语言编写的,所以在安装RabbitMQ之前需要安装Erlang 安装依赖 [rootpro-ex ~]yum install make gcc gcc-c build-essential openssl openssl-devel unixODBC unixODBC-devel kernel-devel m4 ncurses-devel设置Eralng的存储库 […...

智联招聘×Milvus:向量召回技术提升招聘匹配效率

01. 业务背景 在智联招聘平台,求职者和招聘者之间的高效匹配至关重要。招聘者可以发布职位寻找合适的人才,求职者则通过上传简历寻找合适的工作。在这种复杂的场景中,我们的核心目标是为双方提供精准的匹配结果。在搜索推荐场景下&#xff0c…...

unplugin-auto-import 库作用

unplugin-auto-import是一个 Vite、Webpack 和 Rollup 的插件。 一、自动导入模块 1. 减少手动导入 在 JavaScript 和 TypeScript 项目中,它可以自动检测并导入常用的模块和函数,无需手动在每个文件中进行导入操作。这大大减少了代码中的重复性导入语…...

【Multisim14.0正弦波>方波>三角波】2022-6-8

缘由有没有人会做啊Multisim14.0-其他-CSDN问答参考方波、三角波、正弦波信号产生 - 豆丁网...

vue3纯前端验证码示例

前言 验证码的用途:通过要求用户输入一串难以被机器自动识别的字符或图像,有效阻止恶意用户或脚本通过暴力破解方式尝试登录账户。验证码的分类:常见的验证码有短信、文本、图形等,安全度越高,依赖的插件或服务也越多…...

招聘程序员

全栈总监❤️golang❤️UI设计师 ☀️前端☀️Nodejs工☀️平面设计☀️PHP工 ☀️安卓❤️Flutter❤️运维☀️爬虫 公司福利: ☃️ 带薪年假、年终奖、13k-18k薪 🏩 内宿 2人/间或外宿可补助 💵 转正绩效 ✨节日礼金:生日礼金…...

Android 判断手机放置的方向

#1024程序员节|征文# 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 需求 老板:我有个手持终端,不能让他倒了,当他倒或者倾斜的时候要发出报警; 程序猿:我这..... 老板…...

Telegram机器人的手机部署

目的 一直有读 epub 电子书的习惯,摘录段落复制下来段落很难看,把自己写的排版器的逻辑复制下来,写成了一个排版机器人所有发给机器人的文字,都会经过排版,后转发到读书频道 前提 本来最好方法是直接把机器人架在服…...

ffmpeg视频滤镜: 色温- colortemperature

滤镜简述 colortemperature 官网链接 》 FFmpeg Filters Documentation 这个滤镜可以调节图片的色温,色温值越大显得越冷,可以参考一下下图: 咱们装修的时候可能会用到,比如选择灯还有地板的颜色的时候,选暖色调还是…...

Django+Vue全栈开发项目入门(二)

Vue是一款用于构建用户界面的JavaScript渐进式框架,它基于标准HTML、CSS和JavaScript构建,并提供了一套声明式的、响应式的、组件化的编程模型,有助于高效地开发用户界面。 环境准备 安装Node.js:Vue项目的构建和运行依赖于Node…...

【ubuntu改源】

ubuntu改源 备份原始源查看ubuntu发行版本arm64 noble版本的源vim修改源更新系统软件源 备份原始源 sudo cp /etc/apt/sources.list /etc/apt/sources.list.disabled查看ubuntu发行版本 lsb_release -aarm64 noble版本的源 清华源 vim修改源 esc :1,$d # 删除所有# 默认注…...

SQLI LABS | Less-9 GET-Blind-Time based-Single Quotes

关注这个靶场的其它相关笔记:SQLI LABS —— 靶场笔记合集-CSDN博客 0x01:过关流程 输入下面的链接进入靶场(如果你的地址和我不一样,按照你本地的环境来): http://localhost/sqli-labs/Less-9/ 靶场提示 …...

【小白学机器学习24】 用例子来比较:无偏估计和有偏估计

目录 1 关于无偏估计 1.1 无偏估计的定义 2 原始数据 2.1 假设我们是上帝,我们能创造一个总体/母体 population 2.2 按尽量随机取样的原则去取1个随机样本 sample1 3 一个关于无偏估计的理解 3.1 接着上面的总体和样本 sample1 3.2 左边的计算,期…...

C++在实际项目中的应用第二节:C++与网络编程

第五章:C在实际项目中的应用 第二节:C与网络编程 1. TCP/IP协议详解与C实现 TCP/IP(传输控制协议/互联网协议)是现代互联网通信的基础协议。理解 TCP/IP 协议对于开发网络应用至关重要。本节将详细介绍 TCP/IP 协议的工作原理以…...

依赖关系是危险的

依赖, 我们需要它们,但如何有效安全地使用它们?在本周的节目中,Kris 与 Ian 和 Johnny 一起讨论了 polyfill.io 供应链攻击、Go 中依赖管理和使用的历史,以及 Go 谚语“一点复制胜过一点依赖”。当然,我们用一些不受欢…...

ipguard与Ping32如何加密数据防止泄露?让企业信息更安全

在信息化时代,数据安全已成为企业运营的重中之重。数据泄露不仅会导致经济损失,还可能损害企业声誉。因此,选择合适的数据加密工具是保护企业敏感信息的关键。本文将对IPGuard与Ping32这两款加密软件进行探讨,了解它们如何有效加密…...

gitlab 的备份与回复

一、gitlab备份 1.确定备份目录 gitlab 默认的备份目录为/var/opt/gitlab/backups,可通过配置gitlab.rb配置文件进行修改,如: [rootlocalhost ~]# vim /etc/gitlab/gitlab.rb #若要修改备份文件的存储目录话,打开下面选项的注释…...

创建型模式-----建造者模式

目录 背景: 构建模式UML 代码示例 房子成品: 构建器抽象: 具体构建器: 建筑师: 测试部…...

威胁 Windows 和 Linux 系统的新型跨平台勒索软件:Cicada3301

近年来,网络犯罪世界出现了新的、日益复杂的威胁,能够影响广泛的目标。 这一领域最令人担忧的新功能之一是Cicada3301勒索软件,最近由几位网络安全专家进行了分析。他们有机会采访了这一危险威胁背后的勒索软件团伙的成员。 Cicada3301的崛…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)&#xff0…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...

21-Oracle 23 ai-Automatic SQL Plan Management(SPM)

小伙伴们,有没有迁移数据库完毕后或是突然某一天在同一个实例上同样的SQL, 性能不一样了、业务反馈卡顿、业务超时等各种匪夷所思的现状。 于是SPM定位开始,OCM考试中SPM必考。 其他的AWR、ASH、SQLHC、SQLT、SQL profile等换作下一个话题…...

Python爬虫(52)Scrapy-Redis分布式爬虫架构实战:IP代理池深度集成与跨地域数据采集

目录 一、引言:当爬虫遭遇"地域封锁"二、背景解析:分布式爬虫的两大技术挑战1. 传统Scrapy架构的局限性2. 地域限制的三种典型表现 三、架构设计:Scrapy-Redis 代理池的协同机制1. 分布式架构拓扑图2. 核心组件协同流程 四、技术实…...

多模态学习路线(2)——DL基础系列

目录 前言 一、归一化 1. Layer Normalization (LN) 2. Batch Normalization (BN) 3. Instance Normalization (IN) 4. Group Normalization (GN) 5. Root Mean Square Normalization(RMSNorm) 二、激活函数 1. Sigmoid激活函数(二分类&…...

compose 组件 ---无ui组件

在 Jetpack Compose 中,确实存在不直接参与 UI 渲染的组件,它们主要用于逻辑处理、状态管理或副作用控制。这些组件虽然没有视觉界面,但在架构中扮演重要角色。以下是常见的非 UI 组件及其用途: 1. 无 UI 的 Compose 组件分类 (…...