ModelNER / app.py
Dawgggggg's picture
Update app.py
38dda16 verified
import gradio as gr
import pandas as pd
from transformers import pipeline, AutoTokenizer, AutoModelForTokenClassification
import os # Untuk memeriksa environment variabel
# --- 1. Konfigurasi Model ---
# Pastikan ID repositori model Anda sudah benar dan model (config.json, pytorch_model.bin, dll.)
# sudah terunggah sepenuhnya ke repositori ini.
MODEL_ID = "Dawgggggg/modelNER"
# --- 2. Inisialisasi Model dan Pipeline ---
# Gunakan try-except block untuk penanganan error saat memuat model
tokenizer = None
model = None
ner_pipeline = None
try:
print(f"Loading tokenizer from {MODEL_ID}...")
tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)
print("Tokenizer loaded.")
print(f"Loading model from {MODEL_ID}...")
model = AutoModelForTokenClassification.from_pretrained(MODEL_ID)
print("Model loaded.")
print("Creating NER pipeline...")
ner_pipeline = pipeline("ner", model=model, tokenizer=tokenizer, aggregation_strategy="simple")
print("NER pipeline created successfully.")
except Exception as e:
print(f"Error loading model or tokenizer: {e}")
# Jika ada error saat startup, kita bisa memberikan fungsi dummy
# agar UI tetap muncul dengan pesan error
def dummy_pipeline(text):
print(f"Model not loaded. Error: {e}")
return []
ner_pipeline = dummy_pipeline
# --- 3. Fungsi Prediksi NER ---
def predict_ner_all(text):
# Pastikan pipeline sudah terinisialisasi
if ner_pipeline is None or isinstance(ner_pipeline, type(lambda:0)): # Cek jika dummy function
return (
pd.DataFrame(columns=["Entitas", "Kata", "Skor", "Mulai", "Akhir"]),
"Error: Model tidak dapat dimuat. Cek log.",
[]
)
if not text:
return (
pd.DataFrame(columns=["Entitas", "Kata", "Skor", "Mulai", "Akhir"]),
"", # Teks kosong
[] # Highlight kosong
)
try:
results = ner_pipeline(text)
except Exception as e:
print(f"Error during NER pipeline execution: {e}")
return (
pd.DataFrame(columns=["Entitas", "Kata", "Skor", "Mulai", "Akhir"]),
f"Error saat menjalankan NER: {e}",
[]
)
# Untuk DataFrame
df_results = []
for res in results:
df_results.append(
{
"Entitas": res["entity_group"],
"Kata": res["word"],
"Skor": f"{res['score']:.2f}",
"Mulai": res["start"],
"Akhir": res["end"]
}
)
df_output = pd.DataFrame(df_results)
# Untuk HighlightedText
highlighted_chunks = []
current_index = 0
# Pastikan hasil dari pipeline tidak kosong sebelum iterasi
if results:
for res in results:
# Tambahkan teks non-entitas sebelum entitas saat ini
if res["start"] > current_index:
highlighted_chunks.append((text[current_index:res["start"]], None))
# Tambahkan entitas yang terdeteksi
highlighted_chunks.append((res["word"], res["entity_group"], res["score"]))
# Update current_index
current_index = res["end"]
# Tambahkan sisa teks setelah entitas terakhir
if current_index < len(text):
highlighted_chunks.append((text[current_index:], None))
else:
# Jika tidak ada entitas yang terdeteksi, tampilkan seluruh teks tanpa highlight
highlighted_chunks.append((text, None))
return df_output, text, highlighted_chunks
# --- 4. Antarmuka Gradio ---
with gr.Blocks(theme=gr.themes.Soft()) as demo:
gr.Markdown("# Demo NER Informasi Obat dan Dosis")
gr.Markdown("Model ini dirancang untuk mengekstraksi informasi obat, dosis, dan unit dari teks medis berbahasa Indonesia.")
with gr.Row():
text_input = gr.Textbox(
lines=2,
placeholder="Masukkan kalimat di sini, contoh: Diberikan parasetamol 5.6 mg/dL setiap 8 jam.",
label="Kalimat Input"
)
submit_button = gr.Button("Deteksi Entitas")
# Output dalam bentuk tabel
with gr.Row():
df_output = gr.Dataframe(
headers=["Entitas", "Kata", "Skor", "Mulai", "Akhir"],
wrap=True,
label="Hasil Deteksi (Tabel)"
)
# Output dalam bentuk teks yang disorot
with gr.Row():
# Karena gr.HighlightedText memerlukan input teks asli dan list highlight,
# kita perlu "proxy" teks asli dari fungsi predict_ner_all
# Output kedua dari predict_ner_all adalah teks asli
# Output ketiga adalah list highlight
highlighted_output = gr.HighlightedText(
label="Deteksi Entitas (Teks Disorot)",
color_map={
"DRUG": "red",
"RESULT": "blue",
"UNIT": "green",
# Tambahkan warna lain jika ada entitas lain yang Anda prediksi
# Contoh: "DOSAGE": "purple"
},
show_legend=True # Menampilkan legenda warna
)
# Menghubungkan tombol dengan fungsi prediksi
submit_button.click(
fn=predict_ner_all,
inputs=text_input,
# Output harus sesuai urutan: df_output, highlighted_output (bagian text), highlighted_output (bagian highlight)
outputs=[df_output, text_input, highlighted_output] # Output kedua dari predict_ner_all adalah text, yang diumpan kembali ke text_input sebagai "state"
)
# Contoh-contoh input untuk mempermudah pengujian
gr.Examples(
examples=[
["Diberikan parasetamol 5.6 mg/dL setiap 8 jam."],
["Pasien diberi insulin 10 unit sebelum makan."],
["Resepnya adalah amoxicillin 500 mg tiga kali sehari."]
],
inputs=text_input
)
# --- 5. Jalankan Aplikasi Gradio ---
# Set share=True untuk mendapatkan tautan publik saat berjalan secara lokal
# Saat di Hugging Face Space, ini otomatis menjadi True
demo.launch()