مطالبات استخراج الكيانات المسماة
استخرجوا الأسماء والتواريخ والمواقع والكيانات المخصصة من النص غير المنظم
مطالبات استخراج الكيانات المسماة درس مجاني في AI Prompt Engineering على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Prompt Engineering، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Prompt Engineering 4 دروس في المجموع.
ما استخراج الكيانات المسماة؟
استخراج الكيانات المسماة (NER) هو مهمة تحديد كيانات محددة من العالم الحقيقي مذكورة في النص وتصنيفها. تستخدم معالجة اللغة الطبيعية التقليدية نماذج إحصائية لاستخراج الكيانات المسماة، بينما تستطيع نماذج اللغة الكبيرة تنفيذ ذلك باستخدام موجّه مصمم جيدًا.
الأنواع الشائعة للكيانات:
- PERSON: أسماء الأشخاص (Elon Musk وDr. Jane Smith)
- ORG: الشركات والمؤسسات (Apple وWHO)
- DATE: التواريخ والتعبيرات الزمنية (January 15 وlast Tuesday وQ3 2024)
- LOCATION: الأماكن (New York وthe Amazon River)
- MONEY: القيم المالية ($4.2 billion)
موجّه NER الأساسي
يطلب أبسط موجّه لاستخراج الكيانات المسماة جميع الكيانات بتنسيق محدد:
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))إضافة قيود النوع إلى الاستخراج
يعيد الاستخراج الأساسي سلاسل الكيانات. وتضيف قيود النوع عملية تحقق، فتضمن أن تكون التواريخ بتنسيق محدد وأن تستبعد المؤسسات الكلمات الشائعة:
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.')الاستخراج القائم على المخطط
للاستخدام في بيئة الإنتاج، عرّفوا مخطط الكيانات مسبقًا وأشيروا إليه في الموجّه. يجعل ذلك عقد المخرج واضحًا وصريحًا:
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])التعامل مع الكيانات الملتبسة
تكون بعض سلاسل الكيانات ملتبسة — فقد تشير Apple إلى الشركة أو الفاكهة، وقد تشير Jordan إلى شخص أو دولة. وجّهوا النموذج إلى حل الالتباس باستخدام السياق:
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)الاستخراج باستخدام تعريفات الحقول
بالنسبة إلى أنواع الكيانات المخصصة الخاصة بمجالكم، قدّموا تعريفات الحقول في الموجّه حتى يعرف النموذج بالضبط ما الذي يُعد كيانًا:
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)استخراج الكيانات على دفعات
يكون استخراج الكيانات على دفعات أكثر كفاءة عند معالجة مستندات متعددة. صمّموا الموجّه للتعامل مع مدخلات متعددة وإعادة نتيجة منظمة لكل مستند:
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))المعالجة اللاحقة للكيانات المستخرجة
غالبًا ما تحتاج الكيانات المستخرجة إلى معالجة لاحقة قبل استخدامها:
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))تقييم جودة الاستخراج
تُقاس جودة استخراج الكيانات المسماة باستخدام Precision وRecall وF1 score مقارنةً بمجموعة اختبار موسومة:
- Precision: من بين جميع الكيانات المستخرجة، ما نسبة الكيانات الصحيحة؟
- Recall: من بين جميع الكيانات الحقيقية، ما نسبة الكيانات التي استُخرجت؟
- F1: المتوسط التوافقي لكل من Precision وRecall
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))تقليل الكيانات المتوهَّمة
يستخرج النموذج أحيانًا كيانات غير موجودة في النص المصدر — وهذه هلوسات. ومن استراتيجيات الحد منها:
- وجّهوا النموذج: استخرجوا فقط الكيانات المذكورة صراحةً في النص. لا تستنتجوا كيانات غير موجودة ولا تضيفوها.
- وجّهوا النموذج: أدرجوا لكل كيان الاقتباس الدقيق من النص الذي يظهر فيه.
- أجروا معالجة لاحقة: تحققوا من ظهور سلسلة كل كيان مستخرج فعلًا في النص الأصلي
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)الإحالة المشتركة وربط الكيانات
بعد استخراج سلاسل الكيانات الأولية، تحسّن مهمتان إضافيتان فائدتها في المراحل اللاحقة:
- حل الإحالة المشتركة: ربط he وthe company وit بالكيان المسمى الذي تشير إليه
- ربط الكيانات: تعيين الأسماء المستخرجة إلى معرّفات معيارية (مثلًا: "Apple" → apple_inc في قاعدة معرفية)
يمكن معالجة المهمتين باستخدام خطوة موجّه إضافية بعد الاستخراج الأولي.
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)تحقق سريع
ما الطريقة الأكثر فعالية لمنع النموذج من استخراج كيانات غير موجودة في النص المصدر؟
استخراج الكيانات المسماة — أهم النقاط
يتميز استخراج الكيانات المسماة باستخدام نماذج اللغة الكبيرة بالمرونة والقوة عندما يكون الموجّه مصممًا جيدًا:
- حدّدوا أنواع الكيانات صراحةً — PERSON وORG وDATE وLOCATION وMONEY، بالإضافة إلى الأنواع الخاصة بالمجال
- استخدموا مخطط JSON في الموجّه لفرض بنية مخرجات متسقة
- أضيفوا تعريفات الحقول لأنواع الكيانات المخصصة حتى يعرف النموذج بالضبط ما الذي يؤهل الكيان ليُعد من النوع
- اشترطوا تضمين اقتباسات من المصدر لمنع هلوسة الكيانات
- أجروا معالجة لاحقة لتوحيد تنسيقات الكيانات (تحويل التواريخ إلى ISO والأسماء إلى حالة العنوان)
- قيّموا الجودة باستخدام Precision وRecall وF1 مقارنةً بمجموعة اختبار موسومة
- بالنسبة إلى الدفعات، عالجوا مستندات متعددة في استدعاء واحد مع مخرجات منظمة لكل مستند
الأسئلة الشائعة
هل درس «مطالبات استخراج الكيانات المسماة» مجاني؟
نعم — نص درس «مطالبات استخراج الكيانات المسماة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Prompt Engineering، انتقل إلى CoddyKit PRO. تتضمن دورة AI Prompt Engineering 4 دروس في المجموع.
ماذا ستتعلم في «مطالبات استخراج الكيانات المسماة»؟
استخرجوا الأسماء والتواريخ والمواقع والكيانات المخصصة من النص غير المنظم تتمرن على AI Prompt Engineering مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ AI Prompt Engineering؟
لا تُشترط خبرة سابقة. AI Prompt Engineering على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «مطالبات استخراج الكيانات المسماة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس AI Prompt Engineering هذا؟
نعم. كل درس في AI Prompt Engineering يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- مطالبات استخراج الكيانات المسماة
- استخراج البيانات المدفوع بالمخطط
- النموذج اللغوي الكبير كمصنّف نصوص
- الثقة وعدم اليقين في التصنيف