基于 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. 业务背景 在智联招聘平台,求职者和招聘者之间的高效匹配至关重要。招聘者可以发布职位寻找合适的人才,求职者则通过上传简历寻找合适的工作。在这种复杂的场景中,我们的核心目标是为双方提供精准的匹配结果。在搜索推荐场景下,…...
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的崛…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...
