🦁 BaliBERT: Named Entity Recognition untuk Sastra Satua Bali

BaliBERT adalah model Transformer ekstraksi entitas bernama (Named Entity Recognition / NER) khusus bahasa Bali yang di-fine-tune dari fondasi indobenchmark/indobert-base-p1. Model ini dilatih secara khusus untuk mengenali dan mengklasifikasikan 5 kategori entitas karakter tokoh pada korpus cerita rakyat dan sastra Bali (Satua Bali).


πŸ“Œ Informasi Model

  • Nama Repositori: Dramaniako/BaliBERT
  • Arsitektur Dasar: IndoBERT-base (124M parameter, WordPiece tokenization)
  • Tugas (Task): Token Classification / Named Entity Recognition (NER)
  • Skema Pelabelan: BIO (Begin, Inside, Outside) dengan 11 label token
  • Bahasa: Basa Bali (ban), Bahasa Indonesia (id)
  • Akurasi Token Keseluruhan: 95.58%
  • Micro F1-Score (Chunk-Level seqeval): 78.91%

🏷️ Taksonomi Kelas Entitas

Model ini mengenali 5 kategori karakter tokoh dalam sastra dan narasi bahasa Bali:

Label Kategori Entitas Deskripsi & Contoh dalam Satua Bali
PNAME Person Name Nama tokoh manusia (I Pekak Dukuh, I Tiwas, Raden Galuh, Pan Karsa).
ANM Animal Character Tokoh satwa/hewan dalam fabel Satua Tantri (Sang Lutung, I Kakua, I Macan, I Siap Selem).
OBJ Kinship Role / Object Sebutan persona kekerabatan, peran sosial, atau objek keramat (memene, pianakne, kurenane, Gada sakti).
GODS Deities & Spiritual Nama dewa, bhatara, atau entitas spiritual (Bhatara Guru, Sang Hyang Anantaboga, Betara Surya).
ADJ Adjective Modifier Gelar penanda sifat karakter tokoh (Men Sugih, anak ririh, I Belog, tualen).
O Outside Kata umum non-entitas (kata kerja, kata hubung, preposisi, tanda baca).

πŸš€ Cara Menggunakan Model (Quickstart)

1. Menggunakan Hugging Face pipeline (Paling Praktis)

from transformers import pipeline

# Inisialisasi pipeline NER
ner = pipeline(
    "token-classification",
    model="Dramaniako/BaliBERT",
    tokenizer="Dramaniako/BaliBERT",
    aggregation_strategy="simple"
)

# Kalimat uji bahasa Bali
teks = "I Pekak Dukuh lantas ngaukin Sang Lutung ane sedeng ngamah biu di duur punyane."

# Jalankan ekstraksi entitas
hasil = ner(teks)
for entitas in hasil:
    print(f"β€’ Entitas : {entitas['word']:<20} | Kelas: {entitas['entity_group']:<6} | Skor: {entitas['score']:.4f}")

Contoh Output:

β€’ Entitas : I Pekak Dukuh        | Kelas: PNAME  | Skor: 0.9990
β€’ Entitas : Sang Lutung          | Kelas: ANM    | Skor: 0.9905

2. Inferensi Manual PyTorch dengan Word Boundary Snapping

import torch
from transformers import AutoTokenizer, AutoModelForTokenClassification

model_name = "Dramaniako/BaliBERT"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForTokenClassification.from_pretrained(model_name)
model.eval()

text = "Gelisang satua Bhatara Guru lantas micayang panugrahan ring Sang Hyang Anantaboga."
inputs = tokenizer(text, return_tensors="pt")

with torch.no_grad():
    outputs = model(**inputs)
    predictions = torch.argmax(outputs.logits, dim=-1)[0].tolist()

tokens = tokenizer.convert_ids_to_tokens(inputs["input_ids"][0])
id2label = model.config.id2label

for token, pred_id in zip(tokens, predictions):
    if token not in ["[CLS]", "[SEP]", "[PAD]"]:
        print(f"{token:<15} -> {id2label[pred_id]}")

πŸ“Š Hasil Evaluasi & Performa (Benchmark)

Evaluasi dilakukan pada dataset blind test independen (data/test.xlsx) berisi 30.395 kata token dan 2.052 kalimat:

Laporan Klasifikasi CoNLL seqeval (Tingkat Entitas Utuh)

Kelas Entitas Precision Recall F1-Score Support (Jumlah Entitas)
ADJ 0.93 0.95 93.63% 132
PNAME 0.84 0.86 84.96% 845
ANM 0.81 0.83 81.95% 872
GODS 0.65 0.71 68.05% 162
OBJ 0.66 0.64 64.91% 577
Micro Average 0.78 0.80 78.91% 2.588
Macro Average 0.78 0.80 78.70% 2.588

Metrik Akurasi Tingkat Token

  • Overall Token Accuracy (termasuk label O): 95.58%
  • Entity Token Accuracy (Micro, khusus kata entitas): 85.35%
  • Pelanggaran Transisi BIO (Illegal Transitions): 0 (Eliminasi total orphan I- dan mixed-class)

βš™οΈ Detail Pelatihan (Training Setup)

  • Dataset Latih: 59.522 kata token / 4.398 kalimat sastra Satua Bali
  • Strategi Subword Alignment: First-Subword Strategy (morfem akar kata pertama, token lanjutan diabaikan -100)
  • Loss Function: Smoothed Class-Weighted Cross-Entropy Loss untuk menangani ketimpangan kelas mayoritas O
  • Optimizer: AdamW (weight_decay=0.01)
  • Learning Rate: 3e-5 dengan Linear Warmup 100 langkah
  • Batch Size: 16
  • Epochs: 5
  • Hardware: NVIDIA GeForce RTX 4060 Laptop GPU (CUDA 12.4, Mixed Precision fp16)

⚠️ Batasan (Limitations)

  1. Ambiguitas Konteks Satwa vs Manusia: Pada beberapa cerita fabel, tokoh satwa dapat menggunakan gelar manusia (contoh: "Ida Sang Prabu" yang merujuk pada Raja Singa). Model memprediksi berdasarkan konteks kalimat lokal.
  2. Entitas Spiritual Langka (GODS): Kosakata tokoh dewa atau bhatara yang sangat jarang muncul di korpus latih memiliki variasi representasi yang lebih menantang.
  3. Domain Teks: Model ini dioptimalkan untuk sastra narasi tradisional Bali (Satua Bali). Penggunaan pada teks percakapan modern atau formal administratif mungkin memerlukan adaptasi lanjutan.

πŸ“œ Lisensi & Sitasi

Model ini dirilis di bawah lisensi Apache 2.0. Jika Anda menggunakan model ini dalam penelitian atau proyek Anda, silakan berikan atribusi kepada repositori ini:

@misc{balibert2026,
  author = {Dramaniako},
  title = {BaliBERT: Named Entity Recognition for Balinese Literature using IndoBERT},
  year = {2026},
  publisher = {Hugging Face},
  howpublished = {\url{https://huggingface.co/Dramaniako/BaliBERT}}
}
Downloads last month
51
Safetensors
Model size
0.1B params
Tensor type
F32
Β·
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support