irhamni commited on
Commit
82bf91e
·
verified ·
1 Parent(s): ba2e4fd

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +48 -33
app.py CHANGED
@@ -1,57 +1,62 @@
1
- # -*- coding: utf-8 -*-
2
- """app.ipynb
3
-
4
- Automatically generated by Colab.
5
-
6
- Original file is located at
7
- https://colab.research.google.com/drive/1Pl40oGz5tSGYUl-qkOCO9EQQuNw4ElvP
8
- """
9
-
10
- # =================================================================
11
- # KODE APP.PY: UNTUK DIUNGGAH KE HUGGING FACE
12
- # =================================================================
13
  import streamlit as st
14
  import pandas as pd
15
  import pickle
16
  import re
17
  import nltk
18
- nltk.download('punkt')
19
 
20
  # --- KONFIGURASI FILE ---
21
  MODEL_PATH = 'chatbot_model.pkl'
22
  FAQ_PATH = 'perpustakaan_faq.csv'
23
 
24
- # Unduh punkt NLTK
25
  try:
26
  nltk.data.find('tokenizers/punkt')
27
  except nltk.downloader.DownloadError:
28
  nltk.download('punkt')
29
 
30
- # --- 1. Muat Model dan Data (Caching) ---
 
31
  @st.cache_resource
32
  def load_resources():
33
- """Memuat model dan data FAQ sekali saja menggunakan caching Streamlit."""
 
 
 
 
 
34
  try:
35
- # Muat Model Klasifikasi (Pipeline TFIDF + Naive Bayes)
36
  with open(MODEL_PATH, 'rb') as file:
37
- # Karena versi scikit-learn dan numpy telah dikunci, loading seharusnya berhasil
38
  model_pipeline = pickle.load(file)
 
 
 
 
 
 
 
39
 
40
- # Muat Data FAQ untuk mendapatkan Jawaban
 
41
  df_faq = pd.read_csv(FAQ_PATH)
42
-
43
- return model_pipeline, df_faq
44
- except FileNotFoundError as e:
45
- st.error(f"Gagal memuat file penting: {e}. Pastikan '{MODEL_PATH}' dan '{FAQ_PATH}' telah diunggah.")
46
- st.stop()
47
  except Exception as e:
48
- # Menangkap error loading (termasuk binary incompatibility)
49
- st.error(f"Terjadi kesalahan fatal saat memuat model. Pastikan versi scikit-learn dan numpy di requirements.txt sama persis dengan yang digunakan saat pelatihan model. Error: {e}")
50
- st.stop()
51
 
 
 
 
52
  model, df_faq = load_resources()
53
 
 
 
 
 
54
  # --- 2. Fungsi Pembersihan Teks dan Logika Chatbot ---
 
55
  def clean_text(text):
56
  """Membersihkan teks (sesuai dengan yang digunakan saat pelatihan)."""
57
  text = re.sub(r'[^\w\s]', '', text)
@@ -59,15 +64,20 @@ def clean_text(text):
59
 
60
  def predict_and_respond(query, model, df_faq):
61
  """Memprediksi Intent dan mengambil Jawaban yang sesuai."""
62
-
63
  cleaned_q = clean_text(query)
 
 
64
  predicted_intent = model.predict([cleaned_q])[0]
 
 
65
  responses = df_faq[df_faq['kategori'] == predicted_intent]['chatbot_response'].tolist()
66
 
67
  if responses:
68
  return responses[0]
69
  else:
70
- return f"Maaf, saya tidak dapat menemukan jawaban. (Intent: {predicted_intent})"
 
71
 
72
  # --- 3. Antarmuka Streamlit ---
73
 
@@ -75,6 +85,7 @@ st.set_page_config(page_title="Perpustakaan Chatbot")
75
  st.title("📚 Asisten Virtual Perpustakaan")
76
  st.markdown("Halo! Tanyakan tentang **keanggotaan, peminjaman, atau fasilitas** kami.")
77
 
 
78
  if "messages" not in st.session_state:
79
  st.session_state.messages = []
80
 
@@ -83,14 +94,18 @@ for message in st.session_state.messages:
83
  st.markdown(message["content"])
84
 
85
  if prompt := st.chat_input("Tulis pertanyaan Anda di sini..."):
 
86
  st.session_state.messages.append({"role": "user", "content": prompt})
87
  with st.chat_message("user"):
88
  st.markdown(prompt)
89
 
90
- response = predict_and_respond(prompt, model, df_faq)
 
 
91
 
 
92
  with st.chat_message("assistant"):
93
  st.markdown(response)
94
-
95
- st.session_state.messages.append({"role": "assistant", "content": response})
96
-
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import streamlit as st
2
  import pandas as pd
3
  import pickle
4
  import re
5
  import nltk
 
6
 
