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