文本摘要生成是自然语言处理(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)