rdsarjito commited on
Commit
a344e41
Β·
1 Parent(s): 7c2d2d3
Files changed (2) hide show
  1. .DS_Store +0 -0
  2. app.py +33 -24
.DS_Store ADDED
Binary file (6.15 kB). View file
 
app.py CHANGED
@@ -111,13 +111,14 @@ def load_css():
111
  margin: 1rem 0;
112
  }
113
 
114
- /* Ingredient list styling */
115
- .ingredient-item {
116
  background: #f8f9fa;
117
- padding: 0.5rem 1rem;
118
- margin: 0.25rem 0;
119
- border-radius: 20px;
120
- border-left: 3px solid #667eea;
 
121
  }
122
 
123
  /* Footer */
@@ -143,11 +144,13 @@ def load_model():
143
  with open("saved_models/XGBoost_model.pkl", "rb") as f:
144
  return pickle.load(f)
145
 
146
- # === Prediksi ===
147
  def predict_allergen(model, vectorizer, input_text):
148
  X_input = vectorizer.transform([input_text])
149
  prediction = model.predict(X_input)
150
- return prediction[0]
 
 
151
 
152
  # === Scraping bahan dari Cookpad ===
153
  def get_ingredients_from_cookpad(url):
@@ -174,30 +177,36 @@ def get_ingredients_from_cookpad(url):
174
  except Exception as e:
175
  return None, f"Terjadi kesalahan: {str(e)}"
176
 
177
- # === Display results with custom styling ===
178
- def display_results(results):
179
  st.markdown("### 🎯 Hasil Analisis Alergen")
180
 
181
  positive_results = []
182
  negative_results = []
183
 
184
- for allergen, status in results.items():
 
 
 
 
 
185
  if status == 1:
186
- positive_results.append(allergen)
187
  else:
188
- negative_results.append(allergen)
189
 
190
  # Display positive results (allergens detected)
191
  if positive_results:
192
  st.markdown("#### ⚠️ **Alergen Terdeteksi:**")
193
- for allergen in positive_results:
194
- st.markdown(f'<div class="result-positive">🚨 <strong>{allergen}</strong></div>', unsafe_allow_html=True)
195
 
196
  # Display negative results (safe allergens)
197
  if negative_results:
198
  st.markdown("#### βœ… **Aman dari Alergen:**")
199
- for allergen in negative_results:
200
- st.markdown(f'<div class="result-negative">βœ“ {allergen}</div>', unsafe_allow_html=True)
 
201
 
202
  # Show summary
203
  if not positive_results:
@@ -290,11 +299,11 @@ def main():
290
  st.warning("⚠️ Mohon masukkan bahan makanan terlebih dahulu.")
291
  else:
292
  with st.spinner("πŸ”„ Sedang menganalisis..."):
293
- pred = predict_allergen(model, vectorizer, input_text)
294
  results = dict(zip(labels, pred))
295
 
296
  st.success("βœ… Analisis selesai!")
297
- display_results(results)
298
 
299
  elif input_mode == "πŸ”— URL Cookpad":
300
  st.markdown("### πŸ”— Analisis dari URL Cookpad")
@@ -345,18 +354,18 @@ def main():
345
  else:
346
  st.success("βœ… Bahan berhasil diambil!")
347
 
348
- # Display ingredients in a nice format
349
  st.markdown("**🧾 Daftar Bahan:**")
350
- for ing in ingredients:
351
- st.markdown(f'<div class="ingredient-item">β€’ {ing}</div>', unsafe_allow_html=True)
352
 
353
  # Predict allergens
354
  joined_ingredients = " ".join(ingredients)
355
- pred = predict_allergen(model, vectorizer, joined_ingredients)
356
  results = dict(zip(labels, pred))
357
 
358
  st.markdown("---")
359
- display_results(results)
360
 
361
  # Clear progress indicators
362
  progress_bar.empty()
 
111
  margin: 1rem 0;
112
  }
113
 
