Phase 05 - Lesson 12

Resumen de Texto

Los sistemas extractivos te dicen lo que dijo el documento. Los sistemas abstractivos te dicen lo que quiso decir el autor. Tareas diferentes, trampas diferentes.

Tipo: Build Lenguajes: Python Requisitos previos: Fase 5 · 02 (BoW + TF-IDF), Fase 5 · 11 (Traducción Automática) Tiempo: ~75 minutos

El Problema

Un artículo de noticias de 2.000 palabras llega a tu feed. Necesitas 120 palabras que lo capturen. Puedes elegir las tres oraciones más importantes del artículo (extractivo) o reescribir el contenido con tus propias palabras (abstractivo). Ambos se llaman resumen. Son problemas completamente diferentes.

El resumen extractivo es un problema de ranking. Puntúa cada oración, devuelve las k mejores. La salida siempre es gramatical porque se copia textualmente. El riesgo es perder contenido que está distribuido a lo largo del artículo.

El resumen abstractivo es un problema de generación. Un transformer produce texto nuevo condicionado a la entrada. La salida es fluida y compresiva, pero puede alucinar hechos que no estaban en la fuente. El riesgo es la fabricación confiada.

Esta lección construye ambos, con el modo de fallo que cada uno posee.

El Concepto

TextRank extractivo vs transformer abstractivo

Extractivo. Trata el artículo como un grafo donde los nodos son oraciones y las aristas son similitudes. Ejecuta PageRank (o algo parecido) sobre el grafo para puntuar las oraciones según lo conectadas que están con todo lo demás. Las oraciones con mayor puntuación forman el resumen. La implementación canónica es TextRank (Mihalcea y Tarau, 2004).

Abstractivo. Haz fine-tuning de un transformer encoder-decoder (BART, T5, Pegasus) sobre pares documento-resumen. En la inferencia, el modelo lee el documento y genera el resumen token a token mediante cross-attention. Pegasus en particular usa un objetivo de preentrenamiento de gap-sentence que lo hace excelente en resumen sin mucho fine-tuning.

Evaluación con ROUGE (Recall-Oriented Understudy for Gisting Evaluation). ROUGE-1 y ROUGE-2 puntúan la superposición de unigramas y bigramas. ROUGE-L puntúa la subsecuencia común más larga. Más alto es mejor, pero 40 de ROUGE-L es "bueno" y 50 es "excepcional". Todo paper reporta los tres. Usa el paquete rouge-score.

Constrúyelo

Paso 1: TextRank (extractivo)

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]

Dos cosas que vale la pena nombrar. La función de similitud usa superposición de palabras normalizada por logaritmo, que es la variante original de TextRank. El coseno de vectores TF-IDF también funciona. El factor de damping 0.85 y el conteo de iteraciones son los valores por defecto de PageRank.

Paso 2: abstractivo con 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"])

BART-large-CNN tiene fine-tuning sobre el corpus CNN/DailyMail. Produce resúmenes con estilo de noticias listos para usar. Para otros dominios (artículos científicos, diálogo, legal), usa el checkpoint Pegasus correspondiente o haz fine-tuning sobre tus datos objetivo.

Paso 3: evaluación 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()})

Usa siempre stemming. Sin él, "running" y "run" cuentan como palabras distintas y ROUGE subcuenta.

Más allá de ROUGE (evaluación de resumen en 2026)

