跳转至

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}")

面试常问点

  1. BART的预训练任务是什么?
  2. 去噪自编码器:对文本进行token掩码、删除、顺序打乱等破坏后重建

  3. Pegasus的GSG任务是什么?

  4. Gap Sentence Generation:随机掩盖整句话,让模型生成这些句子(天然摘要预训练)

  5. 如何缓解生成式摘要的幻觉问题?

  6. 忠实度约束损失、基于事实的后处理过滤、RLHF微调

  7. ROUGE指标的局限性?

  8. 只看n-gram重叠,不能捕捉语义相似度,BERTScore是更好的补充

速查表

需求方案
无监督快速抽取TextRank / LexRank
英文新闻摘要BART-large-cnn
多语言摘要mBART / mT5
中文摘要IDEA-CCNL/Randeng-BART-139M-SUMMARY
超长文档LongFormer + 滑窗