# ================================================================= # 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()