任务概述
看作是一个段落到概括性总结的映射(Seq2Seq任务)
数据集采用suolyer/lcsts
dataset数据处理
1.过滤数据dataset.filter
books_dataset = chinese_dataset.filter(lambda x: len(x["output"]) > 4)
过滤掉输出小于4对应的行
2.对每一行文字进行分词dataset.map
tokenized_datasets = books_dataset.map(preprocess_function, batched=True)
其中preprocess_function是包含分词器的分词函数,处理原dataset数据类型的结果是为每一个文本增加新的key
导入分词器
from transformers import AutoTokenizer model_checkpoint = "google/mt5-small" tokenizer = AutoTokenizer.from_pretrained(model_checkpoint)
1.导入分词器,由于是序列到序列的任务,对于输入和标签的分词可以采用不同的分词器
2.每个任务的分词器的输出不一样,一般来说是将句子转化为ID、mask,对每个句子的处理结果将会是一个字典。
preprocess_function:
max_input_length = 512 #最大输入长度
max_target_length = 30 #摘要最长限制
def preprocess_function(examples):
model_inputs = tokenizer(
examples["input"], max_length=max_input_length, truncation=True
)
# 标签处理方法人家也提供了,考虑到翻译任务中两种语言不同,单独设立分词器
with tokenizer.as_target_tokenizer():
labels = tokenizer(
examples["output"], max_length=max_target_length, truncation=True
)
model_inputs["labels"] = labels["input_ids"]#为每一个文本新增加键值对
return model_inputs
处理完成的结果
评价函数
召回率=输出复现标签的词数/标签里的词数,判断能否复现标签
准确率=输出复现标签的词数/输出里的词数,防止输出过长,无用信息太多
缺陷是无法考虑序列特性,因此出现了rouge_2
还有rouge-S、rouge-L
自定义评价函数
from datasets import load_metric
rouge_score = load_metric("rouge",trust_remote_code=True)#自备梯子
模型训练完的后处理pipline
模型输出的结果只是输出每个词对应的概率,需要取TOP-K转化为字典里的词,pipline拿到输出结果就可以输出文本ID完成测试
一个段落放入model之后的输出
topk转化为概率之后通过分词器的解码器还原为文字