7
  # --- KONFIGURASI FILE ---
8
  MODEL_PATH = 'chatbot_model.pkl'
9
  FAQ_PATH = 'perpustakaan_faq.csv'
10
 
11
+ # Unduh resource NLTK (diperlukan untuk word_tokenize jika digunakan)
12
  try:
13
  nltk.data.find('tokenizers/punkt')
14
  except nltk.downloader.DownloadError:
15
  nltk.download('punkt')
16
 
17
+ # --- 1. Muat Model dan Data (Caching dengan Error Handling Kuat) ---
18
+
19
  @st.cache_resource
20
  def load_resources():
21
+ """Memuat model dan data FAQ sekali saja."""
22
+
23
+ model_pipeline = None
24
+ df_faq = None
25
+
26
+ # Coba muat Model
27
  try:
 
28
  with open(MODEL_PATH, 'rb') as file:
 
29
  model_pipeline = pickle.load(file)
30
+ st.success("✅ Model (PKL) berhasil dimuat.")
31
+ except FileNotFoundError:
32
+ st.error(f"FATAL ERROR: File '{MODEL_PATH}' tidak ditemukan. Pastikan file sudah diunggah.")
33
+ return None, None
34
+ except Exception as e:
35
+ st.error(f"FATAL ERROR: Gagal memuat Model. Kemungkinan masalah binary compatibility. Cek scikit-learn/numpy di requirements.txt. Error: {e}")
36
+ return None, None
37
 
38
+ # Coba muat Data
39
+ try:
40
  df_faq = pd.read_csv(FAQ_PATH)
41
+ st.success("✅ Data FAQ (CSV) berhasil dimuat.")
42
+ except FileNotFoundError:
43
+ st.error(f"FATAL ERROR: File '{FAQ_PATH}' tidak ditemukan. Pastikan file sudah diunggah.")
44
+ return None, None
 
45
  except Exception as e:
46
+ st.error(f"FATAL ERROR: Gagal memuat/membaca data CSV. Error: {e}")
47
+ return None, None
 
48
 
49
+ return model_pipeline, df_faq
50
+
51
+ # --- PANGGIL FUNGSI LOAD_RESOURCES DAN TANGANI KEGAGALAN ---
52
  model, df_faq = load_resources()
53
 
54
+ if model is None or df_faq is None:
55
+ st.error("Chatbot tidak dapat berjalan karena gagal memuat sumber daya. Mohon periksa log dan file yang hilang.")
56
+ st.stop() # Hentikan eksekusi Streamlit jika gagal memuat
57
+
58
  # --- 2. Fungsi Pembersihan Teks dan Logika Chatbot ---
59
+
60
  def clean_text(text):
61
  """Membersihkan teks (sesuai dengan yang digunakan saat pelatihan)."""
62
  text = re.sub(r'[^\w\s]', '', text)
 
64
 
65
  def predict_and_respond(query, model, df_faq):
66
  """Memprediksi Intent dan mengambil Jawaban yang sesuai."""
67
+
68
  cleaned_q = clean_text(query)
69
+
70
+ # Model memprediksi kategori/intent
71
  predicted_intent = model.predict([cleaned_q])[0]
72
+
73
+ # Ambil Jawaban
74
  responses = df_faq[df_faq['kategori'] == predicted_intent]['chatbot_response'].tolist()
75
 
76
  if responses:
77
  return responses[0]
78
  else:
79
+ # Peringatan jika intent terprediksi tapi tidak ada baris jawaban yang cocok (error data)
80
+ return f"Maaf, saya tidak dapat menemukan jawaban. (Intent terprediksi: {predicted_intent})."
81
 
82
  # --- 3. Antarmuka Streamlit ---
83
 
 
85
  st.title("📚 Asisten Virtual Perpustakaan")
86
  st.markdown("Halo! Tanyakan tentang **keanggotaan, peminjaman, atau fasilitas** kami.")
87
 
88
+
89
  if "messages" not in st.session_state:
90
  st.session_state.messages = []
91
 
 
94
  st.markdown(message["content"])
95
 
96
  if prompt := st.chat_input("Tulis pertanyaan Anda di sini..."):
97
+ # Tampilkan pertanyaan pengguna
98
  st.session_state.messages.append({"role": "user", "content": prompt})
99
  with st.chat_message("user"):
100
  st.markdown(prompt)
101
 
102
+ # Dapatkan respons chatbot
103
+ with st.spinner('Mencari jawaban...'):
104
+ response = predict_and_respond(prompt, model, df_faq)
105
 
106
+ # Tampilkan respons chatbot
107
  with st.chat_message("assistant"):
108
  st.markdown(response)
109
+
110
+ # Simpan respons ke riwayat
111
+ st.session_state.messages.append({"role": "assistant", "content": response})