环境

  • python==3.7
  • transformers==4.9.2
  • rouge-score==0.0.4

数据准备

将数据放在一个txt中,每行为一条,文章正文跟label的摘要用\t分割

构建数据集

from datasets import Datasetclass Data:def __init__(self, data_path, tokenizer):self.path = data_pathself.max_input_length = 1024self.max_target_length = 150# self.tokenizer = AutoTokenizer.from_pretrained(pretrained_model_path)self.tokenizer = tokenizerdef preprocess(self, train_scale=0.8):with open(self.path,'r') as f:raw_data = f.readlines()print(f"=======data_len: {len(raw_data)}")start = int(len(raw_data)*train_scale)print(f"======train_len: {start}")raw_train_data = raw_data[:start]raw_test_data = raw_data[start:]raw_train_test_data = {'train':{'id':[],'document':[],'summary':[]}, \'test':{'id':[],'document':[],'summary':[]}}        for i,item in enumerate(raw_train_data):if len(item.split('\t')) != 3:continueurl,text,label = item.split('\t')raw_train_test_data['train']['id'].append(i)# document 是训练数据, summary是labelraw_train_test_data['train']['summary'].append(label.strip())raw_train_test_data['train']['document'].append(text.strip())for j,item in enumerate(raw_test_data):if len(item.split('\t')) != 3:continueurl,text,label = item.split('\t')raw_train_test_data['test']['id'].append(i+j+1)raw_train_test_data['test']['summary'].append(label.strip())raw_train_test_data['test']['document'].append(text.strip())def preprocess_function(examples):# document 是训练数据inputs = examples['document']model_inputs = self.tokenizer(inputs, max_length = self.max_input_length, padding = 'max_length', truncation=True)# summary是labelwith self.tokenizer.as_target_tokenizer():labels = self.tokenizer(examples['summary'], max_length = self.max_target_length, padding = 'max_length', truncation = True)model_inputs['labels'] = labels['input_ids']return model_inputstrain_dataset = Dataset.from_dict(raw_train_test_data['train'])test_dataset = Dataset.from_dict(raw_train_test_data['test'])tokenized_train_dataset = train_dataset.map(preprocess_function)tokenized_test_dataset = test_dataset.map(preprocess_function)return tokenized_train_dataset, tokenized_test_dataset

模型加载

from transformers import AutoModelForSeq2SeqLM, DataCollatorForSeq2Seq, Seq2SeqTrainingArguments, Seq2SeqTrainer
from transformers import BartForConditionalGenerationcheckpoint = "distilbart-xsum-9-6"
model = BartForConditionalGeneration.from_pretrained(checkpoint)
tokenizer = AutoTokenizer.from_pretrained(checkpoint)

Metrics

from rouge_score import rouge_scorer, scoringdef compute(predictions, references, rouge_types=None, use_agregator=True, use_stemmer=False):if rouge_types is None:rouge_types = ["rouge1", "rouge2", "rougeL", "rougeLsum"]scorer = rouge_scorer.RougeScorer(rouge_types=rouge_types, use_stemmer=use_stemmer)if use_agregator:aggregator = scoring.BootstrapAggregator()else:scores = []for ref, pred in zip(references, predictions):score = scorer.score(ref, pred)if use_agregator:aggregator.add_scores(score)else:scores.append(score)if use_agregator:result = aggregator.aggregate()else:result = {}for key in scores[0]:result[key] = list(score[key] for score in scores)return result#metrics
def compute_metrics(eval_pred):predictions, labels = eval_preddecoded_preds = tokenizer.batch_decode(predictions, skip_special_tokens=True)# Replace -100 in the labels as we can't decode them.labels = np.where(labels != -100, labels, tokenizer.pad_token_id)decoded_labels = tokenizer.batch_decode(labels, skip_special_tokens=True)# Rouge expects a newline after each sentencedecoded_preds = ["\n".join(nltk.sent_tokenize(pred.strip())) for pred in decoded_preds]decoded_labels = ["\n".join(nltk.sent_tokenize(label.strip())) for label in decoded_labels]result = compute(predictions=decoded_preds, references=decoded_labels, use_stemmer=True)# Extract a few resultsresult = {key: value.mid.fmeasure * 100 for key, value in result.items()}# Add mean generated lengthprediction_lens = [np.count_nonzero(pred != tokenizer.pad_token_id) for pred in predictions]result["gen_len"] = np.mean(prediction_lens)return {k: round(v, 4) for k, v in result.items()}

训练

超参配置

batch_size = 1
args = Seq2SeqTrainingArguments( \"/data/yuhengshi/europe_summary/model", \evaluation_strategy = 'steps', \learning_rate = 3e-5, \per_device_train_batch_size = batch_size, \per_device_eval_batch_size = batch_size, \weight_decay = 0.1, \save_steps = 200, \save_total_limit = 10, \num_train_epochs = 5, \predict_with_generate = True, \fp16 = True, \eval_steps = 200, \logging_dir="/data/yuhengshi/europe_summary/log", \logging_first_step=True)

transformers api训练

data_collator = DataCollatorForSeq2Seq(tokenizer, model = model, padding=True)
data = Data('/data/yuhengshi/europe_summary/data_no_daily_news.txt', tokenizer)
tokenized_train_dataset, tokenized_test_dataset = data.preprocess()
trainer =Seq2SeqTrainer( \model, \args, \train_dataset = tokenized_train_dataset, \eval_dataset = tokenized_test_dataset, \data_collator = data_collator, \tokenizer = tokenizer, \compute_metrics = compute_metrics)

