Phase 05 - Lesson 12
Sumarização de Texto
Sistemas extrativos dizem o que o documento disse. Sistemas abstrativos dizem o que o autor quis dizer. Tarefas diferentes, armadilhas diferentes.
Tipo: Build Linguagens: Python Pré-requisitos: Fase 5 · 02 (BoW + TF-IDF), Fase 5 · 11 (Tradução Automática) Tempo: ~75 minutos
O Problema
Um artigo de notícias de 2.000 palavras chega ao seu feed. Você precisa de 120 palavras que o resumam. Você pode escolher as três frases mais importantes do artigo (extrativo) ou reescrever o conteúdo com suas próprias palavras (abstrativo). Ambos são chamados de sumarização. São problemas completamente diferentes.
A sumarização extrativa é um problema de ranqueamento. Pontue cada frase, retorne as k melhores. A saída é sempre gramatical porque é copiada literalmente. O risco é perder conteúdo que está distribuído ao longo do artigo.
A sumarização abstrativa é um problema de geração. Um transformer produz texto novo condicionado à entrada. A saída é fluente e compressiva, mas pode alucinar fatos que não estavam na fonte. O risco é a fabricação confiante.
Esta lição constrói os dois, com o modo de falha que cada um carrega.
O Conceito
Extrativo. Trate o artigo como um grafo onde os nós são frases e as arestas são similaridades. Execute o PageRank (ou algo parecido) sobre o grafo para pontuar as frases pelo quão conectadas estão a todo o resto. As frases com maior pontuação formam o resumo. A implementação canônica é o TextRank (Mihalcea e Tarau, 2004).
Abstrativo. Faça fine-tuning de um transformer encoder-decoder (BART, T5, Pegasus) em pares documento-resumo. Na inferência, o modelo lê o documento e gera o resumo token a token via cross-attention. O Pegasus em particular usa um objetivo de pré-treinamento de gap-sentence que o torna excelente em sumarização sem muito fine-tuning.
Avaliação com ROUGE (Recall-Oriented Understudy for Gisting Evaluation). ROUGE-1 e ROUGE-2 pontuam a sobreposição de unigramas e bigramas. ROUGE-L pontua a maior subsequência comum. Maior é melhor, mas 40 de ROUGE-L é "bom" e 50 é "excepcional". Todo paper reporta os três. Use o pacote rouge-score.
Construa
Passo 1: TextRank (extrativo)
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]
Duas coisas que vale a pena nomear. A função de similaridade usa sobreposição de palavras normalizada por logaritmo, que é a variante original do TextRank. O cosseno de vetores TF-IDF também funciona. O fator de damping 0.85 e a contagem de iterações são os padrões do PageRank.
Passo 2: abstrativo com BART
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"])
O BART-large-CNN tem fine-tuning no corpus CNN/DailyMail. Ele produz resumos no estilo de notícias direto da caixa. Para outros domínios (artigos científicos, diálogo, jurídico), use o checkpoint Pegasus correspondente ou faça fine-tuning nos seus dados-alvo.
Passo 3: avaliação ROUGE
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()})
Sempre use stemming. Sem ele, "running" e "run" contam como palavras diferentes e o ROUGE subestima.
Além do ROUGE (avaliação de sumarização em 2026)
O ROUGE foi a métrica dominante de sumarização por vinte anos e, sozinho, é insuficiente em 2026. Uma meta-análise em larga escala de papers de NLG mostrou:
- BERTScore (similaridade de embeddings contextuais) ganhou terreno ao longo de 2023 e agora é reportado junto com o ROUGE na maioria dos papers de sumarização.
- BARTScore trata a avaliação como geração: pontua o resumo pela probabilidade que um BART pré-treinado atribui a ele dada a fonte.
- MoverScore (Earth Mover's Distance sobre embeddings contextuais) atingiu o topo nos benchmarks de sumarização de 2025 porque captura a sobreposição semântica melhor que o ROUGE.
- FactCC e faithfulness baseada em QA eram comuns entre 2021-2023, agora frequentemente substituídos por G-Eval (uma cadeia de prompts com GPT-4 que pontua coerência, consistência, fluência e relevância com raciocínio chain-of-thought).
- G-Eval e abordagens semelhantes de LLM-juiz coincidem com o julgamento humano ~80% das vezes quando as rubricas são bem projetadas.
Recomendação de produção: reporte ROUGE-L para comparação legada, BERTScore para sobreposição semântica, G-Eval para coerência e factualidade. Calibre contra 50-100 resumos rotulados por humanos.
Passo 4: o problema da factualidade
Resumos abstrativos são propensos a alucinação. Resumos extrativos carregam um risco de alucinação muito menor porque a saída é copiada literalmente da fonte, embora ainda possam enganar se frases da fonte forem descontextualizadas, desatualizadas ou citadas fora de ordem. Essa é a maior razão pela qual sistemas de produção ainda preferem métodos extrativos para conteúdo próximo a compliance.
Tipos de alucinação para nomear:
- Troca de entidade. A fonte diz "John Smith". O resumo diz "John Brown".
- Desvio numérico. A fonte diz "25.000". O resumo diz "25 milhões".
- Inversão de polaridade. A fonte diz "rejeitou a oferta". O resumo diz "aceitou a oferta".
- Invenção de fato. A fonte não menciona o CEO. O resumo diz que o CEO aprovou.
Abordagens de avaliação que funcionam:
- FactCC. Um classificador binário treinado em entailment entre a frase da fonte e a frase do resumo. Prevê factual/não-factual.
- Factualidade baseada em QA. Faça a um modelo de QA perguntas cujas respostas estão na fonte. Se o resumo sustentar respostas diferentes, sinalize.
- F1 em nível de entidade. Compare as entidades nomeadas da fonte vs do resumo. Entidades presentes apenas no resumo são suspeitas.
Para qualquer coisa voltada ao usuário onde a factualidade importa (notícias, médico, jurídico, financeiro), o extrativo é o padrão mais seguro. O abstrativo precisa de uma verificação de factualidade no loop.
Use
A stack de 2026:
| Caso de uso | Recomendado |
|---|---|
| Notícias, resumo de 3-5 frases, em inglês | facebook/bart-large-cnn |
| Artigos científicos | google/pegasus-pubmed ou um T5 ajustado |
| Múltiplos documentos, formato longo | Qualquer LLM com contexto de 32k+, via prompt |
| Sumarização de diálogo | philschmid/bart-large-cnn-samsum |
| Extrativo, baixo risco de alucinação por construção | TextRank ou LSA / LexRank do sumy |
LLMs com contexto longo frequentemente superam modelos especializados em 2026 quando a computação não é uma restrição. O tradeoff é custo e reprodutibilidade; modelos especializados entregam saídas mais consistentes.
Entregue
Salve como 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).
Exercícios
- Fácil. Execute o TextRank em 5 artigos de notícias. Compare as 3 melhores frases com um resumo de referência. Meça o ROUGE-L. Você deve ver 30-45 de ROUGE-L em artigos no estilo CNN/DailyMail.
- Médio. Implemente factualidade em nível de entidade: extraia entidades nomeadas da fonte e do resumo (spaCy), calcule o recall das entidades da fonte no resumo e a precisão das entidades do resumo contra a fonte. Alta precisão e baixo recall significam seguro mas conciso; baixa precisão significa entidades alucinadas.
- Difícil. Compare o BART-large-CNN contra um LLM (Claude ou GPT-4) em 50 artigos da CNN/DailyMail. Reporte ROUGE-L, factualidade (por F1 de entidade) e custo por resumo. Documente onde cada um vence.
Termos-chave
| Termo | O que as pessoas dizem | O que realmente significa |
|---|---|---|
| Extrativo | Escolher frases | Retornar frases literalmente da fonte. Nunca alucina. |
| Abstrativo | Reescrever | Gerar texto novo condicionado à fonte. Pode alucinar. |
| ROUGE | Métrica de resumo | Sobreposição de n-gramas / LCS entre a saída do sistema e a referência. |
| TextRank | Extrativo baseado em grafo | PageRank sobre o grafo de similaridade de frases. |
| Factualidade | Está certo | Se as afirmações do resumo são sustentadas pela fonte. |
| Alucinação | Conteúdo inventado | Conteúdo no resumo que a fonte não sustenta. |
Leitura Complementar
- Mihalcea e Tarau (2004). TextRank: Bringing Order into Texts — o paper canônico do extrativo.
- Lewis et al. (2019). BART: Denoising Sequence-to-Sequence Pre-training — o paper do BART.
- Zhang et al. (2019). PEGASUS: Pre-training with Extracted Gap-sentences — o Pegasus e o objetivo de gap-sentence.
- Lin (2004). ROUGE: A Package for Automatic Evaluation of Summaries — o paper do ROUGE.
- Maynez et al. (2020). On Faithfulness and Factuality in Abstractive Summarization — o paper sobre o panorama da factualidade.