chatbot_lib / app.py
irhamni's picture
Rename app (3).py to app.py
4413eed verified
# =================================================================
# KODE APP.PY (MENGGUNAKAN GRADIO)
# =================================================================
import gradio as gr
import pandas as pd
import pickle
import re
import nltk
import os
nltk.download('punkt')
# --- KONFIGURASI FILE ---
MODEL_PATH = 'chatbot_model.pkl'
FAQ_PATH = 'perpustakaan_faq.csv'
# Unduh resource NLTK (diperlukan untuk tokenisasi)
try:
nltk.data.find('tokenizers/punkt')
except nltk.downloader.DownloadError:
nltk.download('punkt')
# --- 1. Muat Model dan Data (Loading Resources) ---
# Fungsi ini dijalankan sekali saat aplikasi startup
def load_resources():
"""Memuat model dan data FAQ."""
# Coba muat Model
try:
with open(MODEL_PATH, 'rb') as file:
model_pipeline = pickle.load(file)
except Exception as e:
# Jika loading gagal, catat error di log dan kembalikan None
print(f"FATAL ERROR: Gagal memuat Model atau CSV. Pastikan file ada dan versinya cocok. Error: {e}")
return None, None
# Coba muat Data
try:
df_faq = pd.read_csv(FAQ_PATH)
except Exception as e:
print(f"FATAL ERROR: Gagal memuat/membaca data CSV. Error: {e}")
return None, None
return model_pipeline, df_faq
model, df_faq = load_resources()
# --- 2. Fungsi Pembersihan Teks dan Logika Chatbot ---
def clean_text(text):
"""Membersihkan teks (sesuai dengan yang digunakan saat pelatihan)."""
text = re.sub(r'[^\w\s]', '', text)
return text.lower().strip()
def predict_and_respond(query):
"""Memprediksi Intent dan mengambil Jawaban yang sesuai.
Menerima query (string) dan mengembalikan respons (string)."""
# Pastikan model sudah dimuat sebelum memproses query
if model is None or df_faq is None:
return "Chatbot tidak tersedia. Terjadi kesalahan pada saat memuat model atau data."
cleaned_q = clean_text(query)
# Prediksi Intent
try:
predicted_intent = model.predict([cleaned_q])[0]
# Ambil Jawaban
responses = df_faq[df_faq['kategori'] == predicted_intent]['chatbot_response'].tolist()
if responses:
return responses[0]
else:
return f"Maaf, saya tidak dapat menemukan jawaban yang spesifik. (Intent: {predicted_intent})"
except Exception as e:
return f"Terjadi kesalahan saat memprediksi. Coba ulangi. Error: {e}"
# --- 3. Antarmuka Gradio ---
# Membuat interface Gradio
iface = gr.Interface(
fn=predict_and_respond,
inputs=gr.Textbox(lines=2, placeholder="Tanyakan tentang keanggotaan, peminjaman, atau fasilitas..."),
outputs="text",
title="πŸ“š Asisten Virtual Perpustakaan",
description="Tanyakan apapun tentang layanan perpustakaan kami. Menggunakan model Klasifikasi Teks yang dilatih dengan Scikit-learn.",
allow_flagging="never"
)
# Menjalankan aplikasi
if __name__ == "__main__":
iface.launch()