结果

从下面step中选loss跟rouge都比较好的


预测 生成summary

def predict(sentence):inputs = tokenizer([sentence],max_length = 1024, return_tensors='pt')summary_ids = model.generate(inputs['input_ids'], num_beams=70, max_length=150,min_length=50,early_stopping=True)summary = [tokenizer.decode(g, skip_special_tokens=True, clean_up_tokenization_spaces=False) for g in summary_ids]return ' '.join(summary)

基于预训练模型Bart的英文文本摘要summary生成相关推荐

  1. 使用google的bert结合哈工大预训练模型进行中文/英文文本二分类,基于pytorch和transformer

    使用bert的哈工大预训练模型进行中文/英文文本二分类,基于pytorch和transformer 前提 简要介绍 开始 导入必要的包和环境 准备并读取数据 导入模型的tokenizer 对数据进行t ...

  2. 微软最新论文解读 | 基于预训练自然语言生成的文本摘要方法

    作者丨张浩宇 学校丨国防科技大学计算机学院 研究方向丨自然语言生成.知识图谱问答 本文解读的是一篇由国防科技大学与微软亚洲研究院共同完成的工作,文中提出一种基于预训练模型的自然语言生成方法. 摘要 在 ...

  3. 基于句子嵌入的无监督文本摘要(附代码实现)

    ©PaperWeekly· 作者|高开远 学校|上海交通大学 研究方向|自然语言处理 本文主要介绍的是一个对多种语言的邮件进行无监督摘要抽取的项目,非常详细.文本摘要也是非常有意思的 NLP 任务之一 ...

  4. 基于预训练模型的金融事件分析及应用

    每天给你送来NLP技术干货! 作者介绍 马永亮 ,澜舟科技搜索与金融 NLP 技术负责人.2009年硕士毕业于哈尔滨工业大学,先后在阿里巴巴和微软工作,主要从事搜索引擎.问答.翻译.NLP 相关的技术 ...

  5. 自然语言处理:基于预训练模型的方法(一)

    自然语言处理:基于预训练模型的方法 1.2 自然语言处理的难点 1.3 自然语言处理任务体系 1.2 自然语言处理的难点 1.2.1 抽象性 语言是由抽象符号构成的,每个符号背后都对应着现实世界或人们 ...

  6. 将预训练模型应用于长文本阅读理解

    摘要: 基于transformers预训练模型(如BERT.RoBERTa)的表现突出,预训练模型基本作为模型的baseline,但是由于self-attention的矩阵计算时间复杂度为,导致输入长 ...

  7. 基于预训练模型 ERNIE 实现语义匹配

    基于预训练模型 ERNIE 实现语义匹配 本案例介绍 NLP 最基本的任务类型之一 -- 文本语义匹配,并且基于 PaddleNLP 使用百度开源的预训练模型 ERNIE1.0 为基础训练效果优异的语 ...

  8. 基于预训练模型的军事领域命名实体识别研究

    摘要 [目的]为了解决开源非结构化军事领域数据的命名实体识别问题.[方法]本文提出基于预训练模型(Bidirectional Encoder Representations from Transfor ...

  9. CV之NS之VGG16:基于预训练模型VGG16训练COCO的train2014数据集实现训练《神奈川冲浪里》风格配置yml文件

    CV之NS之VGG16:基于预训练模型VGG16训练COCO的train2014数据集实现训练<神奈川冲浪里>风格配置yml文件 目录 一.训练 1.<神奈川冲浪里>风格 2. ...

最新文章

  1. PyTorch 1.3发布:能在移动端部署,支持Colab云TPU,阿里云上也能用
  2. tableau必知必会之如何在同一视图中进行相同分析维度图表的切换
  3. 操作系统核心原理-5.内存管理(中):分页内存管理
  4. 随想录(fatfs的学习)
  5. windows下编写dll
  6. java随机数Reandom(简单介绍)
  7. R语言安装包失败方案及DataExplorer包安装方法实践
  8. 电脑桌面双击计算机图标打不开,电脑双击图标打不开怎么办
  9. 计算机网络中的数据传输方式—同步传输和异步传输
  10. 未来人工智能发展面临的问题
  11. 安装vs无法连接网络
  12. 黑马python培训_要一张纯黑的图片。纯黑的。
  13. pytorch Tensor及其基本操作
  14. Linux红旗语言,如何改变红旗linux控制面板语言
  15. JVM虚拟机-----垃圾回收相关概念
  16. 校园表白墙微信小程序V1.0 SayLove -基于微信云开发-一键快速搭建,开箱即用
  17. 程序中数值的表示方法
  18. 虚拟ip+keeplalived+nginx 负载实现
  19. linux的一些细节记录
  20. 啦啦外卖至尊版拼团呀。

热门文章

  1. Windows在S模式下安装非应用商店软件(绕过S模式)
  2. python duplicated_Python pandas.DataFrame.duplicated函数方法的使用
  3. MapReduce 分布式缓存 map Side Join
  4. win7旗舰恢复出厂设置_手机恢复出厂设置后,会和新机一样吗?
  5. 利用微信内置浏览器Chrome漏洞实现远控
  6. 【强化学习笔记】4.3 无模型的强化学习方法-蒙特卡罗算法与重要性采样
  7. 怎么清理c盘空间?具体如何清理安全点
  8. 虚拟服务器cpu算法,一种灵活高效的虚拟CPU调度算法
  9. 【JavaScript】使用canvas根据人名生成随机头像
  10. DT浏览器最新版升级为办公类手机浏览器