ROUGE ha sido la métrica dominante de resumen durante veinte años y, por sí sola, es insuficiente en 2026. Un metaanálisis a gran escala de papers de NLG mostró:

  • BERTScore (similitud de embeddings contextuales) ganó terreno a lo largo de 2023 y ahora se reporta junto con ROUGE en la mayoría de los papers de resumen.
  • BARTScore trata la evaluación como generación: puntúa el resumen según la probabilidad que un BART preentrenado le asigna dada la fuente.
  • MoverScore (Earth Mover's Distance sobre embeddings contextuales) alcanzó el primer puesto en los benchmarks de resumen de 2025 porque captura la superposición semántica mejor que ROUGE.
  • FactCC y la fidelidad basada en QA eran comunes entre 2021-2023, ahora a menudo reemplazados por G-Eval (una cadena de prompts con GPT-4 que puntúa coherencia, consistencia, fluidez y relevancia con razonamiento chain-of-thought).
  • G-Eval y enfoques similares de LLM-juez coinciden con el juicio humano ~80% de las veces cuando las rúbricas están bien diseñadas.

Recomendación de producción: reporta ROUGE-L para comparación heredada, BERTScore para superposición semántica, G-Eval para coherencia y factualidad. Calibra contra 50-100 resúmenes etiquetados por humanos.

Paso 4: el problema de la factualidad

Los resúmenes abstractivos son propensos a la alucinación. Los resúmenes extractivos conllevan un riesgo de alucinación mucho menor porque la salida se copia textualmente de la fuente, aunque todavía pueden inducir a error si las oraciones de la fuente se descontextualizan, quedan desactualizadas o se citan fuera de orden. Esta es la razón principal por la que los sistemas de producción todavía prefieren métodos extractivos para contenido cercano a compliance.

Tipos de alucinación que nombrar:

  • Intercambio de entidad. La fuente dice "John Smith". El resumen dice "John Brown".
  • Desviación numérica. La fuente dice "25.000". El resumen dice "25 millones".
  • Inversión de polaridad. La fuente dice "rechazó la oferta". El resumen dice "aceptó la oferta".
  • Invención de hechos. La fuente no menciona al CEO. El resumen dice que el CEO aprobó.

Enfoques de evaluación que funcionan:

  • FactCC. Un clasificador binario entrenado en entailment entre la oración de la fuente y la oración del resumen. Predice factual/no-factual.
  • Factualidad basada en QA. Hazle a un modelo de QA preguntas cuyas respuestas estén en la fuente. Si el resumen sostiene respuestas diferentes, señálalo.
  • F1 a nivel de entidad. Compara las entidades nombradas de la fuente vs el resumen. Las entidades presentes solo en el resumen son sospechosas.

Para cualquier cosa de cara al usuario donde la factualidad importa (noticias, médico, legal, financiero), el extractivo es el valor por defecto más seguro. El abstractivo necesita una verificación de factualidad en el loop.

Úsalo

El stack de 2026:

Caso de uso Recomendado
Noticias, resumen de 3-5 oraciones, en inglés facebook/bart-large-cnn
Artículos científicos google/pegasus-pubmed o un T5 ajustado
Multidocumento, formato largo Cualquier LLM con contexto de 32k+, mediante prompt
Resumen de diálogo philschmid/bart-large-cnn-samsum
Extractivo, bajo riesgo de alucinación por construcción TextRank o LSA / LexRank de sumy

Los LLM con contexto largo a menudo superan a los modelos especializados en 2026 cuando el cómputo no es una restricción. El tradeoff es costo y reproducibilidad; los modelos especializados entregan salidas más consistentes.

Entrégalo

Guarda 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).

Ejercicios

  1. Fácil. Ejecuta TextRank sobre 5 artículos de noticias. Compara las 3 mejores oraciones con un resumen de referencia. Mide el ROUGE-L. Deberías ver entre 30-45 de ROUGE-L en artículos al estilo CNN/DailyMail.
  2. Medio. Implementa factualidad a nivel de entidad: extrae entidades nombradas de la fuente y del resumen (spaCy), calcula el recall de las entidades de la fuente en el resumen y la precisión de las entidades del resumen contra la fuente. Alta precisión y bajo recall significan seguro pero escueto; baja precisión significa entidades alucinadas.
  3. Difícil. Compara BART-large-CNN contra un LLM (Claude o GPT-4) sobre 50 artículos de CNN/DailyMail. Reporta ROUGE-L, factualidad (por F1 de entidad) y costo por resumen. Documenta dónde gana cada uno.

Términos Clave

Término Lo que la gente dice Lo que realmente significa
Extractivo Elegir oraciones Devolver oraciones textualmente de la fuente. Nunca alucina.
Abstractivo Reescribir Generar texto nuevo condicionado a la fuente. Puede alucinar.
ROUGE Métrica de resumen Superposición de n-gramas / LCS entre la salida del sistema y la referencia.
TextRank Extractivo basado en grafo PageRank sobre el grafo de similitud de oraciones.
Factualidad Si está bien Si las afirmaciones del resumen están sustentadas por la fuente.
Alucinación Contenido inventado Contenido en el resumen que la fuente no sustenta.

Lecturas Adicionales

0 lifetime access. Curriculum based on AI Engineering from Scratch by Rohit Ghumare (MIT, used under attribution).