469_文本摘要生成¶
一句话说明¶
文本摘要是把长文章自动压缩成简短摘要的任务,分为抽取式(直接抽句子)和生成式(重新生成文字)两大类。
核心知识点¶
- 抽取式摘要:从原文中选取最重要的句子组合,忠实度高但灵活性低
- 生成式摘要:用Seq2Seq模型生成新句子,可改写,但可能"幻觉"(编造内容)
- 评估指标:ROUGE-1/2/L(召回率视角的n-gram重叠),BERTScore(语义相似度)
- 主流模型:BART、T5、Pegasus 是生成式摘要的三大骨干
- 控制摘要长度:通过beam search参数或特殊token控制
经典模型/方法¶
| 方法 | 类型 | 优点 | 缺点 |
|---|---|---|---|
| TextRank | 抽取式 | 无监督、快速 | 无法改写,不连贯 |
| BertSum | 抽取式 | 基于BERT句子表示 | 仍然是抽选 |
| BART | 生成式 | 去噪预训练,生成质量高 | 资源消耗大 |
| T5 | 生成式 | 统一文本到文本框架 | 需大量训练数据 |
| Pegasus | 生成式 | 专为摘要预训练(GSG任务) | 同上 |
代码示例¶
# 使用 HuggingFace Transformers 中的 BART 做生成式摘要
from transformers import BartTokenizer, BartForConditionalGeneration
# ---- 1. 加载 BART 摘要模型 ----
model_name = 'facebook/bart-large-cnn' # 在CNN/DailyMail上微调的摘要模型
tokenizer = BartTokenizer.from_pretrained(model_name)
model = BartForConditionalGeneration.from_pretrained(model_name)
# ---- 2. 准备输入文本 ----
article = """
The tower is 324 metres (1,063 ft) tall, about the same height as an 81-storey building,
and the tallest structure in Paris. Its base is square, measuring 125 metres (410 ft) on each side.
During its construction, the Eiffel Tower surpassed the Washington Monument to become the tallest
man-made structure in the world.
"""
# ---- 3. 分词编码 ----
inputs = tokenizer(
article,
max_length=1024, # BART最大输入长度
truncation=True,
return_tensors='pt'
)
# ---- 4. 生成摘要(beam search解码)----
summary_ids = model.generate(
inputs['input_ids'],
num_beams=4, # beam宽度,越大结果越好但越慢
max_length=150, # 摘要最大长度
min_length=30, # 摘要最小长度
length_penalty=2.0, # >1倾向生成更长摘要
early_stopping=True # 找到num_beams个完整句子后停止
)
# ---- 5. 解码输出 ----
summary = tokenizer.decode(
summary_ids[0],
skip_special_tokens=True # 去掉<s></s>等特殊token
)
print("摘要:", summary)
# ---- 6. TextRank 抽取式摘要(无监督基线)----
# pip install sumy
from sumy.parsers.plaintext import PlaintextParser
from sumy.nlp.tokenizers import Tokenizer
from sumy.summarizers.text_rank import TextRankSummarizer
parser = PlaintextParser.from_string(article, Tokenizer("english"))
summarizer = TextRankSummarizer()
# 抽取2个最重要的句子
sentences = summarizer(parser.document, 2)
for s in sentences:
print(str(s))
# ---- 7. ROUGE 评估 ----
# pip install rouge-score
from rouge_score import rouge_scorer
scorer = rouge_scorer.RougeScorer(['rouge1', 'rouge2', 'rougeL'], use_stemmer=True)
reference = "The Eiffel Tower is 324 metres tall and the tallest structure in Paris."
scores = scorer.score(reference, summary)
print(f"ROUGE-1 F1: {scores['rouge1'].fmeasure:.4f}")
print(f"ROUGE-L F1: {scores['rougeL'].fmeasure:.4f}")
面试常问点¶
- BART的预训练任务是什么?
去噪自编码器:对文本进行token掩码、删除、顺序打乱等破坏后重建
Pegasus的GSG任务是什么?
Gap Sentence Generation:随机掩盖整句话,让模型生成这些句子(天然摘要预训练)
如何缓解生成式摘要的幻觉问题?
忠实度约束损失、基于事实的后处理过滤、RLHF微调
ROUGE指标的局限性?
- 只看n-gram重叠,不能捕捉语义相似度,BERTScore是更好的补充
速查表¶
| 需求 | 方案 |
|---|---|
| 无监督快速抽取 | TextRank / LexRank |
| 英文新闻摘要 | BART-large-cnn |
| 多语言摘要 | mBART / mT5 |
| 中文摘要 | IDEA-CCNL/Randeng-BART-139M-SUMMARY |
| 超长文档 | LongFormer + 滑窗 |