Spaces:
Running
Running
Commit Bot Testing v.1
Browse files- Dockerfile +17 -0
- app.py +174 -0
- intents.json +360 -0
- label_encoder.pkl +3 -0
- model_config.pkl +3 -0
- requirements.txt +4 -0
- svm_model.pkl +3 -0
Dockerfile
ADDED
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Gunakan Python image
|
2 |
+
FROM python:3.10-slim
|
3 |
+
|
4 |
+
# Set working directory
|
5 |
+
WORKDIR /app
|
6 |
+
|
7 |
+
# Salin semua file ke container
|
8 |
+
COPY . .
|
9 |
+
|
10 |
+
# Install dependencies
|
11 |
+
RUN pip install --no-cache-dir -r requirements.txt
|
12 |
+
|
13 |
+
# Expose port yang digunakan Flask
|
14 |
+
EXPOSE 7860
|
15 |
+
|
16 |
+
# Jalankan aplikasi Flask
|
17 |
+
CMD ["python", "app.py"]
|
app.py
ADDED
@@ -0,0 +1,174 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import json
|
2 |
+
import random
|
3 |
+
import pickle
|
4 |
+
import numpy as np
|
5 |
+
import re
|
6 |
+
from flask import Flask, request, jsonify
|
7 |
+
from sentence_transformers import SentenceTransformer
|
8 |
+
from sklearn.metrics.pairwise import cosine_similarity
|
9 |
+
|
10 |
+
class ImprovedBPJSChatbot:
|
11 |
+
def __init__(self):
|
12 |
+
self.load_models()
|
13 |
+
self.load_intents()
|
14 |
+
|
15 |
+
def load_models(self):
|
16 |
+
"""Load semua model yang diperlukan"""
|
17 |
+
print("Memuat model dan konfigurasi...")
|
18 |
+
|
19 |
+
# Load konfigurasi
|
20 |
+
with open('model_config.pkl', 'rb') as f:
|
21 |
+
config = pickle.load(f)
|
22 |
+
|
23 |
+
# Load sentence transformer
|
24 |
+
self.st_model = SentenceTransformer(config['model_name'])
|
25 |
+
self.preprocessing_enabled = config['preprocessing_enabled']
|
26 |
+
|
27 |
+
# Load classifier
|
28 |
+
with open('svm_model.pkl', 'rb') as f:
|
29 |
+
self.clf = pickle.load(f)
|
30 |
+
|
31 |
+
# Load label encoder
|
32 |
+
with open('label_encoder.pkl', 'rb') as f:
|
33 |
+
self.label_encoder = pickle.load(f)
|
34 |
+
|
35 |
+
print("Semua model berhasil dimuat!")
|
36 |
+
|
37 |
+
def load_intents(self):
|
38 |
+
"""Load data intents untuk responses"""
|
39 |
+
with open('intents.json', 'r', encoding='utf-8') as f:
|
40 |
+
self.intents_data = json.load(f)
|
41 |
+
|
42 |
+
self.tag_responses = {intent['tag']: intent['responses'] for intent in self.intents_data['intents']}
|
43 |
+
|
44 |
+
# Buat embeddings untuk semua patterns (untuk similarity fallback)
|
45 |
+
self.pattern_embeddings = []
|
46 |
+
self.pattern_tags = []
|
47 |
+
|
48 |
+
for intent in self.intents_data['intents']:
|
49 |
+
for pattern in intent['patterns']:
|
50 |
+
processed_pattern = self.preprocess_text(pattern) if self.preprocessing_enabled else pattern
|
51 |
+
embedding = self.st_model.encode(processed_pattern)
|
52 |
+
self.pattern_embeddings.append(embedding)
|
53 |
+
self.pattern_tags.append(intent['tag'])
|
54 |
+
|
55 |
+
self.pattern_embeddings = np.array(self.pattern_embeddings)
|
56 |
+
|
57 |
+
def preprocess_text(self, text):
|
58 |
+
"""Preprocessing teks yang sama dengan training"""
|
59 |
+
text = text.lower()
|
60 |
+
|
61 |
+
# Normalisasi singkatan
|
62 |
+
text = re.sub(r'\bjkk\b', 'jaminan kecelakaan kerja', text)
|
63 |
+
text = re.sub(r'\bjkm\b', 'jaminan kematian', text)
|
64 |
+
text = re.sub(r'\bjht\b', 'jaminan hari tua', text)
|
65 |
+
text = re.sub(r'\bjp\b', 'jaminan pensiun', text)
|
66 |
+
text = re.sub(r'\bbpjs\b', 'bpjs ketenagakerjaan', text)
|
67 |
+
|
68 |
+
# Hapus karakter khusus
|
69 |
+
text = re.sub(r'[^\w\s]', ' ', text)
|
70 |
+
text = re.sub(r'\s+', ' ', text).strip()
|
71 |
+
|
72 |
+
return text
|
73 |
+
|
74 |
+
def get_prediction_confidence(self, msg_embedding):
|
75 |
+
"""Dapatkan prediksi dengan confidence score"""
|
76 |
+
# Prediksi probabilitas
|
77 |
+
probabilities = self.clf.predict_proba(msg_embedding)[0]
|
78 |
+
max_prob = np.max(probabilities)
|
79 |
+
predicted_class = np.argmax(probabilities)
|
80 |
+
predicted_tag = self.label_encoder.inverse_transform([predicted_class])[0]
|
81 |
+
|
82 |
+
return predicted_tag, max_prob
|
83 |
+
|
84 |
+
def similarity_fallback(self, msg_embedding, threshold=0.7):
|
85 |
+
"""Fallback menggunakan cosine similarity"""
|
86 |
+
similarities = cosine_similarity(msg_embedding, self.pattern_embeddings)[0]
|
87 |
+
max_similarity_idx = np.argmax(similarities)
|
88 |
+
max_similarity = similarities[max_similarity_idx]
|
89 |
+
|
90 |
+
if max_similarity >= threshold:
|
91 |
+
return self.pattern_tags[max_similarity_idx], max_similarity
|
92 |
+
|
93 |
+
return 'fallback', max_similarity
|
94 |
+
|
95 |
+
def get_contextual_response(self, tag, user_message):
|
96 |
+
"""Pilih response yang paling kontekstual"""
|
97 |
+
responses = self.tag_responses.get(tag, self.tag_responses['fallback'])
|
98 |
+
|
99 |
+
# Jika hanya ada satu response, return langsung
|
100 |
+
if len(responses) == 1:
|
101 |
+
return responses[0]
|
102 |
+
|
103 |
+
# Pilih response berdasarkan kata kunci dalam pesan user
|
104 |
+
user_words = set(user_message.lower().split())
|
105 |
+
|
106 |
+
best_response = responses[0]
|
107 |
+
best_score = 0
|
108 |
+
|
109 |
+
for response in responses:
|
110 |
+
response_words = set(response.lower().split())
|
111 |
+
# Hitung kesamaan kata
|
112 |
+
common_words = user_words.intersection(response_words)
|
113 |
+
score = len(common_words)
|
114 |
+
|
115 |
+
if score > best_score:
|
116 |
+
best_score = score
|
117 |
+
best_response = response
|
118 |
+
|
119 |
+
# Jika tidak ada yang cocok, pilih random
|
120 |
+
if best_score == 0:
|
121 |
+
return random.choice(responses)
|
122 |
+
|
123 |
+
return best_response
|
124 |
+
|
125 |
+
def generate_response(self, message):
|
126 |
+
"""Generate response dengan multiple strategies"""
|
127 |
+
if not message.strip():
|
128 |
+
return "Tolong kirim sebuah pesan."
|
129 |
+
|
130 |
+
# Preprocessing
|
131 |
+
processed_msg = self.preprocess_text(message) if self.preprocessing_enabled else message
|
132 |
+
msg_embedding = self.st_model.encode(processed_msg).reshape(1, -1)
|
133 |
+
|
134 |
+
# Strategy 1: SVM prediction dengan confidence
|
135 |
+
predicted_tag, confidence = self.get_prediction_confidence(msg_embedding)
|
136 |
+
|
137 |
+
# Strategy 2: Similarity fallback jika confidence rendah
|
138 |
+
if confidence < 0.6: # Threshold bisa di-adjust
|
139 |
+
fallback_tag, similarity = self.similarity_fallback(msg_embedding)
|
140 |
+
if similarity > confidence:
|
141 |
+
predicted_tag = fallback_tag
|
142 |
+
|
143 |
+
# Strategy 3: Contextual response selection
|
144 |
+
response = self.get_contextual_response(predicted_tag, message)
|
145 |
+
|
146 |
+
# Logging untuk debugging
|
147 |
+
print(f"Input: {message}")
|
148 |
+
print(f"Processed: {processed_msg}")
|
149 |
+
print(f"Predicted tag: {predicted_tag} (confidence: {confidence:.3f})")
|
150 |
+
|
151 |
+
return response
|
152 |
+
|
153 |
+
# Inisialisasi chatbot
|
154 |
+
chatbot = ImprovedBPJSChatbot()
|
155 |
+
|
156 |
+
# Flask app
|
157 |
+
app = Flask(__name__)
|
158 |
+
|
159 |
+
@app.route('/chat', methods=['POST'])
|
160 |
+
def chat():
|
161 |
+
try:
|
162 |
+
msg = request.json.get("message", "").strip()
|
163 |
+
response = chatbot.generate_response(msg)
|
164 |
+
return jsonify({"reply": response})
|
165 |
+
except Exception as e:
|
166 |
+
print(f"Error: {e}")
|
167 |
+
return jsonify({"reply": "Maaf, terjadi kesalahan sistem. Silakan coba lagi."})
|
168 |
+
|
169 |
+
@app.route('/health', methods=['GET'])
|
170 |
+
def health():
|
171 |
+
return jsonify({"status": "healthy", "model": "BPJS Chatbot Improved"})
|
172 |
+
|
173 |
+
if __name__ == '__main__':
|
174 |
+
app.run(port=7860, debug=False) #ganti dari 5000 ke 7860
|
intents.json
ADDED
@@ -0,0 +1,360 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"intents": [
|
3 |
+
{
|
4 |
+
"tag": "greeting",
|
5 |
+
"patterns": [
|
6 |
+
"Halo",
|
7 |
+
"Hai",
|
8 |
+
"Pagi",
|
9 |
+
"Siang",
|
10 |
+
"Malam",
|
11 |
+
"Assalamualaikum",
|
12 |
+
"Permisi",
|
13 |
+
"Selamat pagi",
|
14 |
+
"Selamat siang",
|
15 |
+
"Selamat malam",
|
16 |
+
"Hi",
|
17 |
+
"Hello",
|
18 |
+
"Salam",
|
19 |
+
"Met pagi",
|
20 |
+
"Met siang",
|
21 |
+
"Hallo"
|
22 |
+
],
|
23 |
+
"responses": [
|
24 |
+
"Halo! Saya Asisten Virtual BPJS Ketenagakerjaan. Ada yang bisa saya bantu?",
|
25 |
+
"Selamat datang. Silakan tanyakan informasi seputar program BPJS Ketenagakerjaan yang Anda butuhkan.",
|
26 |
+
"Hai! Senang bisa membantu Anda. Apa yang ingin Anda ketahui hari ini?",
|
27 |
+
"Assalamualaikum! Saya siap membantu menjawab pertanyaan tentang layanan BPJS Ketenagakerjaan."
|
28 |
+
]
|
29 |
+
},
|
30 |
+
{
|
31 |
+
"tag": "about",
|
32 |
+
"patterns": [
|
33 |
+
"Kamu siapa?",
|
34 |
+
"Ini bot ya?",
|
35 |
+
"Kamu bisa apa saja?",
|
36 |
+
"Apa fungsi kamu?",
|
37 |
+
"bantuan",
|
38 |
+
"help",
|
39 |
+
"menu",
|
40 |
+
"Apa yang bisa kamu lakukan?",
|
41 |
+
"Fitur apa saja yang ada?",
|
42 |
+
"Kamu asisten apa?",
|
43 |
+
"Siapa yang buat kamu?",
|
44 |
+
"Aplikasi apa ini?"
|
45 |
+
],
|
46 |
+
"responses": [
|
47 |
+
"Saya adalah asisten virtual yang siap membantu menjawab pertanyaan seputar manfaat program Jaminan Kecelakaan Kerja (JKK), Jaminan Kematian (JKM), Jaminan Hari Tua (JHT), dan Jaminan Pensiun (JP).",
|
48 |
+
"Saya adalah chatbot yang dirancang untuk memberikan informasi tentang layanan BPJS Ketenagakerjaan berdasarkan brosur yang tersedia. Anda bisa bertanya tentang manfaat program, iuran, atau cara pendaftaran.",
|
49 |
+
"Saya bisa membantu Anda dengan informasi lengkap tentang 4 program BPJS Ketenagakerjaan, cara pendaftaran, pembayaran iuran, dan proses klaim manfaat."
|
50 |
+
]
|
51 |
+
},
|
52 |
+
{
|
53 |
+
"tag": "manfaat_umum",
|
54 |
+
"patterns": [
|
55 |
+
"Apa saja manfaat BPJS Ketenagakerjaan?",
|
56 |
+
"Programnya apa saja?",
|
57 |
+
"Keuntungan ikut BPJS Ketenagakerjaan apa?",
|
58 |
+
"Dapat apa saja kalau jadi peserta?",
|
59 |
+
"Jelaskan program yang ada",
|
60 |
+
"BPJS Ketenagakerjaan itu apa?",
|
61 |
+
"Fasilitas apa saja yang didapat?",
|
62 |
+
"Benefit apa yang diterima?",
|
63 |
+
"Program perlindungan apa saja?",
|
64 |
+
"Asuransi apa saja yang ada?",
|
65 |
+
"Jaminan apa saja yang diberikan?",
|
66 |
+
"Layanan BPJS Ketenagakerjaan"
|
67 |
+
],
|
68 |
+
"responses": [
|
69 |
+
"BPJS Ketenagakerjaan memiliki 4 program perlindungan utama: Jaminan Kecelakaan Kerja (JKK), Jaminan Kematian (JKM), Jaminan Hari Tua (JHT), dan Jaminan Pensiun (JP). Masing-masing punya manfaatnya sendiri.",
|
70 |
+
"Anda akan mendapatkan perlindungan dari risiko kerja melalui JKK, santunan bagi keluarga jika meninggal lewat JKM, tabungan untuk hari tua melalui JHT, dan penghasilan bulanan saat pensiun lewat JP.",
|
71 |
+
"Program BPJS Ketenagakerjaan memberikan perlindungan menyeluruh mulai dari risiko kecelakaan kerja, jaminan kematian, tabungan hari tua, hingga jaminan pensiun untuk masa depan yang lebih aman."
|
72 |
+
]
|
73 |
+
},
|
74 |
+
{
|
75 |
+
"tag": "manfaat_jkk",
|
76 |
+
"patterns": [
|
77 |
+
"Manfaat Jaminan Kecelakaan Kerja apa?",
|
78 |
+
"Kalau kecelakaan kerja dapat apa?",
|
79 |
+
"Info JKK",
|
80 |
+
"Apa itu JKK?",
|
81 |
+
"Klaim kecelakaan kerja",
|
82 |
+
"JKK memberikan apa saja?",
|
83 |
+
"Jaminan Kecelakaan Kerja",
|
84 |
+
"Kecelakaan kerja ditanggung?",
|
85 |
+
"Biaya pengobatan kecelakaan kerja",
|
86 |
+
"Santunan kecelakaan kerja",
|
87 |
+
"Perlindungan kecelakaan kerja",
|
88 |
+
"Asuransi kecelakaan kerja",
|
89 |
+
"Manfaat JKK apa saja?",
|
90 |
+
"Fasilitas JKK",
|
91 |
+
"Beasiswa JKK"
|
92 |
+
],
|
93 |
+
"responses": [
|
94 |
+
"Manfaat JKK meliputi biaya pengobatan dan perawatan tanpa batas sesuai kebutuhan medis, santunan uang tunai jika tidak mampu bekerja, hingga beasiswa untuk 2 orang anak jika peserta meninggal atau cacat total tetap akibat kecelakaan kerja.",
|
95 |
+
"Program JKK memberikan perlindungan atas risiko kecelakaan kerja, mulai dari perjalanan ke tempat kerja, saat bekerja, hingga perjalanan pulang. Ini juga mencakup penyakit yang disebabkan oleh lingkungan kerja.",
|
96 |
+
"JKK menjamin biaya perawatan medis tanpa batas, santunan harian selama tidak dapat bekerja, santunan cacat, santunan kematian, dan beasiswa pendidikan untuk anak jika terjadi risiko fatal."
|
97 |
+
]
|
98 |
+
},
|
99 |
+
{
|
100 |
+
"tag": "manfaat_jkm",
|
101 |
+
"patterns": [
|
102 |
+
"Manfaat Jaminan Kematian apa?",
|
103 |
+
"Kalau peserta meninggal dapat apa?",
|
104 |
+
"Info JKM",
|
105 |
+
"Santunan kematian berapa?",
|
106 |
+
"Apa itu JKM?",
|
107 |
+
"JKM memberikan apa?",
|
108 |
+
"Jaminan Kematian",
|
109 |
+
"Santunan ahli waris",
|
110 |
+
"Uang duka",
|
111 |
+
"Biaya pemakaman",
|
112 |
+
"Manfaat JKM",
|
113 |
+
"Klaim kematian",
|
114 |
+
"Santunan berkala JKM",
|
115 |
+
"Beasiswa JKM"
|
116 |
+
],
|
117 |
+
"responses": [
|
118 |
+
"Jika peserta meninggal bukan karena kecelakaan kerja, ahli waris akan menerima santunan total Rp42.000.000, yang terdiri dari santunan kematian Rp20 juta, santunan berkala Rp12 juta, dan biaya pemakaman Rp10 juta.",
|
119 |
+
"Selain santunan tunai, ada juga manfaat beasiswa pendidikan untuk 2 orang anak (dari TK hingga Perguruan Tinggi) jika peserta telah memiliki masa iur minimal 3 tahun.",
|
120 |
+
"JKM memberikan perlindungan finansial kepada keluarga yang ditinggalkan dengan total santunan Rp42 juta plus manfaat beasiswa untuk anak-anak peserta."
|
121 |
+
]
|
122 |
+
},
|
123 |
+
{
|
124 |
+
"tag": "manfaat_jht",
|
125 |
+
"patterns": [
|
126 |
+
"Manfaat Jaminan Hari Tua apa?",
|
127 |
+
"Apa itu JHT?",
|
128 |
+
"Kapan JHT bisa dicairkan?",
|
129 |
+
"Apakah bisa ambil JHT sebagian?",
|
130 |
+
"Cara klaim JHT",
|
131 |
+
"JHT memberikan apa?",
|
132 |
+
"Jaminan Hari Tua",
|
133 |
+
"Tabungan hari tua",
|
134 |
+
"Pencairan JHT",
|
135 |
+
"Klaim JHT",
|
136 |
+
"JHT bisa diambil kapan?",
|
137 |
+
"Syarat ambil JHT",
|
138 |
+
"JHT sebagian",
|
139 |
+
"Manfaat JHT",
|
140 |
+
"Dana pensiun JHT"
|
141 |
+
],
|
142 |
+
"responses": [
|
143 |
+
"JHT adalah manfaat uang tunai yang besarnya merupakan akumulasi seluruh iuran yang telah dibayarkan beserta hasil pengembangannya. Manfaat ini dapat diambil sekaligus saat peserta mencapai usia 56 tahun, berhenti kerja, cacat total tetap, atau meninggal dunia.",
|
144 |
+
"Ya, Anda bisa mengambil sebagian manfaat JHT jika kepesertaan sudah mencapai minimal 10 tahun. Pengambilan maksimal 30% untuk kepemilikan rumah, atau maksimal 10% untuk keperluan lainnya.",
|
145 |
+
"JHT adalah tabungan masa depan yang terdiri dari iuran Anda dan perusahaan plus hasil pengembangan investasi. Bisa diambil penuh saat pensiun atau sebagian untuk kebutuhan tertentu."
|
146 |
+
]
|
147 |
+
},
|
148 |
+
{
|
149 |
+
"tag": "manfaat_jp",
|
150 |
+
"patterns": [
|
151 |
+
"Manfaat Jaminan Pensiun apa?",
|
152 |
+
"Apa itu JP?",
|
153 |
+
"Bagaimana sistem Jaminan Pensiun?",
|
154 |
+
"Info JP",
|
155 |
+
"JP memberikan apa?",
|
156 |
+
"Jaminan Pensiun",
|
157 |
+
"Pensiun BPJS",
|
158 |
+
"Uang pensiun bulanan",
|
159 |
+
"Manfaat JP",
|
160 |
+
"Klaim JP",
|
161 |
+
"Syarat pensiun",
|
162 |
+
"Usia pensiun BPJS",
|
163 |
+
"Pensiun seumur hidup"
|
164 |
+
],
|
165 |
+
"responses": [
|
166 |
+
"Jaminan Pensiun (JP) adalah manfaat uang tunai yang dibayarkan setiap bulan kepada peserta saat memasuki usia pensiun, mengalami cacat total tetap, atau kepada ahli warisnya (janda/duda/anak) jika peserta meninggal dunia.",
|
167 |
+
"Manfaat JP diterima seumur hidup bagi peserta. Jika peserta meninggal, manfaatnya dapat diteruskan kepada janda/duda hingga meninggal atau menikah lagi, atau kepada anak hingga usia 23 tahun.",
|
168 |
+
"JP memberikan penghasilan bulanan tetap saat Anda pensiun di usia 56 tahun, sehingga Anda tetap memiliki pendapatan untuk memenuhi kebutuhan sehari-hari."
|
169 |
+
]
|
170 |
+
},
|
171 |
+
{
|
172 |
+
"tag": "beasiswa",
|
173 |
+
"patterns": [
|
174 |
+
"Bagaimana cara dapat beasiswa?",
|
175 |
+
"Info beasiswa anak",
|
176 |
+
"Berapa besar beasiswa BPJS?",
|
177 |
+
"Syarat beasiswa apa saja?",
|
178 |
+
"Beasiswa BPJS Ketenagakerjaan",
|
179 |
+
"Klaim beasiswa",
|
180 |
+
"Beasiswa untuk anak peserta",
|
181 |
+
"Manfaat beasiswa",
|
182 |
+
"Prosedur beasiswa",
|
183 |
+
"Nominal beasiswa",
|
184 |
+
"Beasiswa TK SD SMP SMA",
|
185 |
+
"Beasiswa kuliah BPJS"
|
186 |
+
],
|
187 |
+
"responses": [
|
188 |
+
"Beasiswa diberikan untuk maksimal 2 anak peserta. Syaratnya adalah jika peserta meninggal dunia atau cacat total tetap akibat kecelakaan kerja, atau jika peserta meninggal dunia bukan akibat kecelakaan kerja dan telah memiliki masa iur minimal 3 tahun.",
|
189 |
+
"Besaran beasiswa berbeda tiap jenjang: TK/SD Rp1,5 juta/tahun, SMP Rp2 juta/tahun, SMA Rp3 juta/tahun, dan Perguruan Tinggi (S1) Rp12 juta/tahun. Pengajuan klaim dilakukan setiap tahun.",
|
190 |
+
"Beasiswa BPJS Ketenagakerjaan memastikan pendidikan anak-anak peserta tetap terjamin dari TK hingga perguruan tinggi dengan bantuan finansial yang disesuaikan dengan jenjang pendidikan."
|
191 |
+
]
|
192 |
+
},
|
193 |
+
{
|
194 |
+
"tag": "iuran",
|
195 |
+
"patterns": [
|
196 |
+
"Berapa iurannya?",
|
197 |
+
"Bagaimana cara hitung iuran?",
|
198 |
+
"Bayar BPJS Ketenagakerjaan berapa sebulan?",
|
199 |
+
"Siapa yang bayar iuran?",
|
200 |
+
"Iuran BPJS Ketenagakerjaan",
|
201 |
+
"Tarif iuran",
|
202 |
+
"Biaya iuran",
|
203 |
+
"Perhitungan iuran",
|
204 |
+
"Iuran JKK JKM JHT JP",
|
205 |
+
"Berapa persen iuran?",
|
206 |
+
"Pembagian iuran perusahaan karyawan",
|
207 |
+
"Iuran bulanan BPJS"
|
208 |
+
],
|
209 |
+
"responses": [
|
210 |
+
"Besaran iuran dihitung berdasarkan persentase dari upah Anda. Contohnya, untuk Jaminan Kematian (JKM) iurannya 0.3% dari upah yang ditanggung perusahaan. Untuk Jaminan Hari Tua (JHT), iurannya 5.7% dari upah, dimana 2% ditanggung oleh Anda dan 3.7% oleh perusahaan.",
|
211 |
+
"Iuran untuk setiap program (JKK, JKM, JHT, JP) memiliki persentase yang berbeda dan pembagian tanggungan antara perusahaan dan tenaga kerja. Untuk detail lengkapnya bisa dilihat pada tabel iuran di brosur kami.",
|
212 |
+
"Iuran BPJS Ketenagakerjaan sangat terjangkau karena ditanggung bersama antara perusahaan dan pekerja. Total iuran sekitar 6-7% dari gaji dengan pembagian yang sebagian besar ditanggung perusahaan."
|
213 |
+
]
|
214 |
+
},
|
215 |
+
{
|
216 |
+
"tag": "pendaftaran_pembayaran",
|
217 |
+
"patterns": [
|
218 |
+
"Bagaimana cara daftar?",
|
219 |
+
"Di mana bisa daftar BPJS Ketenagakerjaan?",
|
220 |
+
"Cara bayar iuran bagaimana?",
|
221 |
+
"Bisa bayar lewat apa saja?",
|
222 |
+
"Pendaftaran BPJS Ketenagakerjaan",
|
223 |
+
"Registrasi BPJS",
|
224 |
+
"Cara mendaftar",
|
225 |
+
"Proses pendaftaran",
|
226 |
+
"Daftar online BPJS",
|
227 |
+
"Pembayaran iuran",
|
228 |
+
"Kanal bayar",
|
229 |
+
"Bayar via bank",
|
230 |
+
"Bayar via e-wallet",
|
231 |
+
"Bayar di minimarket"
|
232 |
+
],
|
233 |
+
"responses": [
|
234 |
+
"Pendaftaran dapat dilakukan secara online melalui website `pom.bpjsketenagakerjaan.go.id/pu`, melalui sistem Online Single Submission (OSS), atau datang langsung ke Kantor Cabang terdekat.",
|
235 |
+
"Pembayaran iuran sangat mudah. Tersedia banyak pilihan kanal bayar seperti BNI, BRI, BCA mobile, Mandiri Livin', LinkAja, GoPay, OVO, Dana, Indomaret, Alfamart, dan Kantor Pos.",
|
236 |
+
"Proses pendaftaran sangat mudah dan bisa dilakukan online. Setelah terdaftar, Anda bisa bayar iuran melalui berbagai channel digital maupun offline sesuai kemudahan Anda."
|
237 |
+
]
|
238 |
+
},
|
239 |
+
{
|
240 |
+
"tag": "syarat_dokumen",
|
241 |
+
"patterns": [
|
242 |
+
"Syarat daftar apa saja?",
|
243 |
+
"Dokumen apa yang diperlukan?",
|
244 |
+
"Persyaratan pendaftaran",
|
245 |
+
"KTP perlu tidak?",
|
246 |
+
"Dokumen untuk daftar BPJS",
|
247 |
+
"Berkas pendaftaran",
|
248 |
+
"Syarat administrasi"
|
249 |
+
],
|
250 |
+
"responses": [
|
251 |
+
"Untuk pendaftaran BPJS Ketenagakerjaan, Anda memerlukan KTP yang masih berlaku, NPWP (jika ada), dan data perusahaan tempat Anda bekerja.",
|
252 |
+
"Dokumen yang diperlukan umumnya KTP, foto, dan formulir pendaftaran. Untuk pekerja, biasanya perusahaan yang mengurus pendaftaran dengan melengkapi data kepegawaian."
|
253 |
+
]
|
254 |
+
},
|
255 |
+
{
|
256 |
+
"tag": "klaim_prosedur",
|
257 |
+
"patterns": [
|
258 |
+
"Bagaimana cara klaim?",
|
259 |
+
"Prosedur klaim manfaat",
|
260 |
+
"Cara mengajukan klaim",
|
261 |
+
"Langkah-langkah klaim",
|
262 |
+
"Proses klaim BPJS",
|
263 |
+
"Dokumen klaim",
|
264 |
+
"Syarat klaim",
|
265 |
+
"Klaim di mana?"
|
266 |
+
],
|
267 |
+
"responses": [
|
268 |
+
"Untuk mengajukan klaim, Anda perlu datang ke kantor BPJS Ketenagakerjaan terdekat dengan membawa dokumen yang diperlukan sesuai jenis klaim (JKK, JKM, JHT, atau JP).",
|
269 |
+
"Proses klaim dimulai dengan mengisi formulir klaim, melengkapi dokumen pendukung, lalu menyerahkan ke petugas BPJS. Tim kami akan memverifikasi dan memproses klaim Anda.",
|
270 |
+
"Setiap jenis klaim memiliki prosedur dan dokumen yang berbeda. Anda bisa datang langsung ke kantor cabang atau hubungi call center 175 untuk panduan lengkap."
|
271 |
+
]
|
272 |
+
},
|
273 |
+
{
|
274 |
+
"tag": "kontak_lokasi",
|
275 |
+
"patterns": [
|
276 |
+
"Kantor BPJS di mana?",
|
277 |
+
"Alamat kantor cabang",
|
278 |
+
"Kontak BPJS Ketenagakerjaan",
|
279 |
+
"Nomor telepon BPJS",
|
280 |
+
"Call center BPJS",
|
281 |
+
"Lokasi kantor terdekat",
|
282 |
+
"Jam operasional",
|
283 |
+
"Customer service"
|
284 |
+
],
|
285 |
+
"responses": [
|
286 |
+
"Anda bisa menghubungi call center BPJS Ketenagakerjaan di nomor 175 atau mencari kantor cabang terdekat melalui website resmi kami.",
|
287 |
+
"Untuk informasi lokasi kantor cabang dan jam operasional, silakan kunjungi website bpjsketenagakerjaan.go.id atau hubungi 175.",
|
288 |
+
"Call center 175 siap melayani 24 jam untuk informasi umum. Untuk layanan langsung, silakan kunjungi kantor cabang di jam kerja."
|
289 |
+
]
|
290 |
+
},
|
291 |
+
{
|
292 |
+
"tag": "peserta_mandiri",
|
293 |
+
"patterns": [
|
294 |
+
"Bisa daftar sendiri tidak?",
|
295 |
+
"Pekerja mandiri bisa ikut?",
|
296 |
+
"Freelancer bisa daftar?",
|
297 |
+
"Non-pekerja bisa ikut?",
|
298 |
+
"Daftar tanpa perusahaan",
|
299 |
+
"Peserta mandiri",
|
300 |
+
"Pekerja lepas"
|
301 |
+
],
|
302 |
+
"responses": [
|
303 |
+
"Ya, pekerja mandiri, freelancer, dan pekerja informal bisa mendaftar BPJS Ketenagakerjaan secara mandiri dengan membayar iuran sendiri.",
|
304 |
+
"Program BPJS Ketenagakerjaan terbuka untuk semua pekerja, baik yang bekerja di perusahaan maupun pekerja mandiri. Anda bisa mendaftar langsung sebagai peserta mandiri."
|
305 |
+
]
|
306 |
+
},
|
307 |
+
{
|
308 |
+
"tag": "thanks",
|
309 |
+
"patterns": [
|
310 |
+
"Terima kasih",
|
311 |
+
"Makasih",
|
312 |
+
"Terimakasih infonya",
|
313 |
+
"Sangat membantu, terima kasih",
|
314 |
+
"Oke, makasih ya",
|
315 |
+
"Thank you",
|
316 |
+
"Thanks",
|
317 |
+
"Terima kasih banyak",
|
318 |
+
"Makasih banyak",
|
319 |
+
"Sangat membantu"
|
320 |
+
],
|
321 |
+
"responses": [
|
322 |
+
"Sama-sama! Senang bisa membantu Anda.",
|
323 |
+
"Dengan senang hati! Jika ada pertanyaan lain, jangan ragu untuk bertanya kembali.",
|
324 |
+
"Tentu. Semoga informasinya bermanfaat.",
|
325 |
+
"Terima kasih kembali. Saya siap membantu kapan saja Anda membutuhkan informasi BPJS Ketenagakerjaan."
|
326 |
+
]
|
327 |
+
},
|
328 |
+
{
|
329 |
+
"tag": "goodbye",
|
330 |
+
"patterns": [
|
331 |
+
"Sudah dulu ya",
|
332 |
+
"Oke sampai jumpa",
|
333 |
+
"Bye",
|
334 |
+
"Itu saja",
|
335 |
+
"Cukup",
|
336 |
+
"Selesai",
|
337 |
+
"Sampai jumpa",
|
338 |
+
"Dadah",
|
339 |
+
"See you",
|
340 |
+
"Terima kasih sudah membantu"
|
341 |
+
],
|
342 |
+
"responses": [
|
343 |
+
"Baik, sampai jumpa lagi!",
|
344 |
+
"Tentu. Selamat beraktivitas kembali!",
|
345 |
+
"Baik, jika butuh bantuan lagi di kemudian hari, hubungi saya kembali ya.",
|
346 |
+
"Sampai jumpa! Semoga informasi yang saya berikan bermanfaat untuk Anda."
|
347 |
+
]
|
348 |
+
},
|
349 |
+
{
|
350 |
+
"tag": "fallback",
|
351 |
+
"patterns": [],
|
352 |
+
"responses": [
|
353 |
+
"Maaf, saya kurang mengerti pertanyaan Anda. Bisa coba gunakan kalimat lain yang lebih spesifik terkait program JKK, JKM, JHT, atau JP?",
|
354 |
+
"Hmm, sepertinya pertanyaan Anda di luar topik yang saya kuasai. Saya bisa bantu jawab seputar manfaat, iuran, dan cara daftar BPJS Ketenagakerjaan.",
|
355 |
+
"Maaf, saya tidak dapat memproses permintaan itu. Coba tanyakan hal lain terkait layanan kami, misalnya 'manfaat jaminan kematian'.",
|
356 |
+
"Sepertinya saya belum memahami maksud Anda. Silakan tanya tentang program BPJS Ketenagakerjaan seperti JKK, JKM, JHT, JP, atau cara pendaftaran."
|
357 |
+
]
|
358 |
+
}
|
359 |
+
]
|
360 |
+
}
|
label_encoder.pkl
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:f0072c4705da2a7800479cb9b79253ff04e24b0d21353b7d0737ce9117d64eb8
|
3 |
+
size 1647
|
model_config.pkl
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:5e77c74ddd47974f81f1d0dfa23d68c8373fef83011ac099a257de3a7217d437
|
3 |
+
size 116
|
requirements.txt
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
flask
|
2 |
+
scikit-learn
|
3 |
+
sentence-transformers
|
4 |
+
numpy
|
svm_model.pkl
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:67c1e598d3799e8983dff0901b81edc92cc57ebac03f19058814a490f3e33547
|
3 |
+
size 2249777
|