rdsarjito commited on
Commit
545ed4a
Β·
1 Parent(s): 0dde736
Files changed (2) hide show
  1. app.py +40 -8
  2. requirements.txt +3 -1
app.py CHANGED
@@ -1,7 +1,7 @@
1
  import streamlit as st
2
  import pickle
3
- import os
4
- import numpy as np
5
 
6
  # === Load TF-IDF Vectorizer ===
7
  @st.cache_resource
@@ -22,22 +22,54 @@ def predict_allergen(model, vectorizer, input_text):
22
  prediction = model.predict(X_input)
23
  return prediction[0]
24
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
  # === Streamlit UI ===
26
  st.set_page_config(page_title="Deteksi Alergen Makanan", layout="centered")
27
-
28
  st.title("πŸ₯˜ Deteksi Alergen Makanan dari Resep")
29
- st.markdown("Masukkan bahan makanan unik (tanpa jumlah atau takaran) untuk mendeteksi kemungkinan kandungan alergen.")
 
 
 
30
 
31
- # Input teks dari pengguna
32
- input_text = st.text_area("πŸ“ Masukkan bahan makanan (contoh: bubuk cabai, tepung gandum, telur ayam)", height=150)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
 
34
  # Pilih model
35
  model_name = st.selectbox("πŸ€– Pilih Model", ("XGBoost", "KNN", "Random Forest"))
36
 
37
- # Prediksi ketika tombol ditekan
38
  if st.button("πŸ” Prediksi Alergen"):
39
  if not input_text.strip():
40
- st.warning("Mohon masukkan bahan makanan terlebih dahulu.")
41
  else:
42
  with st.spinner("Sedang memuat model dan memproses prediksi..."):
43
  vectorizer = load_vectorizer()
 
1
  import streamlit as st
2
  import pickle
3
+ import requests
4
+ from bs4 import BeautifulSoup
5
 
6
  # === Load TF-IDF Vectorizer ===
7
  @st.cache_resource
 
22
  prediction = model.predict(X_input)
23
  return prediction[0]
24
 
25
+ # === Scraping bahan dari Cookpad ===
26
+ def get_ingredients_from_cookpad(url):
27
+ headers = {"User-Agent": "Mozilla/5.0"}
28
+ try:
29
+ response = requests.get(url, headers=headers)
30
+ if response.status_code != 200:
31
+ return None, "Gagal mengambil halaman."
32
+ soup = BeautifulSoup(response.text, "html.parser")
33
+ ingredient_div = soup.find("div", class_="ingredient-list")
34
+ if not ingredient_div:
35
+ return None, "Tidak menemukan elemen bahan."
36
+ ingredients = [item.get_text(strip=True) for item in ingredient_div.find_all("li")]
37
+ return ingredients, None
38
+ except Exception as e:
39
+ return None, f"Terjadi kesalahan: {str(e)}"
40
+
41
  # === Streamlit UI ===
42
  st.set_page_config(page_title="Deteksi Alergen Makanan", layout="centered")
 
43
  st.title("πŸ₯˜ Deteksi Alergen Makanan dari Resep")
44
+ st.markdown("Masukkan bahan makanan atau link Cookpad untuk mendeteksi kemungkinan kandungan alergen.")
45
+
46
+ # Pilihan input: manual atau dari URL
47
+ input_mode = st.radio("Pilih metode input:", ["Manual", "Cookpad URL"])
48
 
49
+ # Input berdasarkan mode
50
+ input_text = ""
51
+ if input_mode == "Manual":
52
+ input_text = st.text_area("πŸ“ Masukkan bahan makanan (contoh: bubuk cabai, tepung gandum, telur ayam)", height=150)
53
+ elif input_mode == "Cookpad URL":
54
+ url = st.text_input("πŸ”— Masukkan URL resep dari Cookpad", placeholder="https://cookpad.com/id/resep/...")
55
+ if url:
56
+ with st.spinner("Mengambil data dari Cookpad..."):
57
+ ingredients, error = get_ingredients_from_cookpad(url)
58
+ if error:
59
+ st.error(error)
60
+ else:
61
+ st.success("Berhasil mengambil bahan-bahan:")
62
+ for item in ingredients:
63
+ st.markdown(f"- {item}")
64
+ input_text = " ".join(ingredients)
65
 
66
  # Pilih model
67
  model_name = st.selectbox("πŸ€– Pilih Model", ("XGBoost", "KNN", "Random Forest"))
68
 
69
+ # Tombol prediksi
70
  if st.button("πŸ” Prediksi Alergen"):
71
  if not input_text.strip():
72
+ st.warning("Mohon masukkan atau ambil bahan makanan terlebih dahulu.")
73
  else:
74
  with st.spinner("Sedang memuat model dan memproses prediksi..."):
75
  vectorizer = load_vectorizer()
requirements.txt CHANGED
@@ -1,3 +1,5 @@
1
  streamlit
 
 
2
  scikit-learn
3
- xgboost
 
1
  streamlit
2
+ beautifulsoup4
3
+ requests
4
  scikit-learn
5
+ numpy