资讯动态

基于Transformer的文本摘要生成实战:从Seq2Seq到预训练模型微调

发布时间:2026/10/20 2:26:51 来源:尧图企业网站定制
简介本资源为基于深度学习的文本摘要自动生成本科毕业设计项目面向自然语言处理方向的学生与开发者聚焦使用Transformer模型从长文本中提取关键信息并生成精炼摘要。项目涵盖文本预处理、词表构建、序列化输入、模型训练与性能评估等完整流程并引入ROUGE、BLEU等指标衡量摘要质量适合作为毕业设计实践或NLP入门进阶参考。资源包共34个文件以18个Python脚本为核心辅以5个Shell脚本、3个TXT说明、2个YML配置及词汇表、Dockerfile、LICENSE等压缩包约360KB结构清晰便于按模块查阅。已有3764人学习下载读者可借此掌握Transformer编码器-解码器架构在摘要任务中的实现方式理解分词、损失函数选择、优化器配置与评价指标计算并借助TensorFlow或PyTorch框架完成模型搭建与调试为后续科研或工程应用打下基础。1. 文本摘要生成到底难在哪从一份本科毕设源码说起很多做 NLP 方向的同学到了毕设选题这一步都会盯上「文本摘要自动生成」。原因很直接任务定义清晰输入一段长文本、输出一段短摘要看起来比机器翻译、对话系统好上手。但真正跑起来才发现这东西的坑比想象中多——抽取式方法做出来像关键词拼接生成式方法训到一半就开始复读ROUGE 分数死活上不去。我手上这份资源是一套基于深度学习的文本摘要生成完整实现技术栈覆盖 Transformer、Seq2Seq 以及预训练模型微调路线配套数据处理脚本、训练入口和推理 demo。它解决的核心问题是把「摘要生成」从论文公式落到能跑通的工程代码让你有一套可复现的 baseline而不是对着公式干瞪眼。适合正在做 NLP 方向毕设的本科生、想快速搭摘要原型的开发者以及需要一份干净代码底子做二次实验的人。2. 摘要生成的两条技术路线抽取式与生成式怎么选2.1 抽取式与生成式的本质差异抽取式摘要Extractive的思路是从原文里挑出若干重要句子按顺序拼成摘要。它的优点是语法几乎不会出错因为句子本来就是人写的缺点是冗余度高句子之间的衔接生硬遇到需要改写压缩的场景就力不从心。常见实现是 TextRank、BertSum 这类打分排序模型。生成式摘要Abstractive则是让模型自己「写」出摘要可以出现原文没有的词更接近人类做摘要的方式。代价是训练难度大容易出现事实性错误、重复生成、长文本遗忘。这份资源的主线是生成式用 Transformer 做骨干这也是当前学术界和工业界的主流选择。选哪条路线取决于你的目标。如果毕设要求稳定出结果、ROUGE 好看抽取式是保底方案如果想体现技术深度、做端到端生成那就走生成式但要接受调参周期长这个现实。2.2 为什么这份资源选 Transformer 而不是 RNN传统 Seq2Seq 用 LSTM/GRU 做编码器解码器问题是长距离依赖靠隐状态传递句子一长信息就衰减而且无法并行训练。Transformer 用自注意力机制Self-Attention直接建模任意两个位置的关系训练可以并行长文本建模能力更强。具体到摘要任务编码器负责读全文解码器逐词生成摘要。注意力机制让解码器在生成每个词时都能「回看」原文的相关部分这对摘要这种需要压缩和改写原文的任务至关重要。资源里用的是标准 Encoder-Decoder 结构多头注意力头数、隐藏层维度、层数这些参数都在配置文件里方便你按显存调整。2.3 预训练模型微调路线从零训练一个摘要模型数据量和算力要求都很高。更现实的做法是基于预训练模型微调比如用 BART、T5、Pegasus 这类已经在海量文本上预训练过的模型在摘要数据集上做 fine-tune。这份资源同时提供了从零训练和微调两条路径的代码你可以根据手头算力选择。微调路线的关键参数是学习率要小通常 1e-5 到 5e-5 量级否则预训练学到的语言知识会被冲掉。另外要注意预训练模型的 tokenizer 和你的数据预处理必须对齐不然会出现 token 错位这种玄学问题。3. 环境搭建与数据预处理把原始文本喂进模型3.1 依赖安装与目录结构先把环境跑起来。资源基于 Python 和 PyTorch建议用虚拟环境隔离依赖避免和系统里的包打架。# 创建虚拟环境 python -m venv venv source venv/bin/activate # Windows 用 venv\Scripts\activate # 安装核心依赖 pip install torch transformers datasets rouge-score nltk pip install numpy pandas tqdm tensorboard逻辑说明torch 是深度学习框架transformers 提供预训练模型和 tokenizerdatasets 负责数据加载rouge-score 用于评估。nltk 主要用来做句子切分。tensorboard 可选用来观察训练曲线。参数说明如果你有 GPU装 torch 时要去官网查对应 CUDA 版本的安装命令直接 pip install torch 可能装成 CPU 版训练会慢到怀疑人生。3.2 数据格式与清洗摘要数据集通常是成对的原文参考摘要。资源里数据以 JSON 或 CSV 存储每条样本包含 article 和 summary 两个字段。预处理阶段要做几件事去除 HTML 标签、统一空白字符、过滤过短或过长的样本。import re def clean_text(text): # 去掉 HTML 标签 text re.sub(r[^], , text) # 合并多余空白 text re.sub(r\s, , text).strip() return text def filter_sample(article, summary, min_len50, max_len1024): # 过滤过短或过长的样本避免极端值干扰训练 if len(article.split()) min_len: return False if len(article.split()) max_len: return False if len(summary.split()) 5: return False return True逻辑说明clean_text 处理原始文本里的噪声filter_sample 把明显不合格的样本剔除。参数 min_len 和 max_len 要根据你的数据集分布来定一般先统计一下长度分布再设阈值。3.3 分词与张量构造文本要转成模型能吃的 token id。用预训练模型自带的 tokenizer 最省事注意编码器和解码器的输入要分别处理。from transformers import BartTokenizer tokenizer BartTokenizer.from_pretrained(facebook/bart-base) def encode(article, summary, max_input1024, max_target128): inputs tokenizer( article, max_lengthmax_input, truncationTrue, paddingmax_length, return_tensorspt ) targets tokenizer( summary, max_lengthmax_target, truncationTrue, paddingmax_length, return_tensorspt ) # 把 padding 位置的标签设为 -100计算 loss 时忽略 labels targets[input_ids].clone() labels[labels tokenizer.pad_token_id] -100 inputs[labels] labels return inputs逻辑说明truncation 保证超长文本被截断padding 统一长度方便批处理。关键点是 labels 里把 padding 位置设成 -100这是 PyTorch CrossEntropyLoss 的约定忽略这些位置不计算损失否则模型会去学「预测 padding」这种无意义目标。参数说明max_input 决定原文最长保留多少 tokenmax_target 决定摘要最长多少 token。这两个值直接影响显存占用显存不够就往下调。4. 模型训练与推理从 loss 曲线到生成结果4.1 训练循环与关键超参训练部分用 HuggingFace 的 Trainer 或者自己写循环都行。自己写循环更透明方便你改细节。from torch.optim import AdamW from transformers import BartForConditionalGeneration model BartForConditionalGeneration.from_pretrained(facebook/bart-base) optimizer AdamW(model.parameters(), lr3e-5, weight_decay0.01) model.train() for epoch in range(num_epochs): for batch in train_loader: outputs model(**batch) loss outputs.loss loss.backward() # 梯度裁剪防止梯度爆炸 torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm1.0) optimizer.step() optimizer.zero_grad()逻辑说明AdamW 是带权重衰减的 Adamweight_decay 用来抑制过拟合。梯度裁剪是训练 Transformer 的常规操作max_norm1.0 是经验值能有效防止 loss 突然变 NaN。参数说明学习率 3e-5 是微调的常用起点从零训练可以设大一点到 1e-4。batch size 受显存限制显存小就用梯度累积模拟大 batch。4.2 生成阶段的解码策略推理时怎么从模型输出的概率分布里选词直接决定摘要质量。贪心解码每次选概率最高的词快但容易重复束搜索Beam Search保留多条候选路径质量更好但慢。model.eval() with torch.no_grad(): generated model.generate( input_idsinputs[input_ids], attention_maskinputs[attention_mask], max_length128, num_beams4, length_penalty2.0, no_repeat_ngram_size3, early_stoppingTrue ) summary tokenizer.decode(generated[0], skip_special_tokensTrue)逻辑说明num_beams4 表示束宽为 4候选路径越多结果越好但计算量翻倍。length_penalty 大于 1 会鼓励生成更长的摘要小于 1 则偏向短摘要。no_repeat_ngram_size3 禁止 3-gram 重复这是治「复读机」的直接手段。参数说明这几个参数没有万能值要拿验证集反复试。length_penalty 在 1.0 到 2.0 之间调no_repeat_ngram_size 设 2 到 4 比较常见。4.3 ROUGE 评估与结果解读摘要任务最常用的自动评估指标是 ROUGE它衡量生成摘要和参考摘要的 n-gram 重叠程度。from rouge_score import rouge_scorer scorer rouge_scorer.RougeScorer([rouge1, rouge2, rougeL], use_stemmerTrue) scores scorer.score(reference_summary, generated_summary) print(scores)逻辑说明ROUGE-1 看单词重叠ROUGE-2 看二元组重叠ROUGE-L 看最长公共子序列。use_stemmerTrue 会做词干化避免词形变化影响匹配。参数说明ROUGE 分数不是越高越好要结合人工看生成质量。有时候 ROUGE 高但摘要读起来不通顺这就是自动指标的局限。5. 避坑与常见问题排查5.1 生成结果全是重复词现象模型输出「的的的的」或者整句反复出现同一短语。原因解码策略没约束或者训练数据里本身有大量重复模式模型学到了这个坏习惯。解决加上 no_repeat_ngram_size 参数配合 repetition_penalty 一起用。如果训练阶段就出现检查数据清洗是否到位。5.2 Loss 不下降或变成 NaN现象训练几个 step 后 loss 突然变成 nan或者一直卡在高位不动。原因学习率太大、梯度爆炸、数据里有空样本或异常长样本。解决先降学习率到 1e-5 试加梯度裁剪检查数据里有没有空字符串或超长文本。混合精度训练有时也会引发 NaN可以先关掉 fp16 排查。5.3 显存不够跑不起来现象报 CUDA out of memory。原因batch size 太大、max_input 太长、模型参数量超出显存。解决减小 batch size用梯度累积保持等效 batch缩短 max_input换更小的预训练模型base 换 small开启 gradient checkpointing 用时间换显存。5.4 ROUGE 分数虚高但摘要没法看现象评估指标不错但生成的摘要事实错误、逻辑混乱。原因ROUGE 只看词重叠不判断语义正确性。模型可能抄了原文片段但拼错了意思。解决别只盯 ROUGE一定要人工抽检。可以加事实一致性检查或者用 BERTScore 这类语义层面的指标辅助。5.5 中文摘要效果明显差于英文现象同样的代码英文数据集跑得好换中文就崩。原因用的预训练模型是英文的中文 tokenizer 不匹配或者中文分词没处理好。解决换中文预训练模型比如基于中文语料训练的 BART 或 T5 变体。中文还要注意标点和分句别用英文的句子切分逻辑硬套。6. 进阶技巧让摘要质量再上一个台阶6.1 用预训练模型做冷启动如果你手头数据只有几千条从零训练基本没戏。这时候基于预训练模型微调是唯一现实路径。具体做法是加载预训练权重只在下游摘要数据上训几个 epoch学习率压到 1e-5 到 3e-5。我一般会先冻结编码器只训解码器等 loss 稳定了再解冻全量微调这样收敛更稳。6.2 数据增强的几种实用手段摘要数据标注成本高样本少是常态。可以用的增强手段包括回译把摘要翻译成另一种语言再翻回来、同义词替换、句子打乱后重新配对。回译效果最稳但需要翻译模型同义词替换简单但可能引入语义漂移要控制替换比例。6.3 解码参数调优的实操记录下面这张表是我在验证集上试出来的一组参考值不同数据集会有差异但能给你一个起点。参数推荐范围作用num_beams4~6束宽越大质量越好但越慢length_penalty1.0~2.0控制摘要长度倾向no_repeat_ngram_size2~4抑制重复repetition_penalty1.0~1.2降低重复词概率max_length100~150摘要最大长度调参顺序建议先固定其他参数调 num_beams找到质量和速度的平衡点再调 length_penalty 控制长度最后用 no_repeat_ngram_size 和 repetition_penalty 治重复。6.4 一个验证模型是否真的学会摘要的小技巧把原文里的关键实体人名、数字、地点替换成随机词看模型生成的摘要是否跟着变。如果模型真的在「读」原文摘要里的实体应该随之改变如果它只是背模板输出会几乎不变。这个测试能快速判断模型是学到了映射关系还是在偷懒。从那以后我每次训完摘要模型都会先跑一遍实体替换测试再去看 ROUGE避免被虚高的分数骗过去。希望这套资源和思路能帮你少走点弯路。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