0Pricing
AI Prompt Engineering · Aula

Solicitações para extração de entidades nomeadas

Extraia nomes, datas, locais e entidades personalizadas de textos não estruturados.

Solicitações para extração de entidades nomeadas é uma aula grátis de AI Prompt Engineering no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de AI Prompt Engineering, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de AI Prompt Engineering inclui 4 aulas no total.

O que é a extração de entidades nomeadas

A extração de entidades nomeadas (NER) é a tarefa de identificar e categorizar entidades específicas do mundo real mencionadas em um texto. A PLN tradicional usa modelos estatísticos para NER; modelos LLM podem realizar essa tarefa com uma instrução bem elaborada.

Tipos comuns de entidades:

  • PERSON: Nomes de pessoas (Elon Musk, Dra. Jane Smith)
  • ORG: Empresas e organizações (Apple, WHO)
  • DATE: Datas e expressões de tempo (15 de janeiro, última terça-feira, 3º trimestre de 2024)
  • LOCATION: Lugares (Nova York, o rio Amazonas)
  • MONEY: Valores financeiros (US$ 4,2 bilhões)

Instrução básica para NER

A instrução NER mais simples solicita todas as entidades em um formato específico:

import anthropic, json

client = anthropic.Anthropic(api_key='YOUR_API_KEY')

text = 'Apple CEO Tim Cook met with European Commission President Ursula von der Leyen in Brussels on March 15, 2025 to discuss the Digital Markets Act.'

prompt = f'''
Extract all named entities from the text below.
Return ONLY a JSON object with no other text:
{{
  "people": ["string"],
  "organizations": ["string"],
  "locations": ["string"],
  "dates": ["string"]
}}

Text: {text}
'''

r = client.messages.create(
    model='claude-opus-4-5', max_tokens=300,
    messages=[{'role': 'user', 'content': prompt}]
)
print(json.loads(r.content[0].text))

Adicionando restrições de tipo à extração

A extração básica retorna cadeias de caracteres de entidades. As restrições de tipo acrescentam validação, garantindo que as datas estejam em um formato específico e que as organizações não incluam palavras comuns:

prompt_typed = '''
Extract named entities from the text below with type constraints.
Return JSON:
{
  "people": ["Full name as written in text"],
  "organizations": ["Official organization name only, no articles (the, a)"],
  "dates": ["ISO 8601 format if possible: YYYY-MM-DD, else exact text as written"],
  "money": ["Include currency symbol and amount: $4.2B, EUR 500K"],
  "locations": ["City, Country format if applicable"]
}
If a category has no entities, use an empty array [].

Text: {text}
'''

print(prompt_typed[:200])
print('\nConstraints enforce consistent output format per entity type.')

Extração orientada por esquema

Para uso em produção, defina o esquema de entidades antecipadamente e faça referência a ele na instrução. Isso torna explícito o contrato de saída:

ENTITY_SCHEMA = '''
{
  "entities": [
    {
      "text": "exact text as it appears in the document",
      "type": "PERSON | ORG | DATE | LOCATION | MONEY | PRODUCT | EVENT",
      "normalized": "canonical form (e.g., full name, ISO date)",
      "start_char": "integer, character offset in source text",
      "confidence": "high | medium | low"
    }
  ]
}
'''

def extract_entities(text):
    prompt = f'Extract all named entities. Return JSON matching this schema exactly:\n{ENTITY_SCHEMA}\n\nText: {text}'
    r = client.messages.create(
        model='claude-opus-4-5', max_tokens=500,
        messages=[{'role': 'user', 'content': prompt}]
    )
    return json.loads(r.content[0].text)

result = extract_entities('Tesla stock rose 5% after Elon Musk announced the Cybertruck delivery on December 1.')
print(result['entities'][0])

Lidando com entidades ambíguas

Algumas cadeias de caracteres de entidades são ambíguas — Apple poderia ser a empresa ou a fruta, e Jordan poderia ser uma pessoa ou um país. Oriente o modelo a resolver a ambiguidade usando o contexto:

prompt_disambiguation = '''
Extract named entities from the text. For ambiguous entities, use the surrounding
context to determine the correct type. Include your reasoning in an "evidence" field.

Return JSON:
{
  "entities": [
    {
      "text": "string",
      "type": "PERSON | ORG | LOCATION | OTHER",
      "evidence": "brief reason for type assignment"
    }
  ]
}

Text: Jordan and Apple signed a distribution deal for the new Air Jordan shoes.
'''

