Invites d’extraction d’entités nommées
Extrayez les noms, les dates, les lieux et les entités personnalisées d’un texte non structuré.
Invites d’extraction d’entités nommées est une leçon AI Prompt Engineering gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage AI Prompt Engineering, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours AI Prompt Engineering comprend 4 leçons au total.
Qu’est-ce que l’extraction d’entités nommées ?
L’extraction d’entités nommées (NER) consiste à identifier et à catégoriser des entités précises du monde réel mentionnées dans un texte. Le traitement automatique du langage naturel traditionnel utilise des modèles statistiques pour la NER ; les LLM peuvent effectuer cette tâche avec une invite bien conçue.
Types d’entités courants :
- PERSON : noms de personnes (Elon Musk, Dr Jane Smith)
- ORG : entreprises et organisations (Apple, WHO)
- DATE : dates et expressions temporelles (15 janvier, mardi dernier, T3 2024)
- LOCATION : lieux (New York, le fleuve Amazone)
- MONEY : montants financiers (4,2 milliards de dollars)
Invite NER de base
L’invite NER la plus simple demande toutes les entités dans un format précis :
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))Ajouter des contraintes de type à l’extraction
L’extraction de base renvoie des chaînes d’entités. Les contraintes de type ajoutent une validation — elles garantissent que les dates utilisent un format précis et que les organisations excluent les mots courants :
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.')Extraction guidée par un schéma
Pour une utilisation en production, définissez à l’avance le schéma des entités et faites-y référence dans l’invite. Le contrat de sortie est ainsi explicite :
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])Gérer les entités ambiguës
Certaines chaînes d’entités sont ambiguës — Apple peut désigner l’entreprise ou le fruit, et Jordan peut désigner une personne ou un pays. Guidez le modèle pour qu’il lève l’ambiguïté à l’aide du contexte :
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)Extraire avec des définitions de champs
Pour les types d’entités personnalisés propres à votre domaine, fournissez des définitions de champs dans l’invite afin que le modèle sache exactement ce qui doit être considéré comme une entité :
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)Extraction d’entités par lots
Pour traiter plusieurs documents, l’extraction par lots est plus efficace. Concevez l’invite pour qu’elle gère plusieurs entrées et renvoie un résultat structuré pour chaque document :
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))Post-traiter les entités extraites
Les entités extraites nécessitent souvent un post-traitement avant leur utilisation :
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))Évaluer la qualité de l’extraction
La qualité de la NER se mesure à l’aide de la précision, du rappel et du score F1 sur un jeu de tests annoté :
- Précision : parmi toutes les entités extraites, quelle fraction est correcte ?
- Rappel : parmi toutes les entités réelles, quelle fraction a été extraite ?
- F1 : moyenne harmonique de la précision et du rappel
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))Réduire les entités hallucinées
Les modèles extraient parfois des entités qui n’existent pas dans le texte source : ce sont des hallucinations. Stratégies d’atténuation :
- Donnez l’instruction suivante : Extrayez uniquement les entités explicitement mentionnées dans le texte. Ne déduisez pas d’entités et n’en ajoutez aucune qui n’est pas présente.
- Donnez l’instruction suivante : Pour chaque entité, incluez la citation exacte du texte où elle apparaît.
- Effectuez un post-traitement : vérifiez que chaque chaîne d’entité extraite apparaît réellement dans le texte 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)Coréférence et liaison d’entités
Après avoir extrait les chaînes d’entités brutes, deux tâches supplémentaires améliorent l’utilité ultérieure :
- Résolution des coréférences : relier il, l’entreprise et elle à l’entité nommée à laquelle ces termes font référence
- Liaison d’entités : associer les noms extraits à des identifiants canoniques (par exemple, « Apple » → apple_inc dans une base de connaissances)
Ces deux tâches peuvent être prises en charge par une étape d’invite supplémentaire après l’extraction initiale.
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)Vérification rapide
Quel est le moyen le plus efficace d’empêcher un modèle d’extraire des entités absentes du texte source ?
Extraction d’entités nommées — points essentiels
L’extraction d’entités nommées fondée sur les LLM est flexible et puissante lorsque l’invite est bien conçue :
- Définissez explicitement les types d’entités — PERSON, ORG, DATE, LOCATION, MONEY et les types propres au domaine
- Utilisez un schéma JSON dans l’invite pour imposer une structure de sortie cohérente
- Ajoutez des définitions de champs pour les types d’entités personnalisés afin que le modèle sache exactement ce qui est admissible
- Exigez des citations du texte source pour éviter les hallucinations d’entités
- Effectuez un post-traitement pour normaliser les formats d’entités (dates au format ISO, noms en casse de titre)
- Évaluez la qualité à l’aide de la précision, du rappel et du score F1 sur un jeu de tests annoté
- Pour les lots, traitez plusieurs documents en un seul appel avec une sortie structurée par document
Apprends AI Prompt Engineering avec un tuteur IA — gratuit
Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.
- Cours
- 53
- Leçons
- 199
Questions Fréquemment Posées
La leçon « Invites d’extraction d’entités nommées » est-elle gratuite ?
Oui — le texte complet de « Invites d’extraction d’entités nommées » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours AI Prompt Engineering, passe à CoddyKit PRO. Le cours AI Prompt Engineering comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Invites d’extraction d’entités nommées » ?
Extrayez les noms, les dates, les lieux et les entités personnalisées d’un texte non structuré. Tu pratiques AI Prompt Engineering avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer AI Prompt Engineering ?
Aucune expérience préalable n'est requise. AI Prompt Engineering sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.
Combien de temps prend la leçon « Invites d’extraction d’entités nommées » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon AI Prompt Engineering ?
Oui. Chaque leçon AI Prompt Engineering inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Invites d’extraction d’entités nommées
- Extraction de données pilotée par un schéma
- LLM comme classificateur de texte
- Confiance et incertitude en classification