·7 min read

Como usar Claude para extrair dados estruturados de textos desorganizados

Authors
  • avatar
    Name
    ThePromptEra Editorial
    Twitter

O Problema: Dados Presos em Textos

Você tem emails de feedback de clientes, transcrições de chamadas de vendas, artigos de pesquisa ou avaliações de usuários espalhados por documentos. A informação que você precisa está lá — detalhes de contato, feedback de produtos, sentimento, métricas importantes — mas está tudo emaranhado em linguagem natural, com erros de digitação, inconsistências de formatação e contexto irrelevante.

Extrair manualmente é perder tempo. Expressões regulares quebram em casos extremos. Ferramentas de parsing padrão travam na ambiguidade. É aqui que Claude brilha. Seu entendimento de linguagem consegue navegar em textos bagunçados do mundo real e extrair exatamente o que você precisa em formatos limpos e utilizáveis.

Por Que Claude Vence Ferramentas Tradicionais de Extração

Claude não exige padrões predefinidos ou esquemas rígidos. Ele entende o contexto, lida com frases ambíguas e tolera inconsistências — as marcas registradas de dados do mundo real. Dê uma tarefa a ele, e ele se adapta.

Quando você combina Claude com modo JSON (que força saída em JSON válido) e requisições estruturais claras, você consegue extração confiável que funciona mesmo quando os dados de origem são bagunçados, incompletos ou formatados de formas inesperadas.

Configurando Seu Prompt de Extração

O fundamento da extração bem-sucedida é uma requisição clara e estruturada. Aqui está a fórmula:

1. Defina o esquema logo no início

Diga ao Claude exatamente quais campos você quer e o que eles contêm. Seja específico sobre tipos de dados e casos extremos:


Extraia as seguintes informações em JSON:

- nome (string): Nome completo, se presente
- email (string): Endereço de email, se presente
- empresa (string): Nome da empresa ou organização
- telefone (string): Número de telefone em formato E.164, ou null se não presente
- sentimento (string): Um de "positivo", "negativo", "neutro"
- problemas_principais (array de strings): Principais problemas mencionados, máximo 5 itens

2. Mostre exemplos quando o esquema é complexo

Não apenas descreva — demonstre:


Exemplo de entrada:
"Oi pessoal, saí de uma call com a Sarah Martinez da Acme Corp.
Ela está frustrada com os tempos de resposta da API.
Email: sarah@acme.io, celular é +1-415-555-0192.
Diz que seus competidores são mais rápidos.
Mas ela adora a documentação."

Saída esperada:
{
"nome": "Sarah Martinez",
"email": "sarah@acme.io",
"empresa": "Acme Corp",
"telefone": "+14155550192",
"sentimento": "misto",
"problemas_principais": ["Tempos de resposta da API"]
}

3. Lide com dados faltantes explicitamente

Diga ao Claude o que fazer quando uma informação não está presente:


Para qualquer campo não encontrado no texto, use null (não strings vazias ou "N/A").
Se o sentimento não for claro, defina como "neutro".

Exemplo do Mundo Real: Extração de Feedback de Clientes

Digamos que você está processando tickets de suporte ao cliente e precisa extrair dados acionáveis:


Preciso extrair dados estruturados de tickets de suporte ao cliente.
Extraia:

- id_ticket (string): Número de referência, se presente
- nome_cliente (string): Nome completo
- categoria_problema (string): Uma de "cobrança", "técnico", "solicitação_recurso",
  "documentação", "outro"
- urgencia (string): "crítica", "alta", "média", "baixa" baseado no tom/linguagem
- descricao (string): Resumo conciso do problema em 1-2 frases
- status_resolucao (string): "não_resolvido" por padrão, a menos que explicitamente mencionado
- itens_acao (array): Próximos passos específicos mencionados ou implícitos

Retorne apenas JSON válido, sem formatação markdown.

## Texto do ticket:

#TICKET-8847
Cliente: Michael Chen
"Estou tentando há TRÊS DIAS arrumar minha fatura.
Seu sistema de cobrança me cobrou duas vezes pela assinatura de novembro.
Já enviei email para o suporte duas vezes e não recebi resposta.
Isto é ridículo. Preciso resolver isto imediatamente.
Também, sua documentação é completamente confusa sobre como solicitar reembolso."

---

Claude vai extrair:

{
  "id_ticket": "TICKET-8847",
  "nome_cliente": "Michael Chen",
  "categoria_problema": "cobrança",
  "urgencia": "crítica",
  "descricao": "Cliente foi cobrado duas vezes pela assinatura de novembro.
    Emails de suporte anteriores não foram respondidos.",
  "status_resolucao": "não_resolvido",
  "itens_acao": [
    "Investigar cobrança duplicada no sistema de faturamento",
    "Emitir reembolso pela segunda cobrança",
    "Revisar tickets de suporte sem resposta",
    "Melhorar documentação sobre solicitação de reembolso"
  ]
}

