Spaces:
Sleeping
Sleeping
rdsarjito commited on
Commit Β·
545ed4a
1
Parent(s): 0dde736
11
Browse files- app.py +40 -8
- requirements.txt +3 -1
app.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
| 1 |
import streamlit as st
|
| 2 |
import pickle
|
| 3 |
-
import
|
| 4 |
-
|
| 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
|
|
|
|
|
|
|
|
|
|
| 30 |
|
| 31 |
-
# Input
|
| 32 |
-
input_text =
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 33 |
|
| 34 |
# Pilih model
|
| 35 |
model_name = st.selectbox("π€ Pilih Model", ("XGBoost", "KNN", "Random Forest"))
|
| 36 |
|
| 37 |
-
#
|
| 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 |
-
|
|
|
|
| 1 |
streamlit
|
| 2 |
+
beautifulsoup4
|
| 3 |
+
requests
|
| 4 |
scikit-learn
|
| 5 |
+
numpy
|