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