Escalando: Processamento em Lote

Quando você tem centenas ou milhares de itens, processe-os eficientemente:

Opção 1: Enviar vários itens de uma vez

Inclua vários exemplos em uma única chamada de API, separados claramente:

Processe cada ticket abaixo. Retorne um array de objetos JSON.

---TICKET 1---
[texto do ticket]

---TICKET 2---
[texto do ticket]

---TICKET 3---
[texto do ticket]

A resposta deve ser um array JSON válido como: [{ id_ticket: "...", ... }, ...]

Opção 2: Processamento em stream para grandes volumes

Para datasets realmente massivos, processe em lotes de 10 a 50 itens por chamada de API. Isso mantém a latência razoável e os custos previsíveis.

Técnicas Avançadas

Scoring de confiança: Adicione um campo confianca (0-1) para indicar quão certo Claude está sobre os dados extraídos. Útil para identificar resultados que precisam de revisão manual:

"nome": "John Smith",
"confianca": 0.95,
"telefone": "555-0123",
"confianca_telefone": 0.6

Estruturas aninhadas: Para dados complexos, não achate tudo. Use JSON aninhado:

{
  "cliente": {
    "nome": "Jane Doe",
    "contato": {
      "email": "jane@example.com",
      "telefone": "+1-800-555-0100"
    }
  },
  "pedido": {
    "id": "PED-12345",
    "itens": [{ "produto": "Widget", "quantidade": 2, "preco": 29.99 }]
  }
}

Extração condicional: Alguns campos só importam em certos contextos. Deixe isto explícito:

Se o texto menciona um problema de produto, também extraia:
- produto_afetado (string)
- versao (string ou null): Versão do produto, se mencionada
- contorno (string ou null): Qualquer solução temporária sugerida
Caso contrário, omita estes campos.

Armadilhas Comuns e Como Evitá-las

Armadilha 1: Descrições de campo vagas

❌ Ruim: "Extraia sentimento" ✅ Bom: "Sentimento deve ser 'positivo', 'negativo' ou 'neutro'. Sentimentos mistos padrão para 'neutro'. Base-se no tom geral, não em frases isoladas."

Armadilha 2: Sem orientação sobre dados parciais

❌ Ruim: "Extraia nome, email, telefone" ✅ Bom: "Extraia nome, email, telefone. Qualquer campo não presente deve ser null, não string vazia."

Armadilha 3: Requisições de formatação inconsistentes

Especifique formatos com precisão: datas (ISO 8601), números de telefone (E.164), moeda (centavos como inteiro), etc.

Armadilha 4: Misturar extração com transformação

Mantenha a extração pura. Não peça ao Claude para "extrair e também calcular taxa de crescimento" na mesma chamada. Extraia primeiro, transforme depois.

Testando Seu Prompt de Extração

Antes de escalar, teste com exemplos diversificados:

  1. Caso normal: Dados limpos e típicos
  2. Dados faltantes: Informações que não estão presentes
  3. Caso bagunçado: Erros de digitação, formatação estranha, frases ambíguas
  4. Caso extremo: Cenários incomuns mas válidos (múltiplos telefones, sem email, etc.)

Execute alguns testes manuais, compare a saída com a verdade absoluta, e refine seu esquema ou prompt baseado nas falhas.

Integração com Seu Workflow

A API do Claude se integra perfeitamente com Python, Node.js ou qualquer cliente HTTP. Aqui está o padrão mínimo:

import json
import anthropic

client = anthropic.Anthropic(api_key="SUA_CHAVE_API")

prompt = "Seu prompt de extração aqui..."
texto = "O texto bagunçado para extrair..."

message = client.messages.create(
    model="claude-3-5-sonnet-20241022",
    max_tokens=1024,
    messages=[
        {
            "role": "user",
            "content": f"{prompt}\n\nTexto para extrair:\n{texto}"
        }
    ]
)

resultado = json.loads(message.content[0].text)
print(resultado)

Quando Usar Claude vs. Outras Ferramentas

Use Claude para:

  • Dados de origem ambíguos ou inconsistentes
  • Raciocínio complexo sobre o que deve ser extraído
  • Extrair de conteúdo misto (texto, tabelas, dados semi-estruturados)
  • Tarefas de extração únicas ou ad hoc

Considere alternativas para:

  • Dados perfeitamente estruturados e gerados por máquina (regex ou parsers simples)
  • Extração em volume extremamente alto com custo mínimo (embora Claude seja competitivo)
  • Extração