news 2026/6/1 16:07:47

别光用BERT了!试试Facebook的BART模型,文本填充和摘要生成实战(附Python代码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
别光用BERT了!试试Facebook的BART模型,文本填充和摘要生成实战(附Python代码)

别光用BERT了!BART模型在文本填充与摘要生成中的实战指南

如果你正在寻找一个既能处理文本理解又能胜任生成任务的预训练模型,BART绝对值得加入你的工具箱。作为Facebook AI团队推出的序列到序列模型,BART在文本填充、摘要生成等任务上展现出了惊人的灵活性。与BERT等纯编码器模型不同,BART结合了双向编码器和自回归解码器的优势,特别适合需要根据上下文生成连贯文本的场景。

1. 环境准备与模型加载

在开始之前,确保你的Python环境已经安装了最新版本的transformers库。如果你使用GPU加速,还需要安装对应版本的PyTorch或TensorFlow。

pip install transformers torch

加载BART模型和对应的分词器非常简单。Hugging Face提供了多个预训练好的BART变体,针对不同任务进行了优化:

from transformers import BartTokenizer, BartForConditionalGeneration # 加载文本摘要专用模型 model = BartForConditionalGeneration.from_pretrained('facebook/bart-large-cnn') tokenizer = BartTokenizer.from_pretrained('facebook/bart-large-cnn') # 或者加载基础版模型,适合多种生成任务 # model = BartForConditionalGeneration.from_pretrained('facebook/bart-large') # tokenizer = BartTokenizer.from_pretrained('facebook/bart-large')

提示:bart-large-cnn是专门为摘要任务微调的版本,而bart-large则更适合通用的文本生成任务。根据你的具体需求选择合适的模型。

2. 文本填充实战:让模型帮你补全句子

文本填充是BART的强项之一。想象这样一个场景:你正在开发一个写作辅助工具,需要根据不完整的句子自动补全内容。BART可以完美胜任这项工作。

2.1 基础文本填充

让我们从一个简单例子开始:

text = "人工智能正在改变<mask>的方式,未来十年将会看到更多突破。" inputs = tokenizer(text, return_tensors='pt') output_ids = model.generate(inputs['input_ids'], max_length=50) print(tokenizer.decode(output_ids[0], skip_special_tokens=True))

输出可能是:"人工智能正在改变我们工作和生活的方式,未来十年将会看到更多突破性进展,特别是在医疗和教育领域。"

2.2 高级参数调优

BART的生成过程可以通过多个参数控制:

  • max_length: 控制生成文本的最大长度
  • num_beams: 束搜索的大小,值越大结果越准确但计算量也越大
  • temperature: 控制生成的随机性
  • top_k/top_p: 用于采样策略的参数
output_ids = model.generate( inputs['input_ids'], max_length=100, num_beams=5, temperature=0.7, top_p=0.9, early_stopping=True )

注意:num_beams设置为3-5通常能在生成质量和计算效率之间取得良好平衡。对于实时性要求高的应用,可以适当降低这个值。

3. 自动摘要生成:从长文本中提取精华

BART在摘要任务上的表现尤其出色。bart-large-cnn版本就是在CNN/Daily Mail数据集上专门微调过的摘要模型。

3.1 基础摘要生成

article = """人工智能(AI)技术近年来取得了飞速发展。从语音助手到自动驾驶汽车,AI正在改变我们生活的方方面面。最新研究显示,到2025年,全球AI市场规模预计将达到1900亿美元。专家认为,AI将在医疗诊断、金融分析和教育个性化等领域产生深远影响。然而,也有人对AI带来的就业冲击和隐私问题表示担忧。""" inputs = tokenizer([article], max_length=1024, truncation=True, return_tensors='pt') summary_ids = model.generate( inputs['input_ids'], num_beams=4, max_length=100, early_stopping=True ) print(tokenizer.decode(summary_ids[0], skip_special_tokens=True))

可能的输出:"AI技术快速发展,预计2025年市场规模达1900亿美元,将在医疗、金融和教育领域产生深远影响,但也引发就业和隐私担忧。"

3.2 处理超长文本的策略

当遇到超过模型最大长度限制的长文档时,可以采用以下策略:

  1. 分段处理:将文档分成多个段落,分别生成摘要后再合并
  2. 关键句提取:先提取关键句子,再对这些句子进行摘要
  3. 层次化摘要:先为每个章节生成摘要,再对章节摘要进行二次摘要
def summarize_long_text(text, chunk_size=500): chunks = [text[i:i+chunk_size] for i in range(0, len(text), chunk_size)] summaries = [] for chunk in chunks: inputs = tokenizer([chunk], max_length=1024, truncation=True, return_tensors='pt') summary_ids = model.generate( inputs['input_ids'], num_beams=4, max_length=150, early_stopping=True ) summaries.append(tokenizer.decode(summary_ids[0], skip_special_tokens=True)) # 对分段摘要进行二次摘要 combined = " ".join(summaries) inputs = tokenizer([combined], max_length=1024, truncation=True, return_tensors='pt') final_ids = model.generate( inputs['input_ids'], num_beams=4, max_length=200, early_stopping=True ) return tokenizer.decode(final_ids[0], skip_special_tokens=True)

4. 模型微调:让BART适应你的特定领域

虽然预训练模型在很多任务上表现良好,但在特定领域数据上进行微调通常能获得更好的效果。下面是一个微调BART的示例流程。

4.1 准备训练数据

假设我们有一个文本填充任务的数据集,格式如下:

train_examples = [ {"input": "气候变化导致<mask>增加", "output": "气候变化导致极端天气事件增加"}, {"input": "深度学习在<mask>领域应用广泛", "output": "深度学习在计算机视觉领域应用广泛"} # 更多样本... ]

4.2 微调代码示例

from transformers import BartForConditionalGeneration, BartTokenizer, Trainer, TrainingArguments import torch # 加载模型和分词器 model = BartForConditionalGeneration.from_pretrained('facebook/bart-base') tokenizer = BartTokenizer.from_pretrained('facebook/bart-base') # 准备数据集 class TextFillingDataset(torch.utils.data.Dataset): def __init__(self, examples, tokenizer): self.examples = examples self.tokenizer = tokenizer def __len__(self): return len(self.examples) def __getitem__(self, idx): encodings = self.tokenizer( self.examples[idx]['input'], text_target=self.examples[idx]['output'], max_length=128, truncation=True, padding='max_length', return_tensors='pt' ) return { 'input_ids': encodings['input_ids'].squeeze(), 'attention_mask': encodings['attention_mask'].squeeze(), 'labels': encodings['labels'].squeeze() } train_dataset = TextFillingDataset(train_examples, tokenizer) # 设置训练参数 training_args = TrainingArguments( output_dir='./results', num_train_epochs=3, per_device_train_batch_size=8, save_steps=10_000, save_total_limit=2, logging_dir='./logs', logging_steps=500, learning_rate=5e-5, warmup_steps=500, weight_decay=0.01, ) # 创建Trainer实例 trainer = Trainer( model=model, args=training_args, train_dataset=train_dataset, ) # 开始训练 trainer.train()

4.3 微调后的推理

训练完成后,你可以像使用预训练模型一样使用微调后的模型:

# 加载微调后的模型 model = BartForConditionalGeneration.from_pretrained('./results/checkpoint-XXXXX') # 使用模型进行预测 input_text = "量子计算有望在<mask>领域带来突破" inputs = tokenizer(input_text, return_tensors='pt') output_ids = model.generate(inputs['input_ids'], max_length=50) print(tokenizer.decode(output_ids[0], skip_special_tokens=True))

5. 性能优化与部署建议

在实际应用中,我们还需要考虑模型的性能和部署问题。

5.1 模型量化加速

为了减少内存占用和提高推理速度,可以对模型进行量化:

from transformers import BartForConditionalGeneration # 加载并量化模型 model = BartForConditionalGeneration.from_pretrained( 'facebook/bart-large-cnn', torch_dtype=torch.float16 ).to('cuda')

5.2 ONNX运行时支持

将模型导出为ONNX格式可以提高跨平台兼容性:

from transformers.convert_graph_to_onnx import convert convert( framework="pt", model="facebook/bart-large-cnn", output="bart.onnx", opset=12, tokenizer=tokenizer )

5.3 缓存机制实现

对于重复的查询,实现简单的缓存可以显著提高响应速度:

from functools import lru_cache @lru_cache(maxsize=1000) def cached_generation(text, max_length=50, num_beams=4): inputs = tokenizer(text, return_tensors='pt') output_ids = model.generate( inputs['input_ids'], max_length=max_length, num_beams=num_beams ) return tokenizer.decode(output_ids[0], skip_special_tokens=True)

在实际项目中,我发现num_beams=4temperature=0.7的组合在大多数文本生成任务中都能取得不错的效果。对于摘要任务,适当增加max_length到150-200之间可以生成更全面的摘要,但同时也会增加不相关内容的可能性。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/29 10:28:31

02_Java基础语法入门

Java基础语法入门&#xff1a;变量、数据类型与运算符全掌握 文章目录Java基础语法入门&#xff1a;变量、数据类型与运算符全掌握前言一、注释——给代码加说明二、标识符与关键字2.1 标识符命名规则2.2 命名规范&#xff08;强烈建议遵守&#xff09;2.3 常用关键字三、变量与…

作者头像 李华
网站建设 2026/5/29 10:27:25

去中心化预测市场:用群体智慧与区块链技术重塑加密货币价格预测

1. 项目概述&#xff1a;为什么我们需要去中心化的加密货币价格预测&#xff1f;在加密货币市场里摸爬滚打几年&#xff0c;最深的体会就是&#xff1a;这地方太“刺激”了。一分钟前还风和日丽&#xff0c;下一秒可能就是惊涛骇浪。传统的股票市场好歹有财报、有监管、有相对透…

作者头像 李华
网站建设 2026/5/29 10:26:36

如何永久保存微信聊天记录?WeChatMsg本地数据管理终极方案

如何永久保存微信聊天记录&#xff1f;WeChatMsg本地数据管理终极方案 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/W…

作者头像 李华
网站建设 2026/5/29 10:23:00

概率思维:从认知偏差到理性决策的实践指南

1. 项目概述&#xff1a;一个关于概率认知的日常提醒 “The Noonification: You Could Be Wrong About Probability (8/20/2023)” 这个标题&#xff0c;乍一看像是一份新闻简报或每日推送的标题。它指向了一个非常具体且普遍存在的认知领域&#xff1a; 概率 。我们每天都在…

作者头像 李华
网站建设 2026/5/29 10:20:25

抖音无水印批量下载终极指南:三步构建你的个人素材库

抖音无水印批量下载终极指南&#xff1a;三步构建你的个人素材库 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback suppor…

作者头像 李华
网站建设 2026/5/29 10:20:06

MaxScore路由:MoE架构中的高效专家分配技术解析

1. MaxScore路由&#xff1a;MoE中的高效专家分配新方法解析在深度学习领域&#xff0c;混合专家&#xff08;Mixture-of-Experts, MoE&#xff09;架构已经成为扩展模型容量的重要手段。传统MoE通过稀疏激活机制动态分配输入到不同专家网络&#xff0c;但面临令牌丢弃和硬件效…

作者头像 李华