深度学习文本摘要生成毕设全攻略:从数据处理到模型微调
简介一套基于深度学习的文本摘要自动生成毕业设计实现聚焦Transformer模型在长文档摘要任务中的应用面向自然语言处理方向的本科毕业生帮助掌握从数据预处理到模型训练、评估的完整流程。资源包共34个文件以Python源码、Shell脚本、配置与说明文档为主另附Docker与CI测试相关配置包体仅360KB精简实用。已有3451人学习下载。内容覆盖分词、词汇表构建、序列化输入、损失函数与优化器配置等关键环节同时引入ROUGE、BLEU指标客观评估摘要质量并演示基于PyTorch或TensorFlow搭建训练环境从而获得从数据准备到指标评估的完整训练闭环。通过实际编码可加深对自注意力机制与编码器-解码器结构的理解同时掌握数据加载、批处理、测试评估与模型推理等工程实现适合希望快速搭建摘要生成实验并完成毕业设计的学生。 最近好几个学弟学妹来问我同一个问题“老师让我做文本摘要生成题目是‘基于深度学习的文本摘要自动生成自然语言处理’我连从哪下手都不知道怎么办”说实话这个题目在本科毕业设计里算是个“稳妥但不简单”的选择——方向明确技术栈通用写论文也好找创新点但难就难在它一眼看去是个完整系统既要处理数据又要搭模型还要训练、评估、出结果。很多同学卡在“不知道第一步该做什么”或者训练了几天发现loss根本不动。这篇文章就按我当年做这类NLP毕设的路径把整个项目从选题拆解、模型选型、数据处理、训练调参到答辩准备完整梳理一遍。适合正在做或者准备做文本摘要、自然语言处理方向毕设的同学参考哪怕你是从零开始照着这条路线也能把一个能跑、能讲、能写的毕设完整落地。1. 毕设选题到底在做什么把任务拆成能落地的块1.1 先搞清楚文本摘要到底解决什么问题文本摘要自动生成核心任务是一句话给一段长文本模型自动生成一段短文本这段短文本要保留原文的核心信息。比如输入一篇新闻报道输出一句话新闻标题输入一篇论文输出一段摘要。在自然语言处理里它属于文本生成任务和机器翻译、对话生成属于同一个技术家族所以研究它学到的技术可以迁移到很多其他任务上。这里有个关键分叉抽取式和生成式。抽取式是从原文里挑出重要句子拼成摘要生成式是模型自己“重新组织语言”写出摘要。本科毕设我强烈建议做生成式理由有两个一是生成式在原理上更复杂能讲的深度够从编码器解码器到注意力机制再到预训练模型每一层都能写出东西二是生成式效果上限高哪怕你只在某个领域数据上微调结果也远比“挑句子”看起来更有说服力。答辩的时候老师也更愿意追问生成式的技术细节。1.2 把一个毕设拆成五个可以直接安排的模块我辅导过的学生里最容易出问题的不是“不会写代码”而是“不知道整个项目该有哪些模块”。实际上这类毕设拆开就五块数据处理拿到原始语料清洗、切分、构造训练集/验证集/测试集。模型构建搭或者下载一个可训练的摘要生成模型。训练流程把数据喂进模型调整超参让它产出合理摘要。评估与测试用ROUGE等指标评估生成质量并做错误分析。实验对比与论文组织跑几个对比实验整理数据形成论文。把这五块放在一张进度表里时间分配大约是数据处理1周模型跑通2周训练调参2-3周评估和实验1周论文和答辩准备2周。只要你按这个节奏走基本不会出现最后一个月手忙脚乱的情况。1.3 这个题目的难点到底在哪我做这类课题最大的感受是文本摘要的难点不在“跑通代码”而在“怎么让模型真的输出像样的摘要”。第一个难点是语义压缩模型要从几百个词里挑出最有信息量的内容这比机器翻译更难因为翻译是词对词的映射摘要要做的是“删除、合并、改写”。第二个难点是流畅性很多模型能生成相关词但句子不通顺甚至出现重复词比如“今天天气很好很好很好”。第三个难点是评估摘要这种主观性很强的任务自动指标只能作为参考到底好不好还得人来看。本科毕设并不要求你解决所有难题但你要能在答辩时说出“难点在哪、我遇到了哪个、用什么方法缓解了”这就已经比其他同学高出一截了。2. 从数据到模型选型和环境准备2.1 数据集怎么选中文还是英文用哪个公开数据集数据集是毕设的地基。中文题目虽然听着亲切但中文公开摘要数据集比英文少而且处理起来要额外考虑分词和编码问题。英文最常用的摘要数据集是CNN/DailyMail它有新闻原文和人工摘要规模在30万篇左右非常适合训练和评估。如果你论文里想用中文可以用LCSTS哈尔滨工业大学发布的微博摘要数据集它是中文短文摘要规模大概240万对下载渠道在网上就能找到。我的建议是如果你没有特殊要求优先用英文CNN/DailyMail原因是Reference标准摘要可靠学术界可比性强别人的baseline数字可以直接拿来对比如果导师要求中文那就选LCSTS但要做好清洗工作。数据量上本科毕设不需要用全量数据CNN/DailyMail取5万到10万条训练就够了训练快、效果也不差。LCSTS取10万到20万条也比较合适。注意一个坑很多数据集原始文件是JSON或者分卷压缩包直接读会报内存错误。建议先写脚本统计样本数和文本长度分布再决定取多少数据不要上来就全量加载。这个习惯能帮你省很多时间。2.2 模型选型从Seq2Seq到BART/Pegasus本科生选哪条路文本摘要模型这几年变化很快但主线很清晰早期的Seq2Seq加注意力机制到后来的Transformer再到基于预训练模型的微调典型代表是BART、Pegasus和T5。对本科毕设来说我不建议你从头训练一个模型原因很现实计算资源不够训练时间长效果还未必比得上微调。最稳的路线是直接用Hugging Face的Transformers库加载一个预训练的BART或者Pegasus模型然后用你的数据集微调。BART在摘要任务上是经典方案它本质是一个去噪自编码器预训练时把文本打乱、删除、遮蔽再让模型恢复原样这使它特别擅长“压缩重组”信息。Pegasus则更进一步预训练时直接遮住句子让模型生成被遮住的句子这个设计和摘要任务高度一致。但如果你的毕设只做“加载别人模型微调”答辩会被问得很惨。我见过有学生答辩时老师直接问“你自己改了什么”所以建议你在框架里做至少一个小的自主改动比如在解码端加入关键词先验让模型生成摘要时强制包含原文里的几个关键词或者用对比学习增强编码器让模型区分“重要文本”和“次要文本”。这种小改动代码量不大但能在论文里形成“你自己的方法”。还有一个常见误区一上来就想自己用PyTorch搭一个Transformer来做摘要。我不是反对你搭而是建议先跑通现成模型再动手改代码。先有baseline再自研这是做深度学习项目的铁律。2.3 开发环境与依赖安装PyTorch Transformers GPU深度学习环境配置是很多人崩溃的地方。我当年装PyTorch就踩过版本不对的坑浪费了两天。这里直接给你一套我能跑通的组合组件推荐版本/配置Python3.9或3.10PyTorch2.0.1及以上Transformers4.30及以上CUDA11.7或12.1GPU显存6GB以上越大越好8GB起步舒服安装核心依赖就三行命令conda create -n summary python3.9 conda activate summary pip install torch transformers datasets rouge-score如果你用的是NVIDIA显卡先确认驱动版本再装对应CUDA的PyTorch。跑还是能跑就是要小batch size加梯度累积后面我会细说。如果连GPU都没有建议租云服务器按小时计费或者用一些免费算力平台比如百度飞桨AI Studio上面有免费的GPU时长做毕设足够用。上手步骤是先跑通Hugging Face官方示例里的摘要脚本再用自己的数据替换最后再改模型结构。这个顺序能保证你遇到的绝大多数问题都能在官方文档和GitHub Issue里找到答案。3. 实操过程数据预处理、训练到生成摘要3.1 数据清洗和预处理这套流程直接抄无论你选哪个数据集清洗的思路都一样。下面这段代码可以处理大部分中文或英文文本摘要数据核心工作是把原始文本变成模型能读的格式import json import re def clean_text(text): # 去掉HTML标签和多余空白 text re.sub(r[^], , text) text re.sub(r\s, , text).strip() return text def build_samples(raw_data, max_src_len512, max_tgt_len128): samples [] for item in raw_data: src clean_text(item[content]) tgt clean_text(item[title]) if len(src) 50 or len(tgt) 5: continue samples.append({source: src, target: tgt}) return samples几点说明过滤条件里len(src) 50是为了去掉过短的样本因为太短的文本谈不上“摘要”len(tgt) 5是去掉空摘要和无效摘要。max_src_len和max_tgt_len是模型输入输出的最大长度BART一般输入输出各512和128就够了LCSTS这种短文本甚至可以更小。这里一定要记住一个关键点处理中文时不要用jieba分词。BART、Pegasus这类模型用的是BPE或Unigram分词方式它自己会把句子切成子词你再切一遍反而是画蛇添足还可能让模型学不到完整词汇。我见过有同学用jieba分词后训练效果明显变差原因是词表对不上。如果你自己搭模型那另说但只要用预训练模型就老老实实用模型的Tokenizer。预处理完建议把数据存成JSONL格式每行一个样本后面加载方便。还要做一次训练集、验证集、测试集的划分比例建议8:1:1。3.2 训练参数配置和训练流程这些参数为什么这么设训练摘要模型的关键超参我直接给你一套经过验证的配置超参推荐值说明learning_rate3e-5 到 5e-5预训练模型微调用小学习率防止破坏原参数batch_size8显存小就4每批次样本数影响梯度稳定性epochs5 到 8多了会过拟合少了欠拟合warmup_ratio0.1前10%步数学习率线性上升帮助稳定训练weight_decay0.01轻微正则化防止过拟合grad_accum_steps2 到 4显存不够时用相当于加大batch sizemax_grad_norm1.0梯度裁剪防止loss爆炸为什么微调要用这么小的学习率因为预训练模型已经学到了大量语言知识学习率太大会把这些参数“冲坏”就像你在一幅已经画好的油画上又涂了一层太浓的颜料。训练流程基本是这样的每个epoch里数据分批送入模型计算loss反向传播更新参数验证集上算ROUGE保存效果最好的checkpoint。我的一个实用心得是不要只盯着loss曲线要同时看验证集上的ROUGE。loss降不代表摘要质量好它是生成目标函数和评估指标不是完全正相关。训练中如果发现验证集ROUGE连续3个epoch不涨就提前停止不要硬跑完所有epoch省时间也省GPU。3.3 摘要生成推理beam search、top-k和top-p怎么选训练好模型之后生成摘要的方式也很有讲究常用的有三种贪心搜索、Beam Search束搜索、采样。贪心搜索每一步只选概率最大的词容易生成平淡、重复的文本Beam Search是保留概率最高的前几个候选最后选整体分数最高的效果更稳采样方式top-k、top-p是加随机性适合对话场景对摘要任务不太合适。做摘要任务我推荐Beam Searchnum_beams4no_repeat_ngram_size3防止重复。生成的时候还要设置最小长度和最大长度比如max_length128, min_length30太短的摘要信息量不够。Hugging Face的pipeline(summarization)里可以直接传这些参数几行代码就能出结果from transformers import pipeline summarizer pipeline(summarization, modelyour_model_path) result summarizer(text, max_length128, min_length30, num_beams4, no_repeat_ngram_size3) print(result[0][summary_text])实际测试时你会发现一个问题生成结果和参考摘要用词可能完全不同但意思很接近。这是生成式摘要的正常现象也是为什么ROUGE分数不是唯一标准人工看一眼更重要。3.4 评估和指标ROUGE怎么算人怎么评评估是毕设里必须写的一章。文本摘要最常用的自动评估指标是ROUGE它衡量生成的摘要和参考摘要之间n-gram的重叠程度常用的是ROUGE-1、ROUGE-2和ROUGE-L。ROUGE-1看单词重合ROUGE-2看相邻两个词的重合ROUGE-L看最长公共子串。用rouge-score库直接算from rouge_score import rouge_scorer scorer rouge_scorer.RougeScorer([rouge1, rouge2, rougeL], use_stemmerTrue) score scorer.score(reference_summary, generated_summary) print(score)但这里要泼一盆冷水ROUGE分数高不代表摘要一定好。我见过一个模型把原文第一段复制过来当摘要ROUGE分数极高但完全不能读。所以论文里一定要有“人工评测”部分找同组同学或者室友让他盲打分从信息覆盖、语句流畅、是否冗余三个维度给1-5分。这个表格放到论文里比单薄的ROUGE数字有说服力得多。4. 常见问题与避坑实录4.1 训练过程中的拦路虎显存不足、loss不降、过拟合训练阶段最容易出问题的三个点显存不足最常见。解决办法从简单到复杂是减小batch size、开启梯度累积、使用混合精度训练。混合精度在PyTorch里就是一行torch.cuda.amp的事能省一半显存速度还更快。loss不降先检查数据有没有对齐确认输入和标签不是错位的。再看学习率如果loss在震荡而不是下降说明学习率太大调到1e-5试试。最后检查是不是标签里有太多无意义的填充符。过拟合验证集ROUGE先升后降就是过拟合的信号。加强数据增强、增大dropout、提前停止都可以缓解。这里有一个查错顺序的建议先用很小的数据量比如100条样本训练看模型能不能过拟合到接近1的准确率。如果不能说明代码有bug如果能再上全量数据。这个习惯能帮你把“代码问题”和“数据问题”分开省下一大把调参时间。4.2 生成摘要的质量问题重复词、摘要过短、OOV词怎么破生成质量方面的坑也很典型。重复词用no_repeat_ngram_size3基本能解决它禁止一个3-gram重复出现。摘要过短可能是min_length设置太小或者模型没学会生成长文本检查训练数据里的目标摘要长度如果普遍偏短模型自然输出短。OOV词词表外词在BART这类子词模型里基本不会出现因为任何词都能被拆成子词如果你自己搭词表模型就要准备一个unk策略。4.3 答辩时会被追问的问题现在就开始准备答案毕设答辩老师问的问题其实很集中你提前准备好就不会慌“你对比了哪些baseline”所以实验里不能只有你自己的模型还要有抽取式或者早期Seq2Seq模型做对比哪怕只是跑一个最简单的baseline。“你的创新点在哪”如果你只微调了BART这不算创新。我的建议是要么在数据上下功夫比如做了一个特定领域的清洗和标注要么在模型上做一个小改进比如加入关键词先验要么在训练策略上做对比比如不同解码方式对摘要质量的影响。不需要多高深但要有。“为什么选这个模型而不是其他模型”你要能把BART、Pegasus、T5的区别讲清楚。如果你不说老师会认为你只是套了个现成模型。4.4 进度管理的血泪教训最后说一点和代码无关的。毕设最怕的不是不会做而是做完了没有留下轨迹。训练完一个模型立刻记录三样东西模型配置、训练日志、生成结果样例。配置记录学习率、batch size、epoch这些超参日志包括loss和ROUGE变化曲线结果样例包括几个成功案例和几个失败案例。这些内容写论文的时候全都能直接变成表格和插图比事后回忆或者重新训练靠谱得多。我当年踩过一个坑实验跑了一周各种参数都试过但没记录每次的具体配置写论文时只能重跑。重跑一次要三天当时人都麻了。所有说自己“做完没时间写论文”的人多半不是时间不够是过程记录太少重写成本太高。按这套流程走下来你会发现自己不仅“做完了”一个毕设而且对这个领域有了完整的理解知道数据怎么处理、模型怎么工作、问题怎么排查、结果怎么评估。这些能力比答辩分数更值钱因为你以后无论做开发还是读研这套方法论都能复用。最后再分享一个个人习惯我会把训练好的模型导出到ONNX或者写个简单的网页demo给别人演示输入一段文字直接生成摘要。这个演示放在答辩PPT最后一页效果出奇地好。本文还有配套的精品资源点击获取