文本摘要 本节摘要:抽取式系统告诉你文档说了什么,生成式系统告诉你作者想说什么。是不同的任务,有不同的坑。一篇 2000 字的新闻塞进你的信息流,你要 120 字抓住它。要么从原文挑三句最重要的(抽取式),要么用自己的话重写(生成式)。两者都叫摘要,却是完全不同的问题。抽取式是排序问题:给每句打分,返回前 句,输出永远合语法(因为逐字照搬),风险是漏掉散布全文的内容。生成式是生成问题:Transformer 据输入产新文本,输出流畅且压缩,却可能幻觉出源里没有的事实,风险是自信地编造。本节两者都搭,连同各自独有的失败模式。 对应原课程:Phase 5 · Lesson 12 · (原英文 )。前置依赖:第 02 节(词袋与 TF-IDF)、第 11 节(机器翻译)。
本节摘要:抽取式系统告诉你文档说了什么,生成式系统告诉你作者想说什么。是不同的任务,有不同的坑。一篇 2000 字的新闻塞进你的信息流,你要 120 字抓住它。要么从原文挑三句最重要的(抽取式),要么用自己的话重写(生成式)。两者都叫摘要,却是完全不同的问题。抽取式是排序问题:给每句打分,返回前
k句,输出永远合语法(因为逐字照搬),风险是漏掉散布全文的内容。生成式是生成问题:Transformer 据输入产新文本,输出流畅且压缩,却可能幻觉出源里没有的事实,风险是自信地编造。本节两者都搭,连同各自独有的失败模式。
对应原课程:Phase 5 · Lesson 12 ·
text-summarization(原英文phases/05-nlp-foundations-to-advanced/12-text-summarization/docs/en.md)。前置依赖:第 02 节(词袋与 TF-IDF)、第 11 节(机器翻译)。
阅读完本节,你应当能够:
一篇 2000 字的新闻塞进你的信息流,你要 120 字抓住它。要么从原文挑三句最重要的(抽取式),要么用自己的话重写(生成式)。两者都叫摘要,却是完全不同的问题。
k。输出永远合语法,因为是逐字照搬;风险是漏掉散布全文的内容。抽取式:把文章当图,节点是句子、边是相似度,跑 PageRank(或类似)按「与全局的连通度」给句子打分,最高分句即摘要。经典实现是 TextRank(Mihalcea 与 Tarau, 2004)。
生成式:在文档-摘要对上微调 Transformer 编码器-解码器(BART、T5、Pegasus)。推理时模型读文档,经交叉注意力逐 token 生成摘要。Pegasus 尤为特别,用间隙句预训练目标,使其几乎不需多少微调就擅长摘要。
评估用 ROUGE(面向召回的要旨评估替身)。ROUGE-1 与 ROUGE-2 打一元、二元重叠,ROUGE-L 打最长公共子序列。越高越好,但 40 ROUGE-L「好」、50「出色」,每篇论文都报这三个,用 rouge-score 包。
import math import re from collections import Counter def sentence_split(text): return re.split(r"(?<=[.!?])\s+", text.strip()) def similarity(s1, s2): w1 = Counter(s1.lower().split()) w2 = Counter(s2.lower().split()) intersection = sum((w1 & w2).values()) denom = math.log(len(w1) + 1) + math.log(len(w2) + 1) if denom == 0: return 0.0 return intersection / denom def textrank(text, top_k=3, damping=0.85, iterations=50, epsilon=1e-4): sentences = sentence_split(text) n = len(sentences) if n <= top_k: return sentences sim = [[0.0] * n for _ in range(n)] for i in range(n): for j in range(n): if i != j: sim[i][j] = similarity(sentences[i], sentences[j]) scores = [1.0] * n for _ in range(iterations): new_scores = [1 - damping] * n for i in range(n): total_out = sum(sim[i]) or 1e-9 for j in range(n): if sim[i][j] > 0: new_scores[j] += damping * sim[i][j] / total_out * scores[i] if max(abs(s - ns) for s, ns in zip(scores, new_scores)) < epsilon: scores = new_scores break scores = new_scores ranked = sorted(range(n), key=lambda k: scores[k], reverse=True)[:top_k] ranked.sort() return [sentences[i] for i in ranked]
两点值得一说。相似度函数用的是对数归一化词重叠,即原版 TextRank 变体;TF-IDF 向量余弦也行。阻尼 0.85 和迭代数是 PageRank 默认。
from transformers import pipeline summarizer = pipeline("summarization", model="facebook/bart-large-cnn") article = """(long news article text)""" summary = summarizer(article, max_length=120, min_length=60, do_sample=False) print(summary[0]["summary_text"])
BART-large-CNN 在 CNN/DailyMail 语料上微调,开箱产出新闻风格摘要。其他领域(科学论文、对话、法律)用对应的 Pegasus 检查点或在目标数据上微调。
from rouge_score import rouge_scorer scorer = rouge_scorer.RougeScorer(["rouge1", "rouge2", "rougeL"], use_stemmer=True) scores = scorer.score(reference_summary, generated_summary) print({k: round(v.fmeasure, 3) for k, v in scores.items()})
永远开词干还原,否则 "running" 与 "run" 算两个词,ROUGE 少算。
ROUGE 二十年是摘要主导指标,但 2026 年单用它不够。大规模 NLG 论文元分析显示:
💡 生产建议:ROUGE-L 做遗留对比,BERTScore 做语义重叠,G-Eval 做连贯与事实,在 50~100 个人工标注摘要上校准。
生成式摘要易幻觉。抽取式风险低得多,因为输出逐字照搬源;不过若源句被去语境化、过时或乱序引用,仍可能误导。这是生产系统在合规相关内容上仍偏爱抽取式的最大原因。
要命名的幻觉类型:
可行的评估方法:
对任何事实要紧的面向用户内容(新闻、医学、法律、金融),抽取式是更安全的默认,生成式必须有事实性检查在环。
2026 年的栈:
| 用例 | 推荐 |
|---|---|
| 新闻,3~5 句摘要,英语 | facebook/bart-large-cnn |
| 科学论文 | google/pegasus-pubmed 或调过的 T5 |
| 多文档、长文 | 任何 32k+ 上下文的 LLM,提示 |
| 对话摘要 | philschmid/bart-large-cnn-samsum |
| 抽取式,构造上低幻觉风险 | TextRank 或 sumy 的 LSA / LexRank |
算力不受限时,长上下文 LLM 在 2026 常超越专用模型,代价是成本与可复现性——专用模型给出更一致的输出。
保存为 outputs/skill-summary-picker.md:
--- name: summary-picker description: Pick extractive or abstractive, named library, factuality check. version: 1.0.0 phase: 5 lesson: 12 tags: [nlp, summarization] --- Given a task (document type, compliance requirement, length, compute budget), output: 1. Approach. Extractive or abstractive. Explain in one sentence why. 2. Starting model / library. Name it. `sumy.TextRankSummarizer`, `facebook/bart-large-cnn`, `google/pegasus-pubmed`, or an LLM prompt. 3. Evaluation plan. ROUGE-1, ROUGE-2, ROUGE-L (use rouge-score with stemming). Plus factuality check if abstractive. 4. One failure mode to probe. Entity swap is the most common in abstractive news summarization; flag samples where source entities do not appear in summary. Refuse abstractive summarization for medical, legal, financial, or regulated content without a factuality gate. Flag input over the model's context window as needing chunked map-reduce summarization (not just truncation).
下一节,我们让模型回答问题——进入「问答系统」,看抽取式、生成式、RAG 三种范式如何取舍。