Phase 05 - Lesson 24
Resolución de Correferencia
"Ella lo llamó. Él no contestó. El médico estaba almorzando." Tres referencias a dos personas y nadie está nombrado. La resolución de correferencia descubre quién es quién.
Tipo: Aprender Lenguajes: Python Prerrequisitos: Fase 5 · 06 (NER), Fase 5 · 07 (POS y Análisis Sintáctico) Tiempo: ~60 minutos
El Problema
Extrae cada mención de Apple Inc. de un artículo de 300 palabras. Fácil cuando el artículo dice "Apple". Difícil cuando dice "la empresa", "ellos", "el gigante tecnológico de Cupertino" o "la firma de Jobs". Sin resolver estas menciones hacia la misma entidad, tu pipeline de NER pierde entre el 60 y el 80% de las menciones.
La resolución de correferencia enlaza cada expresión que se refiere a la misma entidad del mundo real en un único cluster. Es el pegamento entre el NLP de superficie (NER, análisis sintáctico) y la semántica posterior (EI, QA, resumen, KG).
Por qué importa en 2026:
- Resumen: "El CEO anunció..." vs "Tim Cook anunció..." — el resumen debería nombrar al CEO.
- Respuesta a preguntas: "¿A quién llamó ella?" requiere resolver "ella".
- Extracción de información: un grafo de conocimiento con "PER1 fundó Apple" y "Jobs fundó Apple" como entradas separadas está mal.
- EI multidocumento: fusionar menciones a través de artículos sobre el mismo evento es correferencia cross-document.
El Concepto
La tarea. Entrada: un documento. Salida: un clustering de menciones (spans) donde cada cluster se refiere a una entidad.
Tipos de mención.
- Entidad nombrada. "Tim Cook"
- Nominal. "el CEO", "la empresa"
- Pronominal. "él", "ella", "ellos", "eso"
- Apositiva. "Tim Cook, el CEO de Apple,"
Arquitecturas.
- Basada en reglas (Hobbs, 1978). Resolución de pronombes basada en el árbol sintáctico usando reglas gramaticales. Buena baseline. Sorprendentemente difícil de superar en pronombres.
- Clasificador de pares de menciones. Para cada par de menciones (m_i, m_j), predecir si correfieren. Hacer el clustering por clausura transitiva. Estándar antes de 2016.
- Ranking de menciones. Para cada mención, rankear los antecedentes candidatos (incluyendo "ningún antecedente"). Elegir el primero.
- End-to-end basado en spans (Lee et al., 2017). Encoder transformer. Enumerar todos los spans candidatos hasta un límite de longitud. Predecir scores de mención. Predecir la probabilidad de antecedente para cada span. Hacer el clustering de forma voraz. El estándar moderno.
- Generativo (2024+). Haz un prompt a un LLM: "Lista cada pronombre en este texto y su antecedente." Funciona bien en casos fáciles, pero tiene dificultades en documentos largos y referentes raros.
Las métricas de evaluación. Cinco métricas estándar (MUC, B³, CEAF, BLANC, LEA) porque ninguna métrica aislada captura la calidad del clustering. Reporta el promedio de las tres primeras como CoNLL F1. El estado del arte en 2026 en CoNLL-2012: ~83 F1.
Casos difíciles conocidos.
- Descripciones definidas que se refieren a entidades introducidas páginas antes.
- Anáfora asociativa ("las ruedas" → un coche mencionado anteriormente).
- Anáfora cero en lenguas como el chino y el japonés.
- Catáfora (pronombre antes del referente): "Cuando ella entró, Mary sonrió."
Constrúyelo
Paso 1: correferencia neuronal preentrenada (AllenNLP / spaCy-experimental)
import spacy
nlp = spacy.load("en_coreference_web_trf") # experimental model
doc = nlp("Apple announced new products. The company said they would ship soon.")
for cluster in doc._.coref_clusters:
print(cluster, "->", [m.text for m in cluster])
En un documento más largo, obtienes algo como:
- Cluster 1: [Apple, The company, they]
- Cluster 2: [new products]
Paso 2: resolvedor de pronombres basado en reglas (didáctico)
Mira code/main.py para una implementación solo con la stdlib:
- Extrae menciones: entidades nombradas (spans en mayúscula), pronombres (búsqueda en diccionario), descripciones definidas ("el X").
- Para cada pronombre, observa las K menciones anteriores y puntúalas por:
- concordancia de género/número (heurística)
- recencia (la más cercana gana)
- rol sintáctico (se prefieren los sujetos)
- Enlaza el antecedente con mayor puntuación.
No es competitivo con los modelos neuronales. Pero muestra el espacio de búsqueda y las decisiones que un modelo end-to-end debe tomar.
Paso 3: usando LLMs para correferencia
prompt = f"""Text: {text}
List every pronoun and noun phrase that refers to a person or company.
Cluster them by what they refer to. Output JSON:
[{{"entity": "Apple", "mentions": ["Apple", "the company", "it"]}}, ...]
"""
Dos modos de fallo a vigilar. Primero, los LLMs fusionan en exceso ("él" y "ella" refiriéndose a dos personas distintas). Segundo, los LLMs descartan silenciosamente menciones en documentos largos. Verifica siempre con comprobaciones de offset de span.
Paso 4: evaluación
El script estándar de conll-2012 calcula MUC, B³, CEAF-φ4 y reporta el promedio. Para una evaluación interna, empieza con precisión y exhaustividad a nivel de span en tu conjunto de prueba anotado, luego añade el F1 de enlace de menciones.
Trampas
- Explosión de singletons. Algunos sistemas reportan cada mención como su propio cluster. B³ es indulgente. MUC castiga esto. Verifica siempre las tres métricas.
- Pronombres en contexto largo. El rendimiento cae ~15 F1 en documentos con más de 2.000 tokens. Haz el chunking con cuidado.
- Suposiciones de género. Las reglas de género codificadas se rompen con referentes no binarios, organizaciones, animales. Usa modelos aprendidos o puntuación neutral.
- Drift de LLM en documentos largos. Una sola llamada a la API no puede hacer el clustering de menciones de forma fiable a través de más de 50 párrafos. Usa ventana deslizante + fusión.
Úsalo
El stack de 2026:
| Situación | Elección |
|---|---|
| Inglés, documento único | en_coreference_web_trf (spaCy-experimental) o correferencia neuronal AllenNLP |
| Multilingüe | SpanBERT / XLM-R entrenado en OntoNotes o CoNLL Multilingüe |
| Correferencia de eventos cross-document | Modelos end-to-end especializados (SOTA 2025–26) |
| Baseline rápida con LLM | GPT-4o / Claude con prompt de correferencia de salida estructurada |
| Sistemas de diálogo en producción | Fallback basado en reglas + neuronal primario + revisión manual para slots críticos |
El patrón de integración que llega a producción en 2026: ejecuta NER primero, ejecuta correferencia, fusiona los clusters de correferencia en las entidades de NER. Las tareas posteriores ven una entidad por cluster, no una entidad por mención.
Entrégalo
Guarda como outputs/skill-coref-picker.md:
---
name: coref-picker
description: Pick a coreference approach, evaluation plan, and integration strategy.
version: 1.0.0
phase: 5
lesson: 24
tags: [nlp, coref, information-extraction]
---
Given a use case (single-doc / multi-doc, domain, language), output:
1. Approach. Rule-based / neural span-based / LLM-prompted / hybrid. One-sentence reason.
2. Model. Named checkpoint if neural.
3. Integration. Order of operations: tokenize → NER → coref → downstream task.
4. Evaluation. CoNLL F1 (MUC + B³ + CEAF-φ4 average) on held-out set + manual cluster review on 20 documents.
Refuse LLM-only coref for documents over 2,000 tokens without sliding-window merge. Refuse any pipeline that runs coref without a mention-level precision-recall report. Flag gender-heuristic systems deployed in demographically diverse text.
Ejercicios
- Fácil. Ejecuta el resolvedor basado en reglas en
code/main.pysobre 5 párrafos creados manualmente. Mide la exactitud de enlace de menciones contra la verdad de referencia. - Medio. Usa un modelo neuronal de correferencia preentrenado sobre un artículo de noticias. Compara los clusters con tu propia anotación manual. ¿Dónde falló?
- Difícil. Construye un pipeline de NER mejorado con correferencia: NER primero, luego fusiona vía clusters de correferencia. Mide la mejora de cobertura de entidades vs solo NER sobre 100 artículos.
Términos Clave
| Término | Lo que dice la gente | Lo que realmente significa |
|---|---|---|
| Mención | Una referencia | Un span de texto que se refiere a una entidad (nombre, pronombre, sintagma nominal). |
| Antecedente | A qué se refiere "eso" | La mención anterior con la que una posterior correfiere. |
| Cluster | Las menciones de la entidad | Conjunto de menciones que todas se refieren a la misma entidad del mundo real. |
| Anáfora | Referencia hacia atrás | Una mención posterior se refiere a una anterior ("él" → "John"). |
| Catáfora | Referencia hacia adelante | Una mención anterior se refiere a una posterior ("Cuando él llegó, John..."). |
| Anáfora asociativa | Referencia implícita | "Compré un coche. Las ruedas estaban mal." (ruedas de ESE coche.) |
| CoNLL F1 | El número en los leaderboards | Promedio de los scores F1 de MUC, B³, CEAF-φ4. |
Lectura Adicional
- Jurafsky y Martin, SLP3 Cap. 26 — Coreference Resolution and Entity Linking — capítulo canónico del libro de texto.
- Lee et al. (2017). End-to-end Neural Coreference Resolution — end-to-end basado en spans.
- Joshi et al. (2020). SpanBERT — preentrenamiento que mejora la correferencia.
- Pradhan et al. (2012). CoNLL-2012 Shared Task — el benchmark.
- Hobbs (1978). Resolving Pronoun References — el clásico basado en reglas.