Phase 05 - Lesson 24

Resolução de Correferência

"Ela ligou para ele. Ele não atendeu. O médico estava almoçando." Três referências a duas pessoas e ninguém é nomeado. A resolução de correferência descobre quem é quem.

Tipo: Aprender Linguagens: Python Pré-requisitos: Fase 5 · 06 (NER), Fase 5 · 07 (POS e Análise Sintática) Tempo: ~60 minutos

O Problema

Extraia toda menção à Apple Inc. de um artigo de 300 palavras. Fácil quando o artigo diz "Apple". Difícil quando diz "a empresa", "eles", "a gigante de tecnologia de Cupertino" ou "a firma de Jobs". Sem resolver essas menções para a mesma entidade, seu pipeline de NER perde de 60 a 80% das menções.

A resolução de correferência liga toda expressão que se refere à mesma entidade do mundo real em um único cluster. É a cola entre o NLP de superfície (NER, análise sintática) e a semântica posterior (EI, QA, sumarização, KG).

Por que isso importa em 2026:

  • Sumarização: "O CEO anunciou..." vs "Tim Cook anunciou..." — o resumo deve nomear o CEO.
  • Resposta a perguntas: "Para quem ela ligou?" requer resolver "ela".
  • Extração de informação: um grafo de conhecimento com "PER1 fundou a Apple" e "Jobs fundou a Apple" como entradas separadas está errado.
  • EI multidocumento: mesclar menções entre artigos sobre o mesmo evento é correferência cross-document.

O Conceito

Clustering de correferência: menções → entidades

A tarefa. Entrada: um documento. Saída: um clustering de menções (spans) em que cada cluster se refere a uma entidade.

Tipos de menção.

  • Entidade nomeada. "Tim Cook"
  • Nominal. "o CEO", "a empresa"
  • Pronominal. "ele", "ela", "eles", "isso"
  • Apositiva. "Tim Cook, o CEO da Apple,"

Arquiteturas.

  1. Baseada em regras (Hobbs, 1978). Resolução de pronomes baseada na árvore sintática usando regras gramaticais. Boa baseline. Surpreendentemente difícil de superar em pronomes.
  2. Classificador de pares de menções. Para cada par de menções (m_i, m_j), prever se eles correferem. Fazer o clustering por fecho transitivo. Padrão antes de 2016.
  3. Ranqueamento de menções. Para cada menção, ranquear os antecedentes candidatos (incluindo "nenhum antecedente"). Escolher o topo.
  4. End-to-end baseado em spans (Lee et al., 2017). Encoder transformer. Enumerar todos os spans candidatos até um limite de comprimento. Prever scores de menção. Prever a probabilidade de antecedente para cada span. Fazer o clustering de forma gananciosa. O padrão moderno.
  5. Generativo (2024+). Faça um prompt em um LLM: "Liste todo pronome neste texto e seu antecedente." Funciona bem em casos fáceis, mas tem dificuldade em documentos longos e referentes raros.

As métricas de avaliação. Cinco métricas padrão (MUC, B³, CEAF, BLANC, LEA) porque nenhuma métrica isolada captura a qualidade do clustering. Reporte a média das três primeiras como CoNLL F1. O estado da arte em 2026 no CoNLL-2012: ~83 F1.

Casos difíceis conhecidos.

  • Descrições definidas que se referem a entidades introduzidas páginas antes.
  • Anáfora associativa ("as rodas" → um carro mencionado anteriormente).
  • Anáfora zero em línguas como chinês e japonês.
  • Catáfora (pronome antes do referente): "Quando ela entrou, Mary sorriu."

Construa

Passo 1: correferência neural pré-treinada (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])

Em um documento mais longo, você obtém algo como:

  • Cluster 1: [Apple, The company, they]
  • Cluster 2: [new products]

Passo 2: resolvedor de pronomes baseado em regras (didático)

