Spaces:
Build error
Build error
File size: 2,995 Bytes
61e22c9 e54d4f9 61e22c9 e1a7148 e54d4f9 61e22c9 e54d4f9 61e22c9 e54d4f9 61e22c9 82bf91e e54d4f9 61e22c9 82bf91e 61e22c9 82bf91e e54d4f9 82bf91e e54d4f9 61e22c9 82bf91e 61e22c9 82bf91e e54d4f9 82bf91e e54d4f9 61e22c9 e54d4f9 61e22c9 e54d4f9 61e22c9 82bf91e e54d4f9 61e22c9 e54d4f9 61e22c9 e54d4f9 61e22c9 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
# =================================================================
# 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() |