tututz commited on
Commit
c318db1
·
verified ·
1 Parent(s): 4f9a634

Update recommendation_builder.py

Browse files
Files changed (1) hide show
  1. recommendation_builder.py +83 -9
recommendation_builder.py CHANGED
@@ -1,8 +1,8 @@
1
  # ======================================================================
2
- # --- recommendation_builder.py ---
3
  # ======================================================================
4
  import random
5
- from typing import List, Dict
6
 
7
  # --- SENTIMENT CONFIG ---
8
  SENTIMENT_MAP = {
@@ -15,15 +15,16 @@ SENTIMENT_MAP = {
15
  "Total_SKS_Gagal": {"rendah": 1, "tinggi": -1},
16
  }
17
 
18
- # --- KLAUSA TEKS (UNTUK DIJAHIT) ---
19
- CLAUSES = {
 
20
  "IPS_Terakhir": {
21
  "rendah": "capaian IPS semester terakhir yang berada di bawah standar",
22
- "tinggi": "capaian IPS semester terakhir yang sangat memuaskan",
23
  },
24
  "IPK_Terakhir": {
25
  "rendah": "nilai IPK kumulatif yang masih relatif rendah",
26
- "tinggi": "rekam IPK kumulatif yang solid dan stabil",
27
  },
28
  "Jumlah_MK_Gagal": {
29
  "rendah": "rekam jejak mata kuliah yang bersih dari kegagalan",
@@ -112,8 +113,77 @@ REKOMENDASI_BANK = {
112
  )
113
  }
114
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
115
 
116
- def generate_recommendation_paragraph(prediction_val: str, structured_rules: List[Dict]) -> str:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
117
  """
118
  Menghasilkan rekomendasi personal: Template Statis + Jahitan Dinamis
119
  """
@@ -138,10 +208,14 @@ def generate_recommendation_paragraph(prediction_val: str, structured_rules: Lis
138
  features_seen.add(feature)
139
 
140
  condition = rule["condition"]
141
- text = CLAUSES.get(feature, {}).get(condition)
 
 
 
 
142
  sentiment = SENTIMENT_MAP.get(feature, {}).get(condition, 0)
143
 
144
- if text:
145
  active_clauses.append({"text": text, "sentiment": sentiment})
146
 
147
  if not active_clauses:
 
1
  # ======================================================================
2
+ # --- recommendation_builder.py (LOGIKA DIPERBAIKI) ---
3
  # ======================================================================
4
  import random
5
+ from typing import List, Dict, Any
6
 
7
  # --- SENTIMENT CONFIG ---
8
  SENTIMENT_MAP = {
 
15
  "Total_SKS_Gagal": {"rendah": 1, "tinggi": -1},
16
  }
17
 
18
+ # --- KLAUSA TEKS (FALLBACK) ---
19
+ # Ini digunakan jika tidak ada 'Sanity Check' khusus
20
+ CLAUSES_FALLBACK = {
21
  "IPS_Terakhir": {
22
  "rendah": "capaian IPS semester terakhir yang berada di bawah standar",
23
+ "tinggi": "capaian IPS semester terakhir yang cukup baik", # Dibuat netral
24
  },
25
  "IPK_Terakhir": {
26
  "rendah": "nilai IPK kumulatif yang masih relatif rendah",
27
+ "tinggi": "rekam IPK kumulatif yang solid",
28
  },
29
  "Jumlah_MK_Gagal": {
30
  "rendah": "rekam jejak mata kuliah yang bersih dari kegagalan",
 
113
  )
114
  }
115
 
116
+ # --- [FUNGSI BARU] LOGIC SANITY CHECK ---
117
+ def _get_dynamic_clause(feature: str, condition: str, value: float) -> str:
118
+ """
119
+ Logika Cerdas: Menyesuaikan kata sifat berdasarkan NILAI ASLI,
120
+ bukan hanya label 'tinggi/rendah' dari decision tree.
121
+ """
122
+
123
+ # --- LOGIKA OVERRIDE (SANITY CHECK) ---
124
+
125
+ # 1. IPS Terakhir (Skala 0-4)
126
+ if feature == "IPS_Terakhir":
127
+ if condition == "tinggi": # DT bilang "tinggi"
128
+ if value < 2.5:
129
+ return "capaian IPS semester terakhir yang sedikit membaik namun masih rawan"
130
+ elif value < 3.0:
131
+ # Ini akan menangkap 2.62
132
+ return "capaian IPS semester terakhir yang cukup aman"
133
+ else:
134
+ return "capaian IPS semester terakhir yang sangat memuaskan"
135
+ else: # DT bilang "rendah"
136
+ return "capaian IPS semester terakhir yang berada di bawah standar"
137
 
138
+ # 2. IPK Terakhir (Skala 0-4)
139
+ elif feature == "IPK_Terakhir":
140
+ if condition == "tinggi": # DT bilang "tinggi"
141
+ if value < 2.5:
142
+ # Ini akan menangkap 2.15
143
+ return "IPK kumulatif yang baru saja lolos ambang batas kritis"
144
+ elif value < 3.0:
145
+ return "IPK kumulatif yang tergolong cukup baik"
146
+ else:
147
+ return "IPK kumulatif yang sangat solid"
148
+ else: # DT bilang "rendah"
149
+ if value < 2.0:
150
+ return "IPK kumulatif yang berada di zona bahaya (Nasakom)"
151
+ else:
152
+ return "IPK kumulatif yang masih relatif rendah"
153
+
154
+ # 3. MK Gagal
155
+ elif feature == "Jumlah_MK_Gagal":
156
+ if condition == "rendah": # Rendah failure itu bagus
157
+ if value == 0:
158
+ return "rekam jejak mata kuliah yang bersih tanpa kegagalan"
159
+ else:
160
+ return f"jumlah mata kuliah gagal yang masih dalam batas wajar ({int(value)} MK)"
161
+ else: # DT bilang "tinggi"
162
+ if value < 3:
163
+ return f"adanya {int(value)} mata kuliah gagal yang perlu segera diulang"
164
+ else:
165
+ return f"adanya beban {int(value)} mata kuliah gagal yang menumpuk"
166
+
167
+ # 4. Tren
168
+ elif feature == "Tren_IPS_Slope":
169
+ if condition == "tinggi":
170
+ if value < 0.1: # Jika naiknya sedikit
171
+ return "tren performa yang sedikit membaik"
172
+ else:
173
+ return "tren peningkatan nilai yang konsisten"
174
+ else:
175
+ return "tren performa yang menurun belakangan ini"
176
+
177
+ # Jika tidak ada aturan khusus, gunakan Fallback
178
+ fallback = CLAUSES_FALLBACK.get(feature, {}).get(condition)
179
+ if fallback:
180
+ return fallback
181
+
182
+ # Jika tidak ada fallback, return string kosong
183
+ return ""
184
+
185
+
186
+ def generate_recommendation_paragraph(prediction_val: str, structured_rules: List[Dict[str, Any]]) -> str:
187
  """
188
  Menghasilkan rekomendasi personal: Template Statis + Jahitan Dinamis
189
  """
 
208
  features_seen.add(feature)
209
 
210
  condition = rule["condition"]
211
+ value = rule["value"] # Ambil nilai asli
212
+
213
+ # [DIUBAH] Panggil helper baru, bukan CLAUSES.get()
214
+ text = _get_dynamic_clause(feature, condition, value)
215
+
216
  sentiment = SENTIMENT_MAP.get(feature, {}).get(condition, 0)
217
 
218
+ if text: # Hanya tambahkan jika text tidak kosong
219
  active_clauses.append({"text": text, "sentiment": sentiment})
220
 
221
  if not active_clauses: