transformers文本摘要生成

文本摘要生成是自然语言处理(NLP)中的一个重要任务,目标是从原始文本中提取关键信息并形成一个简短且保留核心内容的摘要。以下是几种常见的文本摘要生成方法:

抽取式摘要:
抽取式方法从原文中直接挑选出重要的句子或片段组合成摘要,通常基于文本的重要性评分,如词频、句子位置、句间关联性等。

生成式摘要:
生成式方法使用深度学习模型,如Transformer、seq2seq模型(如带有注意力机制的LSTM)等,训练模型预测每个单词作为摘要一部分的概率,从而生成连贯的新颖摘要。

混合式摘要:
结合抽取和生成两种方式,先抽取重要部分,再根据上下文生成补充信息,以提高摘要的质量和准确性。

下面加单介绍使用transformers实现一个简单的文本摘要生成任务。

# 摘要生成任务 **ForSeq2SeqLM
from datasets import Dataset
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM, DataCollatorForSeq2Seq, Seq2SeqTrainer, Seq2SeqTrainingArguments
# 加载数据集
ds = Dataset.load_from_disk("/nlpcc_2017")
ds = ds.train_test_split(100, seed=1234)
print(ds)
# 数据预处理
tokenizer = AutoTokenizer.from_pretrained("../models/mengzi-t5-base")
# 定义数据处理函数
def process_func(exmaples):
    contents = ["摘要生成: \n" + e for e in exmaples["content"]]
    inputs = tokenizer(contents, max_length=384, truncation=True)
    labels = tokenizer(text_target=exmaples["title"], max_length=64, truncation=True)
    inputs["labels"] = labels["input_ids"]
    return inputs
# 数据处理
tokenized_ds = ds.map(process_func, batched=True)
tokenized_ds
# 创建模型
model = AutoModelForSeq2SeqLM.from_pretrained("../models/mengzi-t5-base")
# 创建评估函数 需要预先安装rouge-chinese模块
import numpy as np
from rouge_chinese import Rouge

rouge = Rouge()

def compute_metric(evalPred):
    predictions, labels = evalPred
    decode_preds = tokenizer.batch_decode(predictions, skip_special_tokens=True)
    labels = np.where(labels != -100, labels, tokenizer.pad_token_id)
    decode_labels = tokenizer.batch_decode(labels, skip_special_tokens=True)
    decode_preds = [" ".join(p) for p in decode_preds]
    decode_labels = [" ".join(l) for l in decode_labels]
    scores = rouge.get_scores(decode_preds, decode_labels, avg=True)
    return {
        "rouge-1": scores["rouge-1"]["f"],
        "rouge-2": scores["rouge-2"]["f"],
        "rouge-l": scores["rouge-l"]["f"],
    }
# 配置训练参数
args = Seq2SeqTrainingArguments(
    output_dir="./summary",
    per_device_train_batch_size=4,
    per_device_eval_batch_size=8,
    gradient_accumulation_steps=8,
    logging_steps=5,
    evaluation_strategy="epoch",
    save_strategy="epoch",
    metric_for_best_model="rouge-l",
    predict_with_generate=True
)

# 创建训练器
trainer = Seq2SeqTrainer(
    args=args,
    model=model,
    train_dataset=tokenized_ds["train"],
    eval_dataset=tokenized_ds["test"],
    compute_metrics=compute_metric,
    tokenizer=tokenizer,
    data_collator=DataCollatorForSeq2Seq(tokenizer=tokenizer)
)
# 模型训练
trainer.train()
# 模型推理
from transformers import pipeline
pipe = pipeline("text2text-generation", model=model, tokenizer=tokenizer)
pipe("摘要生成:\n" + ds["test"][-1]["content"], max_length=64, do_sample=True)
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灯下夜无眠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值