BERT的新闻标题生成
项目源码获取方式见文章末尾! 600多个深度学习项目资料,快来加入社群一起学习吧。
《------往期经典推荐------》
项目名称
1.【基于CNN-RNN的影像报告生成】
2.【卫星图像道路检测DeepLabV3Plus模型】
3.【GAN模型实现二次元头像生成】
4.【CNN模型实现mnist手写数字识别】
5.【fasterRCNN模型实现飞机类目标检测】
6.【CNN-LSTM住宅用电量预测】
7.【VGG16模型实现新冠肺炎图片多分类】
8.【AlexNet模型实现鸟类识别】
9.【DIN模型实现推荐算法】
10.【FiBiNET模型实现推荐算法】
11.【钢板表面缺陷检测基于HRNET模型】
…
1. 项目简介
本项目旨在开发一个基于BERT的新闻标题自动生成模型,以实现快速、准确的新闻标题生成功能。随着信息流量的不断增加,高效的标题生成对于新闻业和自媒体从业者而言极为重要,一个好的标题能够在简短的语言中抓住新闻的核心内容,吸引更多的读者关注。为实现这一目标,本项目引入了BERT(Bidirectional Encoder Representations from Transformers)模型,通过其双向编码能力获取文本的深层语义信息,使生成的标题不仅符合文章内容,还具有较高的吸引力和逻辑性。项目参考了深度学习自然语言处理领域的前沿技术,并结合了微博新闻摘要数据集,使用部分数据进行训练,以提升模型的训练效率和生成精度。该项目的成果不仅可以用于新闻标题生成,还能够扩展应用于文章摘要、关键词提取等场景,为新闻传媒、公务员考试中信息总结题等提供智能化的解决方案。
2.技术创新点摘要
本项目基于BERT模型,聚焦于新闻标题的生成任务,通过对BERT的结构和使用方式进行优化,实现了生成式文本摘要的创新应用。以下是该项目的主要技术创新点:
- 下三角掩码矩阵的使用:项目在标题生成过程中应用了下三角掩码矩阵,用于在多头自注意力机制中掩盖未来词的信息。这种方法源于生成模型的需求,有效地限制了注意力机制只关注历史信息,确保生成的文本符合自然语言生成的顺序性。
- 结合BERT预训练模型与微调机制:项目使用BERT的双向编码特性,通过引入额外的输出层,以新闻标题生成为特定任务进行微调。BERT模型的结构包含多层双向Transformer编码器,能够有效提取上下文信息,而项目在标题生成时仅使用了一部分数据进行训练,从而显著提高了生成效率。这种微调方法不仅保留了BERT的丰富语义理解能力,还将其有效地应用于生成任务中。
- 基于新闻领域的数据集与任务优化:该项目使用了由哈尔滨工业大学整理的新闻摘要数据集,包含超过200万条新闻摘要数据。数据集的丰富性为模型提供了充足的语料,同时也面向新闻标题生成任务进行了数据过滤,以确保模型关注新闻内容的核心信息。由于数据量庞大,项目仅使用了部分数据进行训练,提高了资源利用效率。
- 多层注意力权重计算的优化:在生成标题时,项目通过对输入句子中有效位置的注意力掩码进行处理,将注意力矩阵精确到单词级别,有效提高了标题生成的准确性和逻辑性。这一优化不仅提升了模型的计算效率,还显著增强了模型在标题生成任务上的表现。
3. 数据集与预处理
本项目使用的新闻标题生成数据集为哈尔滨工业大学整理的LCSTS(Large Scale Chinese Short Text Summarization)数据集,基于在微博发布的新闻摘要构建。该数据集包含约210万条新闻文本,每条数据包含一个约100字的新闻正文和一个约20字的摘要,适用于中文文本生成和自然语言理解等任务。数据集的规模和文本的简短性符合标题生成任务的需求,特别适用于基于深度学习的文本生成模型。
数据预处理流程
- 数据清洗:首先对原始数据进行清洗,去除文本中多余的特殊符号、HTML标签和冗余空格,以确保输入模型的数据具备较高的质量和一致性。
- 数据筛选与分割:由于数据量庞大,项目仅选择了一部分数据用于训练和验证,确保数据的多样性与代表性。同时,数据集划分为训练集、验证集和测试集,以评估模型的泛化能力。
- 分词与编码:由于BERT模型对输入有长度限制且采用基于词片的编码方式,因此项目对文本进行分词处理,并将分词结果转为词片级别的ID编码。同时,加入了[CLS]和[SEP]特殊标记,以适应BERT的输入格式,帮助模型更好地理解文本的结构与意义。
- 特征工程与掩码机制:为提升生成质量,项目通过下三角矩阵掩码确保标题生成过程中注意力集中在历史信息,避免对未来词产生依赖。注意力掩码作为输入特征的一部分,可以在训练时过滤出不相关的信息,从而有效提升模型的注意力计算效果。
- 归一化处理:对输入的长度和文本进行了标准化,填充短文本,使其达到固定长度。这种处理有助于模型的批量化训练和显存优化,避免因输入长度不一致带来的处理开销。
通过以上预处理步骤,项目构建了符合BERT模型输入格式的高质量数据集,为后续的模型训练和优化打下了坚实基础,有效提高了标题生成的准确性与一致性。
4. 模型架构
- 模型结构的逻辑: 本项目基于BERT(Bidirectional Encoder Representations from Transformers)预训练模型,构建了适用于新闻标题生成的特定结构。模型首先加载了预训练的BERT模型,并在此基础上进行了优化,以适应生成任务的需求。具体而言,模型利用了BERT的双向编码器结构,结合BERT内置的词嵌入层和自注意力机制,对输入文本的上下文信息进行编码。为了确保生成的标题顺序性,模型构建了一个下三角掩码矩阵,该矩阵在自注意力机制中屏蔽了未来的词语,从而确保在生成过程中仅参考已生成的词。模型使用
BertForTokenClassification
类来进行词级别的分类任务,从而在每个生成步输出一个词片,使标题逐步生成,直到满足设定的长度或结束标记。 - 模型的整体训练流程与评估指标: 在模型训练过程中,首先对输入文本和标题数据进行分词编码和长度标准化处理。然后将数据通过自定义的数据加载器送入模型,每个批次的输入包括内容的词片ID、类型ID和掩码。训练采用了交叉熵损失函数,对生成的标题词片和真实标题词片逐词进行对比,逐步优化模型的生成效果。模型的优化采用梯度下降法,通过反向传播更新参数。
- 在评估阶段,模型生成的标题将与真实标题进行比较,常用的评估指标包括BLEU和ROUGE分数,这些指标能有效衡量生成文本的准确性和覆盖度。其中,BLEU主要关注生成标题与真实标题的n元组相似度,ROUGE则衡量生成标题对真实标题的召回情况。综合这两项指标,模型能够获得对标题生成质量的多方面评价,帮助调优生成效果,使其更符合新闻标题生成的要求。
5. 核心代码详细讲解
- 数据预处理与特征工程
class TitleGenerateData(paddle.io.Dataset):"""构造数据集,继承paddle.io.Dataset"""def init(self, data, tokenizer, max_len=128, mode='train'):super(TitleGenerateData, self).
__init__
()
self.data_ = data
self.tokenizer = tokenizer
self.max_len = max_len
scale = 0.8 80%训练if mode == 'train':
self.data = self.data_[:int(scale * len(self.data_))]else:
self.data = self.data_[int(scale * len(self.data_)):]
class TitleGenerateData
:定义一个数据处理类,继承paddle.io.Dataset
,用于适应Paddle的深度学习数据读取。init
:初始化数据集,接收数据、分词器、最大长度和模式(训练或验证)。self.data_
和self.data
:对数据集进行划分,将80%的数据用于训练,20%用于验证。self.tokenizer
和self.max_len
:存储分词器和句子最大长度。
def getitem(self, idx):
item = self.data[idx]
content = item['content']
title = item['title']
token_content = self.tokenizer.encode(content)
token_title = self.tokenizer.encode(title)
getitem
:数据读取函数,对每个数据进行分词处理,获得输入内容和标题的词片ID。token_content
和token_title
:通过分词器将内容和标题编码为词片ID。
- 模型架构构建
class TitleBertModel(paddle.nn.Layer):"""基于BERT预训练模型的生成模型"""def init(self, pretrained_bert_model: str, input_length: int):super(TitleBertModel, self).
__init__
()
bert_model = BertModel.from_pretrained(pretrained_bert_model)
self.vocab_size, self.hidden_size = bert_model.embeddings.word_embeddings.parameters()[0].shape
self.bert_for_class = BertForTokenClassification(bert_model, self.vocab_size)
class TitleBertModel
:构建生成模型,基于BERT预训练模型,继承自paddle.nn.Layer
。bert_model = BertModel.from_pretrained
:加载预训练的BERT模型,并获取词汇表和隐藏层尺寸。self.bert_for_class
:基于BertForTokenClassification
类,用于词片分类,实现标题的逐词生成。
生成下三角矩阵,用来mask句子后边的信息
self.sequence_length = input_length
self.lower_triangle_mask = paddle.tril(paddle.tensor.full((input_length, input_length), 1, 'float32'))
self.lower_triangle_mask
:创建下三角掩码矩阵,保证生成标题时,模型只能关注已经生成的部分,避免未来词信息泄露。
def forward(self, token, token_type, input_mask, input_length=None):计算attention mask
mask_left = paddle.reshape(input_mask, input_mask.shape + [1])
mask_right = paddle.reshape(input_mask, [input_mask.shape[0], 1, input_mask.shape[1]])
attention_mask = paddle.matmul(mask_left, mask_right)
mask_left
和mask_right
:分别处理输入的有效位置,生成注意力掩码矩阵,确保模型仅关注特定位置。attention_mask
:通过矩阵乘法计算最终的注意力掩码。
- 训练与评估
定义损失函数class Cross_entropy_loss(Layer):def forward(self, pred_logits, label, label_pad_mask):
loss = paddle.nn.functional.cross_entropy(pred_logits, label, reduction='none')
loss = paddle.mean(loss * label_pad_mask)return loss
Cross_entropy_loss
:定义交叉熵损失函数,对模型预测和真实标签计算逐词损失。loss = paddle.mean(loss * label_pad_mask)
:使用标签掩码以忽略填充部分的损失,从而优化训练效率。
6. 模型优缺点评价
优点: 本项目基于BERT预训练模型,具备强大的双向语义理解能力,使得生成的标题能更好地抓住新闻文本的核心要点。同时,通过下三角掩码矩阵的使用,模型避免了未来词信息泄露,有效保证了生成文本的顺序性。此外,项目在数据预处理中应用了长度标准化和填充掩码策略,提升了模型的批量处理效率,使训练更加稳定。此外,通过交叉熵损失函数加权忽略填充值,模型优化更为高效,生成质量得到了较好的保障。
缺点: 由于BERT模型的参数量较大,本项目在训练过程中对硬件资源要求较高,并且由于数据规模的限制,模型对某些样本的生成质量可能欠佳。此外,BERT作为编码器在生成文本时存在局限性,它并非专为生成任务设计,可能在生成流畅性和一致性方面稍逊。模型还未引入丰富的数据增强方法,导致数据的多样性不足,可能影响模型在不同新闻风格上的适应性。
改进方向:
- 模型结构优化:可以将BERT与生成式模型(如GPT或T5)结合,利用BERT提取特征,结合生成式模型增强生成能力。
- 超参数调整:优化学习率、批次大小等超参数,并尝试不同的优化算法,以提升训练效果和生成质量。
- 数据增强:引入基于同义词替换、句子重排的增强方法,提升模型对多样化表达的适应性。
全部项目数据集、代码、教程点击下方名片