# Expected output: Jordan = PERSON (context: Air Jordan), Apple = ORG (context: signed a deal)
print(prompt_disambiguation)

Extração com definições de campos

Para tipos de entidades personalizados e específicos do seu domínio, forneça definições de campos na instrução para que o modelo saiba exatamente o que deve ser considerado:

prompt_custom = '''
Extract entities from the medical text below using these custom entity types:

Entity Types:
- MEDICATION: Any drug name, trade name, or generic name
- DOSAGE: Amounts and frequencies (mg, mcg, units/day)
- CONDITION: Diagnoses, symptoms, or medical conditions
- PROCEDURE: Medical tests, surgeries, or treatments
- PROVIDER: Doctor names and medical professionals

Return JSON: {"entities": [{"text": str, "type": str}]}

Text: Dr. Patel prescribed Metformin 500mg twice daily for Type 2 Diabetes.
A follow-up HbA1c test is scheduled for next month.
'''

print(prompt_custom)

Extração de entidades em lote

Para processar vários documentos, a extração em lote é mais eficiente. Elabore a instrução para lidar com várias entradas e retornar um resultado estruturado para cada documento:

def batch_extract(documents):
    docs_formatted = '\n'.join(
        f'<document id="{i+1}">\n{doc}\n</document>'
        for i, doc in enumerate(documents)
    )

    prompt = f'''
Extract named entities from each document below.
Return JSON: {{
  "results": [
    {{"doc_id": int, "entities": {{"people": [], "organizations": [], "dates": []}}}}
  ]
}}

{docs_formatted}
'''

    r = client.messages.create(
        model='claude-opus-4-5', max_tokens=1000,
        messages=[{'role': 'user', 'content': prompt}]
    )
    return json.loads(r.content[0].text)

docs = [
    'Satya Nadella presented at Microsoft Build 2025.',
    'The WHO released guidelines on May 10.'
]
print(batch_extract(docs))

Pós-processamento das entidades extraídas

As entidades extraídas frequentemente precisam de pós-processamento antes de serem usadas:

from datetime import datetime

def normalize_entities(raw_entities):
    normalized = {'people': [], 'organizations': [], 'dates': [], 'money': []}

    for person in raw_entities.get('people', []):
        normalized['people'].append(person.strip().title())

    for org in raw_entities.get('organizations', []):
        normalized['organizations'].append(org.strip())

    for date_str in raw_entities.get('dates', []):
        # Try to parse to ISO format
        for fmt in ['%B %d, %Y', '%Y-%m-%d', '%b %d, %Y']:
            try:
                parsed = datetime.strptime(date_str.strip(), fmt)
                normalized['dates'].append(parsed.strftime('%Y-%m-%d'))
                break
            except ValueError:
                pass
        else:
            normalized['dates'].append(date_str.strip())

    return normalized

raw = {'people': ['tim cook', 'URSULA VON DER LEYEN'], 'dates': ['March 15, 2025']}
print(normalize_entities(raw))

Avaliando a qualidade da extração

A qualidade do NER é medida com precisão, revocação e pontuação F1 em comparação com um conjunto de testes rotulado:

  • Precisão: De todas as entidades extraídas, qual fração está correta?
  • Revocação: De todas as entidades verdadeiras, qual fração foi extraída?
  • F1: Média harmônica da precisão e da revocação
def evaluate_extraction(predicted, ground_truth):
    pred_set = set(predicted)
    true_set = set(ground_truth)

    true_positives = len(pred_set & true_set)
    false_positives = len(pred_set - true_set)
    false_negatives = len(true_set - pred_set)

    precision = true_positives / (true_positives + false_positives) if pred_set else 0
    recall = true_positives / (true_positives + false_negatives) if true_set else 0
    f1 = 2 * precision * recall / (precision + recall) if (precision + recall) else 0

    return {'precision': round(precision, 3), 'recall': round(recall, 3), 'f1': round(f1, 3)}

