把长篇新闻压成两句话摘要:T5文本摘要微调实战
2026/9/14 9:22:38 网站建设 项目流程

把长篇新闻压成两句话摘要:T5文本摘要微调实战

【免费下载链接】Transformers-TutorialsThis repository contains demos I made with the Transformers library by HuggingFace.项目地址: https://gitcode.com/GitHub_Trending/tr/Transformers-Tutorials

你刚收到一份40页的行业报告,老板丢来一句:“10分钟内给我一页纸的要点”;或者你在做内容运营,每天几百条新闻,每条都要人工提炼一两句话。手动总结慢,更糟心的是每个人写出的摘要口径还不一致。

这类任务适合交给序列到序列模型:喂长文、吐短摘要,输出格式从第一条到最后一条都稳定。开源项目 Transformers-Tutorials 里就有现成的 T5 文本摘要微调示例,拿真实新闻语料走一遍从数据到推理的完整流程,链路不长,跑通之后换个语料就能用在你的长文业务上。

技术选型:为什么选T5做摘要?

T5 全称 Text-to-Text Transfer Transformer,它把所有 NLP 任务统一成“文本进、文本出”的形式,摘要不过是把长文压成短文,是原生的文本到文本映射,不需要额外设计结构。你可以把它想象成银行柜台:先叫号报业务——示例里用的是荷兰语 “Vat samen: ”(意为 Summarize: )——柜员才开始办理。

第二个优点是它的预训练语料里就包含摘要任务,标准英文模型对 “summarize: ” 这个前缀开箱即用,微调收敛速度比通用 seq2seq 模型快一截。

项目里的对应实现在 T5/Fine_tuning_Dutch_T5_base_on_CNN_Daily_Mail_for_summarization_(on_TPU_using_HuggingFace_Accelerate).ipynb.ipynb),它在 TPU 上用 HuggingFace Accelerate 微调社区荷兰语模型flax-community/t5-base-dutch,语料是 CNN/Daily Mail 的荷兰语翻译版。

从数据到输入:准备你的语料

依赖一行装完(GPU 用户可省掉 accelerate):

pip install transformers datasets accelerate sentencepiece

这四个库覆盖了加载、分词、训练全流程。

语料选 CNN/Daily Mail:30 多万篇新闻,每篇都配着编辑写好的 1~3 句要点摘要,是摘要任务里最经典的评测基准。示例用的是它的荷兰语翻译版,因为基座模型是荷兰语的;换成英文场景,用t5-base配同名英文数据集即可,字段完全一样。加载只需一行:

from datasets import load_dataset train_ds, val_ds, test_ds = load_dataset("ml6team/cnn_dailymail_nl", split=["train", "validation", "test"])

加载出来的数据只有两个字段加一个标识,三个划分直接可用:

划分行数articlehighlightsid
train287,113新闻原文编辑要点摘要唯一标识
validation13,368同上同上同上
test11,490同上同上同上

训练流水线:三步走

Step 1:分词并加前缀。模型不吃文本,吃的是input_idsattention_mask这类整数序列。预处理函数做三件事:给每篇原文拼上任务前缀、按 512 截断分词;摘要按 64 截断;再把 labels 里的 padding 位置标成 -100。

tokenizer = AutoTokenizer.from_pretrained("flax-community/t5-base-dutch") def preprocess(examples): x = tokenizer(["Vat samen: " + a for a in examples["article"]], max_length=512, truncation=True) y = tokenizer(examples["highlights"], max_length=64, truncation=True) x["labels"] = [[t if t else -100 for t in r] for r in y.input_ids] return x

为什么是 -100:该模型的 pad token id 是 0,不替换的话 pad 位置也会参与 loss 计算,验证损失会被系统性抬高。注意这里没有写padding="max_length"——TPU 训练需要定长 padding,GPU 用户可以改用动态 padding 省显存。

Step 2:组装模型与超参。T5ForConditionalGeneration.from_pretrained加载预训练权重,优化器选常规 AdamW,关键超参如下:

参数取值设置理由
学习率1e-4示例所用值,大语料微调的经验起点
批大小(单核)2×8 个 TPU 核,实际 16
patience3验证损失 3 轮不降就早停
num_epochs设得很大实际靠 patience 决定停止

Step 3:启动训练。把原生 PyTorch 训练函数交给notebook_launcher,Accelerate 会把模型和数据复制到 8 个 TPU 核上,循环体仍然是 forward → loss → backward → step 的常规写法,不用自己处理设备。

跑通推理:让模型开口说话

训练完,加载 checkpoint 调 generate 即可:

trained_model = T5ForConditionalGeneration.from_pretrained("./output_dir") input_ids = tokenizer(text, return_tensors="pt").input_ids out = trained_model.generate(input_ids, do_sample=True, max_length=50, temperature=0.7) print(tokenizer.decode(out.squeeze(), skip_special_tokens=True))

示例用的是采样生成(temperature 0.7),每次结果略有不同,多样性更高;如果追求稳定,更常用束搜索:num_beams=4让 4 个候选并行竞争、保留得分最高的一条,early_stopping=True则让所有候选生成完毕时就提前停止,省掉无意义的尾部 padding。

输入输出长什么样?拿训练集第一条样本对比:

输入原文(节选)参考摘要(语料 highlights)一句话点评
“Vat samen: (CNN) -- de bewering van de Amerikaanse minister van Buitenlandse Zaken John Kerry...”(数百 token 的荷兰语长文)“Anti-terrorisme beleid leeft op de rand van het internationale recht, Alex Vines schrijft...”(2~3 句荷兰语短句)输入数百 token、输出两三句,generate 得到的就是同形态短句

⚠️ 两个高频坑记一下:

  • 任务前缀不能漏:模型靠前缀判断“现在要做什么任务”,标准英文模型在预训练时见过 “summarize: ”,效果尤其明显,漏掉前缀输出质量会肉眼可见地下降。
  • labels 的 padding 位置要置 -100:不处理会让验证损失整体偏高,patience 早停跟着误判停点。

进阶方向与常见问题

链路跑通之后,提升效果的路径大多是参数层面的事:

  • 要英文摘要:换t5-base+ 英文cnn_dailymail数据集,前缀改成 “summarize: ”,其余流程不变。
  • 要更高质量:上T5-large,或者拿 BART / Pegasus 在同一份数据上对比 Rouge 分数。
  • 显存不够:引入 LoRA 这类参数高效方法,冻结主干大部分参数,只训练小适配器。
  • 要量化评估:在测试集上跑 Rouge(rouge1 / rouge2 / rougeL),其中 rougeL 高说明句序与参考摘要更贴近。

写在最后

整套流程就是:前缀 + 分词 → 监督微调 → generate。适用边界也很清楚:示例是荷兰语语料配荷兰语模型,产出必然是荷兰语;换成英文场景,把模型和语料一并替换,同一套流程就能得到一个英文文本摘要模型。如果你的文档普遍超过 512 个 token,先做分块或换更长上下文的模型,这一步值得在投入真实业务数据之前做掉。

【免费下载链接】Transformers-TutorialsThis repository contains demos I made with the Transformers library by HuggingFace.项目地址: https://gitcode.com/GitHub_Trending/tr/Transformers-Tutorials

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询