Veja code/main.py para uma implementação somente com a stdlib:

  1. Extraia menções: entidades nomeadas (spans capitalizados), pronomes (busca em dicionário), descrições definidas ("o X").
  2. Para cada pronome, olhe as K menções anteriores e pontue-as por:
    • concordância de gênero/número (heurística)
    • recência (mais próximo vence)
    • papel sintático (sujeitos preferidos)
  3. Ligue o antecedente de maior pontuação.

Não é competitivo com modelos neurais. Mas mostra o espaço de busca e as decisões que um modelo end-to-end precisa tomar.

Passo 3: usando LLMs para correferência

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"]}}, ...]
"""

Dois modos de falha a observar. Primeiro, LLMs mesclam demais ("ele" e "ela" se referindo a duas pessoas distintas). Segundo, LLMs descartam silenciosamente menções em documentos longos. Sempre verifique com checagens de offset de span.

Passo 4: avaliação

O script padrão do conll-2012 calcula MUC, B³, CEAF-φ4 e reporta a média. Para uma avaliação interna, comece com precisão e revocação a nível de span no seu conjunto de teste anotado, depois adicione o F1 de ligação de menções.

Armadilhas

  • Explosão de singletons. Alguns sistemas reportam cada menção como seu próprio cluster. O B³ é leniente. O MUC pune isso. Sempre verifique as três métricas.
  • Pronomes em contexto longo. O desempenho cai ~15 F1 em documentos com mais de 2.000 tokens. Faça o chunking com cuidado.
  • Suposições de gênero. Regras de gênero codificadas quebram com referentes não binários, organizações, animais. Use modelos aprendidos ou pontuação neutra.
  • Drift de LLM em documentos longos. Uma única chamada de API não consegue fazer o clustering de menções de forma confiável em mais de 50 parágrafos. Use janela deslizante + mesclagem.

Use

A stack de 2026:

Situação Escolha
Inglês, documento único en_coreference_web_trf (spaCy-experimental) ou correferência neural AllenNLP
Multilíngue SpanBERT / XLM-R treinado em OntoNotes ou CoNLL Multilíngue
Correferência de eventos cross-document Modelos end-to-end especializados (SOTA 2025–26)
Baseline rápido com LLM GPT-4o / Claude com prompt de correferência de saída estruturada
Sistemas de diálogo em produção Fallback baseado em regras + neural primário + revisão manual para slots críticos

O padrão de integração que entra em produção em 2026: rode NER primeiro, rode correferência, mescle os clusters de correferência nas entidades do NER. As tarefas posteriores veem uma entidade por cluster, não uma entidade por menção.

Entregue

Salve 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.

Exercícios

  1. Fácil. Rode o resolvedor baseado em regras em code/main.py em 5 parágrafos criados manualmente. Meça a acurácia de ligação de menções contra a verdade de referência.
  2. Médio. Use um modelo neural de correferência pré-treinado em um artigo de notícia. Compare os clusters com sua própria anotação manual. Onde ele falhou?
  3. Difícil. Construa um pipeline de NER aprimorado por correferência: NER primeiro, depois mescle via clusters de correferência. Meça a melhoria de cobertura de entidades vs apenas NER em 100 artigos.

Termos-chave

Termo O que as pessoas dizem O que realmente significa
Menção Uma referência Um span de texto que se refere a uma entidade (nome, pronome, sintagma nominal).
Antecedente A que "isso" se refere A menção anterior com a qual uma posterior correfere.
Cluster As menções da entidade Conjunto de menções que todas se referem à mesma entidade do mundo real.
Anáfora Referência para trás Menção posterior se refere a uma anterior ("ele" → "John").
Catáfora Referência para frente Menção anterior se refere a uma posterior ("Quando ele chegou, John...").
Anáfora associativa Referência implícita "Comprei um carro. As rodas estavam ruins." (rodas DAQUELE carro.)
CoNLL F1 O número nos leaderboards Média dos scores F1 de MUC, B³, CEAF-φ4.

Leitura Adicional

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