Topik ini membahas entitas bernama (named entity), yaitu potongan teks yang merujuk satu objek dunia seperti orang, organisasi, tempat, tanggal, atau jumlah uang. Setelah membacanya, keluaran doc.ents pada spaCy dapat dibaca apa adanya, termasuk saat model meleset, dan peran entitas sebagai jembatan menuju data terstruktur dapat dijelaskan.
Apa yang dikenali NER#
Pengenalan entitas bernama (named entity recognition), disingkat NER, adalah tugas menemukan rentang teks dan memberinya label kategori. Keluarannya bukan token tunggal, melainkan span, yaitu rentang token berurutan yang dianggap satu entitas beserta labelnya. Pada spaCy, seluruh entitas terkumpul di doc.ents, dan setiap anggota menyediakan teks serta label melalui ent.text dan ent.label_.
Label yang paling sering ditemui pada model spaCy dirangkum pada tabel berikut.
| Label | Kategori | Contoh |
|---|---|---|
| PERSON | Orang atau tokoh | Ali |
| ORG | Organisasi | Asosiasi Pembaca Kota Semarang |
| GPE | Negara, kota, atau wilayah geopolitik | Semarang |
| DATE | Tanggal atau periode | 12 March 2024 |
| MONEY | Nilai uang beserta satuannya | 150,000 |
Model en_core_web_sm dilatih pada korpus beranotasi bahasa Inggris, sehingga label dan pola pendeteksiannya mengikuti sebaran data tersebut. Keluaran pada teks di luar sebaran itu perlu dibaca dengan sikap kritis, dan bagian berikut menggunakan teks bahasa Indonesia untuk memperlihatkan perilakunya apa adanya.
Membaca keluaran NER pada teks Indonesia#
Berkas berikut memproses satu kalimat bahasa Indonesia yang memuat nama orang, organisasi fiktif, nama kota, tanggal, dan jumlah uang. Kalimatnya sengaja netral dan tidak merepresentasikan organisasi nyata.
import spacy
nlp = spacy.load("en_core_web_sm")
doc = nlp("Ali mendaftar di Asosiasi Pembaca Kota Semarang pada 12 Maret 2024 dengan iuran 150000 rupiah per tahun.")
for ent in doc.ents:
print(f"{ent.text:<40}{ent.label_:<10}{spacy.explain(ent.label_)}")Ali mendaftar di PERSON People, including fictional
Pembaca Kota PERSON People, including fictional
Semarang GPE Countries, cities, states
12 CARDINAL Numerals that do not fall under another type
2024 DATE Absolute or relative dates or periods
150000 CARDINAL Numerals that do not fall under another typeKeluaran tersebut berisi enam entitas, dan tidak semuanya sesuai harapan. Span Ali mendaftar di berlabel PERSON, padahal hanya Ali yang merupakan nama orang, sedangkan mendaftar dan di adalah kata Indonesia biasa. Model menarik batas span terlalu lebar karena fitur bahasa yang biasanya memisahkan nama dari kata kerja tidak tersedia pada data pelatihannya.
Temuan yang tepat juga ada, yaitu Semarang yang berlabel GPE sesuai kategorinya sebagai nama kota. Sebaliknya, Asosiasi Pembaca Kota Semarang tidak terdeteksi sebagai ORG sama sekali karena kata-kata penyusunnya tidak membentuk pola organisasi yang dikenali model. Label ORG tetap ada pada himpunan model, tetapi tidak dipilih untuk frasa ini.
Tanggal 12 Maret 2024 terpecah menjadi dua entitas, yaitu 12 berlabel CARDINAL dan 2024 berlabel DATE. Pola tanggal model bergantung pada penanda bulan bahasa Inggris seperti March, sehingga kata Maret tidak digunakan untuk merakit span penuh. Jumlah iuran 150000 juga masuk CARDINAL dan bukan MONEY, karena penanda mata uang rupiah tidak termasuk pola yang dikenali model.
Pembanding teks bahasa Inggris#
Perbandingan dengan kalimat berbahasa Inggris menunjukkan bahwa penurunan kualitas berasal dari bahasanya, bukan dari komponen NER itu sendiri. Kalimat berikut menyatakan makna yang sama dengan kosakata bahasa Inggris.
import spacy
nlp = spacy.load("en_core_web_sm")
doc = nlp("Ali joined the Reading Club of Semarang on 12 March 2024 with a yearly fee of 150000 rupiah.")
for ent in doc.ents:
print(f"{ent.text:<40}{ent.label_:<10}{spacy.explain(ent.label_)}")Ali PERSON People, including fictional
Semarang GPE Countries, cities, states
12 March 2024 DATE Absolute or relative dates or periods
150000 CARDINAL Numerals that do not fall under another typePada keluaran ini, rentang 12 March 2024 terdeteksi utuh sebagai DATE dan Ali tetap PERSON. Jumlah 150000 tetap CARDINAL meskipun kata rupiah disebut, sehingga label MONEY juga bergantung pada penanda yang dikenali model. Contoh berikut menggunakan penanda dolar untuk memperlihatkan label MONEY ketika polanya cocok.
import spacy
nlp = spacy.load("en_core_web_sm")
doc = nlp("The yearly fee of the library is $150,000.")
for ent in doc.ents:
print(f"{ent.text:<30}{ent.label_:<10}{spacy.explain(ent.label_)}")150,000 MONEY Monetary values, including unitPada keluaran ini, jumlah dengan penanda dolar berlabel MONEY. Rangkaian tiga contoh menunjukkan bahwa label mengikuti pola data pelatihan, sehingga penerapan NER perlu diuji pada teks yang benar-benar akan diproses, bukan pada contoh yang tampak mirip di permukaan.
Dari teks menuju pengetahuan terstruktur#
Nilai utama NER terletak pada perannya sebagai jembatan antara teks bebas dan data terstruktur. Dokumen teks tidak memiliki skema, sedangkan basis data menuntut kolom dengan nilai yang jelas. Entitas mengisi kolom tersebut, yaitu nama orang mengisi kolom pelaku, tanggal mengisi kolom waktu, dan jumlah uang mengisi kolom nilai, sehingga dokumen berubah menjadi baris data yang dapat dihitung, diurutkan, dan digabungkan.
Entitas juga menjadi kunci pengindeksan. Mesin pencarian internal dapat membangun indeks terbalik khusus entitas, sehingga pencarian nama organisasi mengembalikan dokumen yang menyebutnya tanpa pencocokan string mentah. Pada tahap lanjut, entitas dapat ditautkan ke entri pengetahuan yang terstruktur, misalnya satu entri per organisasi, sehingga dokumen yang menyebut nama berbeda untuk organisasi yang sama tetap berkumpul pada satu kunci.
Semua kegunaan itu bergantung pada kualitas span dan label. Span yang meleset mengisi kolom dengan nilai kotor, sedangkan label yang salah mengirim nilai ke kolom yang keliru. Batasan model kecil berikut menunjukkan sumber kesalahan yang paling sering berpengaruh.
Batasan model kecil#
Model kecil seperti en_core_web_sm menawarkan kecepatan dan ukuran yang hemat dengan konsekuensi cakupan yang sempit. Model ini dilatih pada korpus anotasi bahasa Inggris, sehingga kategorinya, pola tanggalnya, dan pola mata uangnya mengikuti sebaran data tersebut. Teks berbahasa lain mengalami penurunan kualitas yang terlihat pada contoh sebelumnya, mulai dari span yang terlalu lebar sampai entitas yang tidak terdeteksi.
Batasan lain berasal dari pengetahuan dunia. NER klasik mengenali bahwa suatu span adalah orang atau organisasi, tetapi tidak mengetahui siapa orang itu, sehingga dua span berbeda dapat merujuk objek yang sama, dan span yang sama dapat merujuk objek berbeda sesuai konteks. Penggabungan aturan kustom pada pipeline dapat menutup sebagian celah ini, misalnya dengan menambahkan pola untuk nama organisasi lokal.
Ringkasan#
- NER menemukan span beserta label kategorinya, dan pada spaCy seluruhnya terkumpul di
doc.entsdengan teks serta label melaluient.textdanent.label_. - Model en_core_web_sm bekerja baik pada teks bahasa Inggris yang mirip data pelatihannya, sedangkan teks bahasa Indonesia menghasilkan span yang meleset dan tanggal yang terpecah, yaitu 12 Maret 2024 yang masuk sebagai 12 CARDINAL dan 2024 DATE.
- Entitas bernama menjadi jembatan menuju data terstruktur karena mengisi kolom basis data dan menjadi kunci pengindeksan dokumen.
Referensi#
- spaCy Usage Documentation — Explosion
— Bagian Named entities menjabarkan
doc.ents,ent.label_, danspacy.explainuntuk membaca label. - Speech and Language Processing, draf edisi ke-3 — Jurafsky & Martin, Stanford — Bab penandaan barisan untuk NER mendefinisikan entitas bernama dan label umumnya.