0Pricing
AI Prompt Engineering · Pelajaran

Perintah Ekstraksi Entitas Bernama

Ekstrak nama, tanggal, lokasi, dan entitas khusus dari teks tidak terstruktur.

Perintah Ekstraksi Entitas Bernama adalah pelajaran AI Prompt Engineering gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Prompt Engineering, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Prompt Engineering mencakup 4 pelajaran total.

Apa Itu Ekstraksi Entitas Bernama?

Ekstraksi entitas bernama (NER) adalah tugas mengidentifikasi dan mengategorikan entitas dunia nyata tertentu yang disebutkan dalam teks. NLP tradisional menggunakan model statistik untuk NER; LLM dapat melakukannya dengan perintah yang dirancang dengan baik.

Jenis entitas umum:

  • PERSON: Nama orang (Elon Musk, Dr. Jane Smith)
  • ORG: Perusahaan dan organisasi (Apple, WHO)
  • DATE: Tanggal dan ungkapan waktu (15 Januari, Selasa lalu, Kuartal 3 2024)
  • LOCATION: Tempat (New York, Sungai Amazon)
  • MONEY: Nilai keuangan ($4,2 miliar)

Perintah NER Dasar

Perintah NER paling sederhana meminta semua entitas dalam format tertentu:

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))

Menambahkan Batasan Jenis pada Ekstraksi

Ekstraksi dasar mengembalikan string entitas. Batasan jenis menambahkan validasi — memastikan tanggal menggunakan format tertentu dan organisasi tidak menyertakan kata-kata umum:

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.')

Ekstraksi Berbasis Skema

Untuk penggunaan produksi, tentukan skema entitas terlebih dahulu dan rujuk skema tersebut dalam perintah. Dengan demikian, kontrak keluaran menjadi eksplisit:

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])

Menangani Entitas Ambigu

Beberapa string entitas bersifat ambigu — Apple dapat berarti perusahaan atau buah, sedangkan Jordan dapat berarti orang atau negara. Arahkan model untuk menyelesaikan ambiguitas menggunakan konteks:

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)

Ekstraksi dengan Definisi Bidang

Untuk jenis entitas khusus yang spesifik bagi domain Anda, berikan definisi bidang dalam perintah agar model mengetahui dengan tepat apa yang termasuk:

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)

Ekstraksi Entitas secara Berkelompok

Untuk memproses banyak dokumen, ekstraksi berkelompok lebih efisien. Rancang perintah agar menangani banyak masukan dan mengembalikan hasil terstruktur untuk setiap dokumen:

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))

Pemrosesan Lanjutan Entitas yang Diekstrak

Entitas yang diekstrak sering memerlukan pemrosesan lanjutan sebelum digunakan:

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))

Mengevaluasi Kualitas Ekstraksi

Kualitas NER diukur menggunakan Precision, Recall, dan skor F1 terhadap set pengujian berlabel:

  • Precision: Dari semua entitas yang diekstrak, berapa bagiankah yang benar?
  • Recall: Dari semua entitas yang benar-benar ada, berapa bagiankah yang berhasil diekstrak?
  • F1: Rata-rata harmonis antara precision dan 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))

Mengurangi Entitas Halusinasi

Model terkadang mengekstrak entitas yang tidak ada dalam teks sumber — halusinasi. Strategi mitigasi:

  • Instruksikan: Hanya ekstrak entitas yang disebutkan secara eksplisit dalam teks. Jangan menyimpulkan atau menambahkan entitas yang tidak ada.
  • Instruksikan: Untuk setiap entitas, sertakan kutipan persis dari teks tempat entitas tersebut muncul.
  • Proses lanjutan: verifikasi bahwa setiap string entitas yang diekstrak benar-benar muncul dalam teks asli
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)

Koreferensi dan Penautan Entitas

Setelah mengekstrak string entitas mentah, dua tugas tambahan dapat meningkatkan kegunaan untuk proses selanjutnya:

  • Penyelesaian koreferensi: Menautkan dia, perusahaan tersebut, dan itu kembali ke entitas bernama yang dirujuk
  • Penautan entitas: Memetakan nama yang diekstrak ke pengenal kanonis (misalnya, "Apple" → apple_inc dalam basis pengetahuan)

Keduanya dapat ditangani dengan langkah perintah tambahan setelah ekstraksi awal.

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)

Pemeriksaan Singkat

Apa cara paling efektif untuk mencegah model mengekstrak entitas yang tidak ada dalam teks sumber?

Ekstraksi Entitas Bernama — Poin Utama

Ekstraksi entitas bernama berbasis LLM bersifat fleksibel dan kuat jika perintah dirancang dengan baik:

  • Tentukan jenis entitas secara eksplisit — PERSON, ORG, DATE, LOCATION, MONEY, dan jenis khusus domain
  • Gunakan skema JSON dalam perintah untuk memberlakukan struktur keluaran yang konsisten
  • Tambahkan definisi bidang untuk jenis entitas khusus agar model mengetahui dengan tepat kualifikasi yang diperlukan
  • Wajibkan kutipan sumber untuk mencegah halusinasi entitas
  • Lakukan pemrosesan lanjutan untuk menormalkan format entitas (tanggal ke ISO, nama ke kapitalisasi judul)
  • Evaluasi kualitas dengan precision, recall, dan F1 terhadap set pengujian berlabel
  • Untuk pemrosesan berkelompok, proses banyak dokumen dalam satu pemanggilan dengan keluaran terstruktur per dokumen

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Perintah Ekstraksi Entitas Bernama” gratis?

Ya — teks lengkap “Perintah Ekstraksi Entitas Bernama” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Prompt Engineering, upgrade ke CoddyKit PRO. Kursus AI Prompt Engineering mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Perintah Ekstraksi Entitas Bernama”?

Ekstrak nama, tanggal, lokasi, dan entitas khusus dari teks tidak terstruktur. Kamu berlatih AI Prompt Engineering dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai AI Prompt Engineering?

Tidak diperlukan pengalaman sebelumnya. AI Prompt Engineering di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “Perintah Ekstraksi Entitas Bernama” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Prompt Engineering ini?

Ya. Setiap pelajaran AI Prompt Engineering menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Perintah Ekstraksi Entitas Bernama
  2. Ekstraksi Data Berbasis Skema
  3. LLM sebagai Pengklasifikasi Teks
  4. Keyakinan dan Ketidakpastian dalam Klasifikasi
← Kembali ke AI Prompt Engineering