predicted = ['Tim Cook', 'Apple', 'Brussels', 'March 15 2025']
ground_truth = ['Tim Cook', 'Apple', 'Ursula von der Leyen', 'Brussels', 'March 15, 2025', 'European Commission']
print(evaluate_extraction(predicted, ground_truth))

Reduzindo entidades inventadas

Às vezes, os modelos extraem entidades que não existem no texto de origem — são alucinações. Estratégias de mitigação:

  • Instrua: Extraia somente as entidades mencionadas explicitamente no texto. Não deduza nem adicione entidades que não estejam presentes.
  • Instrua: Para cada entidade, inclua a citação exata do texto em que ela aparece.
  • Pós-processe: verifique se cada cadeia de caracteres de entidade extraída aparece de fato no texto original
def anti_hallucination_extract(text):
    prompt = f'''
Extract ONLY entities that are explicitly present in the text below.
Do NOT infer, add, or supplement with external knowledge.
For each entity, include the exact quote from the text.

Return JSON: {{"entities": [{{"text": str, "type": str, "quote": str}}]}}

Text: {text}
'''
    r = client.messages.create(model='claude-opus-4-5', max_tokens=400, messages=[{'role': 'user', 'content': prompt}])
    extracted = json.loads(r.content[0].text)

    # Post-process: verify each entity appears in original text
    verified = [e for e in extracted['entities'] if e['text'].lower() in text.lower()]
    return {'entities': verified}

result = anti_hallucination_extract('Google announced a $5B investment in AI infrastructure.')
print(result)

Correferência e vinculação de entidades

Depois de extrair as cadeias de caracteres brutas das entidades, duas tarefas adicionais melhoram a utilidade posterior:

  • Resolução de correferência: Vincular ele, a empresa e isso à entidade nomeada a que se referem
  • Vinculação de entidades: Mapear os nomes extraídos para identificadores canônicos (por exemplo, "Apple" → apple_inc em uma base de conhecimento)

Ambas podem ser tratadas com uma etapa adicional da instrução após a extração inicial.

coref_prompt = '''
Resolve coreferences in the text below.
For each pronoun or definite reference (he, she, it, the company, the CEO),
identify which named entity it refers to.

Return JSON: {"coreferences": [{"text": str, "refers_to": str, "position": int}]}

Text: Apple released its new chip. The company said it would ship in Q4.
Tim Cook announced that he would present it at the fall event.
'''

print(coref_prompt)

Verificação rápida

Qual é a maneira mais eficaz de impedir que um modelo extraia entidades que não estão presentes no texto de origem?

Extração de entidades nomeadas — principais conclusões

A extração de entidades nomeadas baseada em LLM é flexível e poderosa quando a instrução é bem elaborada:

  • Defina explicitamente os tipos de entidade — PERSON, ORG, DATE, LOCATION, MONEY e tipos específicos do domínio
  • Use um esquema JSON na instrução para impor uma estrutura de saída consistente
  • Adicione definições de campos para tipos de entidade personalizados, para que o modelo saiba exatamente o que se qualifica
  • Exija citações do texto de origem para evitar alucinações de entidades
  • Pós-processe para normalizar os formatos das entidades (datas para ISO, nomes para uso de maiúsculas iniciais)
  • Avalie a qualidade com precisão, revocação e F1 em comparação com um conjunto de testes rotulado
  • Para lotes, processe vários documentos em uma única chamada, com uma saída estruturada por documento

Perguntas Frequentes

A aula “Solicitações para extração de entidades nomeadas” é grátis?

Sim — o texto completo de “Solicitações para extração de entidades nomeadas” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de AI Prompt Engineering, atualize para CoddyKit PRO. O curso de AI Prompt Engineering inclui 4 aulas no total.

O que vou aprender em “Solicitações para extração de entidades nomeadas”?

Extraia nomes, datas, locais e entidades personalizadas de textos não estruturados. Você pratica AI Prompt Engineering com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar AI Prompt Engineering?

Nenhuma experiência prévia é necessária. AI Prompt Engineering no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.

Quanto tempo leva a aula “Solicitações para extração de entidades nomeadas”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de AI Prompt Engineering?

Sim. Cada aula de AI Prompt Engineering inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Solicitações para extração de entidades nomeadas
  2. Extração de dados orientada por esquema
  3. LLM como classificador de texto
  4. Confiança e incerteza na classificação
← Voltar para AI Prompt Engineering