114
+ /* Ingredient list styling - UPDATED */
115
+ .ingredients-container {
116
  background: #f8f9fa;
117
+ padding: 1rem;
118
+ border-radius: 10px;
119
+ border-left: 4px solid #667eea;
120
+ margin: 1rem 0;
121
+ line-height: 1.6;
122
  }
123
 
124
  /* Footer */
 
144
  with open("saved_models/XGBoost_model.pkl", "rb") as f:
145
  return pickle.load(f)
146
 
147
+ # === Prediksi dengan probabilitas ===
148
  def predict_allergen(model, vectorizer, input_text):
149
  X_input = vectorizer.transform([input_text])
150
  prediction = model.predict(X_input)
151
+ # Mendapatkan probabilitas prediksi
152
+ probabilities = model.predict_proba(X_input)
153
+ return prediction[0], probabilities[0]
154
 
155
  # === Scraping bahan dari Cookpad ===
156
  def get_ingredients_from_cookpad(url):
 
177
  except Exception as e:
178
  return None, f"Terjadi kesalahan: {str(e)}"
179
 
180
+ # === Display results with custom styling and percentage ===
181
+ def display_results(results, probabilities):
182
  st.markdown("### 🎯 Hasil Analisis Alergen")
183
 
184
  positive_results = []
185
  negative_results = []
186
 
187
+ labels = ['Susu', 'Kacang', 'Telur', 'Makanan Laut', 'Gandum']
188
+
189
+ for i, (allergen, status) in enumerate(results.items()):
190
+ # Mendapatkan probabilitas untuk kelas positif (index 1)
191
+ positive_prob = probabilities[i][1] * 100 if len(probabilities[i]) > 1 else 0
192
+
193
  if status == 1:
194
+ positive_results.append((allergen, positive_prob))
195
  else:
196
+ negative_results.append((allergen, positive_prob))
197
 
198
  # Display positive results (allergens detected)
199
  if positive_results:
200
  st.markdown("#### ⚠️ **Alergen Terdeteksi:**")
201
+ for allergen, prob in positive_results:
202
+ st.markdown(f'<div class="result-positive">🚨 <strong>{allergen}</strong> - Tingkat Kepercayaan: {prob:.1f}%</div>', unsafe_allow_html=True)
203
 
204
  # Display negative results (safe allergens)
205
  if negative_results:
206
  st.markdown("#### βœ… **Aman dari Alergen:**")
207
+ for allergen, prob in negative_results:
208
+ confidence = 100 - prob # Confidence untuk kelas negatif
209
+ st.markdown(f'<div class="result-negative">βœ“ {allergen} - Tingkat Kepercayaan: {confidence:.1f}%</div>', unsafe_allow_html=True)
210
 
211
  # Show summary
212
  if not positive_results:
 
299
  st.warning("⚠️ Mohon masukkan bahan makanan terlebih dahulu.")
300
  else:
301
  with st.spinner("πŸ”„ Sedang menganalisis..."):
302
+ pred, probabilities = predict_allergen(model, vectorizer, input_text)
303
  results = dict(zip(labels, pred))
304
 
305
  st.success("βœ… Analisis selesai!")
306
+ display_results(results, probabilities)
307
 
308
  elif input_mode == "πŸ”— URL Cookpad":
309
  st.markdown("### πŸ”— Analisis dari URL Cookpad")
 
354
  else:
355
  st.success("βœ… Bahan berhasil diambil!")
356
 
357
+ # Display ingredients in a single container - UPDATED
358
  st.markdown("**🧾 Daftar Bahan:**")
359
+ ingredients_text = ", ".join(ingredients)
360
+ st.markdown(f'<div class="ingredients-container">{ingredients_text}</div>', unsafe_allow_html=True)
361
 
362
  # Predict allergens
363
  joined_ingredients = " ".join(ingredients)
364
+ pred, probabilities = predict_allergen(model, vectorizer, joined_ingredients)
365
  results = dict(zip(labels, pred))
366
 
367
  st.markdown("---")
368
+ display_results(results, probabilities)
369
 
370
  # Clear progress indicators
371
  progress_bar.empty()