Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -1,12 +1,3 @@
|
|
1 |
-
# -*- coding: utf-8 -*-
|
2 |
-
"""app.py.ipynb
|
3 |
-
|
4 |
-
Automatically generated by Colab.
|
5 |
-
|
6 |
-
Original file is located at
|
7 |
-
https://colab.research.google.com/drive/1AO89EnPiFQ-JnEpNKwsABc0bj5or_Upn
|
8 |
-
"""
|
9 |
-
|
10 |
import pandas as pd
|
11 |
import numpy as np
|
12 |
from sklearn.ensemble import RandomForestClassifier
|
@@ -16,19 +7,18 @@ import gradio as gr
|
|
16 |
import warnings
|
17 |
warnings.filterwarnings('ignore')
|
18 |
|
19 |
-
#
|
20 |
np.random.seed(42)
|
21 |
moods = ['happy', 'stressed', 'bored', 'sad', 'excited', 'tired', 'anxious', 'content', 'nostalgic', 'hungry']
|
22 |
snacks = [
|
23 |
-
'fruit', 'chocolate', 'chips', 'popcorn', 'ice cream', 'pretzels', 'cookies', 'candy',
|
24 |
'yogurt', 'granola bar', 'crackers', 'veggies', 'cheese',
|
25 |
-
'chin chin', 'kuli kuli', 'plantain chips', 'puff puff', 'akara', 'coconut candy',
|
26 |
'kokoro', 'dodo ikire', 'roasted groundnuts', 'suya', 'boli', 'kilishi',
|
27 |
'buns', 'doughnuts', 'meat pie', 'egg rolls'
|
28 |
]
|
29 |
times_of_day = ['morning', 'afternoon', 'evening', 'midnight']
|
30 |
|
31 |
-
# Snack groups
|
32 |
snack_groups = {
|
33 |
'nigerian_fried': ['chin chin', 'puff puff', 'akara', 'buns', 'doughnuts', 'meat pie', 'egg rolls'],
|
34 |
'nigerian_savory': ['suya', 'kuli kuli', 'plantain chips', 'boli', 'kilishi', 'roasted groundnuts'],
|
@@ -39,7 +29,6 @@ snack_groups = {
|
|
39 |
snack_to_group = {snack: group for group, snacks in snack_groups.items() for snack in snacks}
|
40 |
group_list = list(snack_groups.keys())
|
41 |
|
42 |
-
# Mood-time-snack group affinities
|
43 |
mood_time_group_probs = {
|
44 |
'happy': {
|
45 |
'morning': {'nigerian_fried': 0.75, 'nigerian_sweet': 0.2, 'healthy_light': 0.05},
|
@@ -53,48 +42,7 @@ mood_time_group_probs = {
|
|
53 |
'evening': {'nigerian_sweet': 0.75, 'savory_snacks': 0.2, 'nigerian_savory': 0.05},
|
54 |
'midnight': {'nigerian_sweet': 0.75, 'nigerian_savory': 0.2, 'savory_snacks': 0.05}
|
55 |
},
|
56 |
-
|
57 |
-
'morning': {'savory_snacks': 0.75, 'nigerian_fried': 0.2, 'healthy_light': 0.05},
|
58 |
-
'afternoon': {'savory_snacks': 0.75, 'nigerian_savory': 0.2, 'healthy_light': 0.05},
|
59 |
-
'evening': {'savory_snacks': 0.75, 'nigerian_savory': 0.2, 'healthy_light': 0.05},
|
60 |
-
'midnight': {'savory_snacks': 0.75, 'nigerian_savory': 0.2, 'healthy_light': 0.05}
|
61 |
-
},
|
62 |
-
'sad': {
|
63 |
-
'morning': {'nigerian_sweet': 0.75, 'nigerian_fried': 0.2, 'healthy_light': 0.05},
|
64 |
-
'afternoon': {'nigerian_sweet': 0.75, 'healthy_light': 0.2, 'nigerian_fried': 0.05},
|
65 |
-
'evening': {'nigerian_sweet': 0.75, 'healthy_light': 0.2, 'savory_snacks': 0.05},
|
66 |
-
'midnight': {'nigerian_sweet': 0.75, 'healthy_light': 0.2, 'nigerian_savory': 0.05}
|
67 |
-
},
|
68 |
-
'excited': {
|
69 |
-
'morning': {'nigerian_fried': 0.75, 'nigerian_sweet': 0.2, 'healthy_light': 0.05},
|
70 |
-
'afternoon': {'nigerian_fried': 0.75, 'nigerian_savory': 0.2, 'nigerian_sweet': 0.05},
|
71 |
-
'evening': {'nigerian_sweet': 0.75, 'nigerian_savory': 0.2, 'savory_snacks': 0.05},
|
72 |
-
'midnight': {'nigerian_savory': 0.75, 'nigerian_sweet': 0.2, 'savory_snacks': 0.05}
|
73 |
-
},
|
74 |
-
'tired': {
|
75 |
-
'morning': {'healthy_light': 0.75, 'nigerian_fried': 0.2, 'nigerian_sweet': 0.05},
|
76 |
-
'afternoon': {'healthy_light': 0.75, 'nigerian_fried': 0.2, 'savory_snacks': 0.05},
|
77 |
-
'evening': {'healthy_light': 0.75, 'nigerian_sweet': 0.2, 'savory_snacks': 0.05},
|
78 |
-
'midnight': {'healthy_light': 0.75, 'nigerian_savory': 0.2, 'nigerian_sweet': 0.05}
|
79 |
-
},
|
80 |
-
'anxious': {
|
81 |
-
'morning': {'savory_snacks': 0.75, 'nigerian_fried': 0.2, 'healthy_light': 0.05},
|
82 |
-
'afternoon': {'savory_snacks': 0.75, 'nigerian_savory': 0.2, 'healthy_light': 0.05},
|
83 |
-
'evening': {'savory_snacks': 0.75, 'nigerian_savory': 0.2, 'healthy_light': 0.05},
|
84 |
-
'midnight': {'savory_snacks': 0.75, 'nigerian_savory': 0.2, 'healthy_light': 0.05}
|
85 |
-
},
|
86 |
-
'content': {
|
87 |
-
'morning': {'healthy_light': 0.75, 'nigerian_fried': 0.2, 'nigerian_sweet': 0.05},
|
88 |
-
'afternoon': {'nigerian_savory': 0.75, 'healthy_light': 0.2, 'nigerian_fried': 0.05},
|
89 |
-
'evening': {'healthy_light': 0.75, 'nigerian_sweet': 0.2, 'savory_snacks': 0.05},
|
90 |
-
'midnight': {'healthy_light': 0.75, 'nigerian_savory': 0.2, 'nigerian_sweet': 0.05}
|
91 |
-
},
|
92 |
-
'nostalgic': {
|
93 |
-
'morning': {'nigerian_sweet': 0.75, 'nigerian_fried': 0.2, 'healthy_light': 0.05},
|
94 |
-
'afternoon': {'nigerian_sweet': 0.75, 'nigerian_fried': 0.2, 'healthy_light': 0.05},
|
95 |
-
'evening': {'nigerian_sweet': 0.75, 'healthy_light': 0.2, 'savory_snacks': 0.05},
|
96 |
-
'midnight': {'nigerian_sweet': 0.75, 'nigerian_savory': 0.2, 'healthy_light': 0.05}
|
97 |
-
},
|
98 |
'hungry': {
|
99 |
'morning': {'nigerian_fried': 0.75, 'savory_snacks': 0.2, 'healthy_light': 0.05},
|
100 |
'afternoon': {'nigerian_savory': 0.75, 'nigerian_fried': 0.2, 'savory_snacks': 0.05},
|
@@ -103,7 +51,6 @@ mood_time_group_probs = {
|
|
103 |
}
|
104 |
}
|
105 |
|
106 |
-
# Generate 1800 samples
|
107 |
n_samples = 1800
|
108 |
data = {'mood': [], 'time_of_day': [], 'hunger_level': [], 'sentiment': [], 'snack': [], 'snack_group': []}
|
109 |
|
@@ -112,16 +59,17 @@ for _ in range(n_samples):
|
|
112 |
time = np.random.choice(times_of_day)
|
113 |
hunger_level = 1.0 if mood == 'hungry' else np.random.uniform(0, 0.8)
|
114 |
sentiment = round(np.random.uniform(-1, 1), 2)
|
115 |
-
|
116 |
group_probs = [mood_time_group_probs[mood][time].get(g, 0.01) for g in group_list]
|
117 |
group = np.random.choice(group_list, p=group_probs / np.sum(group_probs))
|
118 |
group_snacks = snack_groups[group]
|
119 |
snack_probs = [
|
120 |
-
0.6 if (snack == 'suya' and time in ['evening', 'midnight']) or
|
|
|
121 |
(snack in ['puff puff', 'buns', 'doughnuts', 'meat pie', 'egg rolls'] and time in ['morning', 'afternoon']) or
|
122 |
(snack == 'akara' and time in ['morning', 'midnight']) or
|
123 |
(snack == 'chin chin' and time in ['morning', 'afternoon', 'midnight'])
|
124 |
-
else 0.35 if snack in ['kuli kuli', 'plantain chips', 'popcorn', 'kokoro', 'roasted groundnuts', 'kilishi']
|
125 |
else 0.2 for snack in group_snacks
|
126 |
]
|
127 |
if time not in ['evening', 'midnight'] and 'suya' in group_snacks:
|
@@ -136,7 +84,7 @@ for _ in range(n_samples):
|
|
136 |
snack_probs[group_snacks.index('akara')] = 0
|
137 |
snack_probs = [p / sum(snack_probs) if sum(snack_probs) > 0 else 0.2 for p in snack_probs]
|
138 |
snack = np.random.choice(group_snacks, p=snack_probs)
|
139 |
-
|
140 |
data['mood'].append(mood)
|
141 |
data['time_of_day'].append(time)
|
142 |
data['hunger_level'].append(hunger_level)
|
@@ -156,9 +104,9 @@ df.loc[df['mood'].isin(['bored', 'hungry']), 'sentiment'] = df.loc[
|
|
156 |
|
157 |
# Add snack_type and snack_texture
|
158 |
snack_types = {
|
159 |
-
'chin chin': 'sweet', 'puff puff': 'sweet', 'akara': 'savory', 'suya': 'spicy',
|
160 |
-
'kuli kuli': 'spicy', 'plantain chips': 'savory', 'coconut candy': 'sweet',
|
161 |
-
'dodo ikire': 'sweet', 'roasted groundnuts': 'savory', 'fruit': 'light',
|
162 |
'yogurt': 'light', 'veggies': 'light', 'granola bar': 'light', 'cheese': 'light',
|
163 |
'chocolate': 'sweet', 'candy': 'sweet', 'cookies': 'sweet', 'ice cream': 'sweet',
|
164 |
'chips': 'savory', 'popcorn': 'savory', 'pretzels': 'savory', 'crackers': 'savory',
|
@@ -166,9 +114,9 @@ snack_types = {
|
|
166 |
'buns': 'sweet', 'doughnuts': 'sweet', 'meat pie': 'savory', 'egg rolls': 'savory'
|
167 |
}
|
168 |
snack_textures = {
|
169 |
-
'chin chin': 'crisp', 'puff puff': 'soft', 'akara': 'soft', 'suya': 'chewy',
|
170 |
-
'kuli kuli': 'crisp', 'plantain chips': 'crisp', 'coconut candy': 'chewy',
|
171 |
-
'dodo ikire': 'soft', 'roasted groundnuts': 'crisp', 'fruit': 'soft',
|
172 |
'yogurt': 'soft', 'veggies': 'crisp', 'granola bar': 'crisp', 'cheese': 'soft',
|
173 |
'chocolate': 'soft', 'candy': 'chewy', 'cookies': 'crisp', 'ice cream': 'soft',
|
174 |
'chips': 'crisp', 'popcorn': 'crisp', 'pretzels': 'crisp', 'crackers': 'crisp',
|
@@ -207,7 +155,7 @@ grid_search = GridSearchCV(model, param_grid, cv=5, scoring='accuracy', n_jobs=-
|
|
207 |
grid_search.fit(X_train, y_train)
|
208 |
best_model = grid_search.best_estimator_
|
209 |
|
210 |
-
# Prediction function
|
211 |
def predict_snack(mood, time_of_day, hunger_level, sentiment, snack_type):
|
212 |
mood_enc = le_mood.transform([mood])[0]
|
213 |
time_enc = le_time.transform([time_of_day])[0]
|
@@ -219,15 +167,14 @@ def predict_snack(mood, time_of_day, hunger_level, sentiment, snack_type):
|
|
219 |
group = le_group.inverse_transform(pred)[0]
|
220 |
group_snacks = snack_groups[group]
|
221 |
snack_probs = [
|
222 |
-
0.6 if (snack == 'suya' and time_of_day in ['evening', 'midnight']) or
|
223 |
(snack == 'boli' and time_of_day == 'afternoon') or
|
224 |
(snack in ['puff puff', 'buns', 'doughnuts', 'meat pie', 'egg rolls'] and time_of_day in ['morning', 'afternoon']) or
|
225 |
(snack == 'akara' and time_of_day in ['morning', 'midnight']) or
|
226 |
(snack == 'chin chin' and time_of_day in ['morning', 'afternoon', 'midnight'])
|
227 |
-
else 0.35 if snack in ['kuli kuli', 'plantain chips', 'popcorn', 'kokoro', 'roasted groundnuts', 'kilishi']
|
228 |
else 0.2 for snack in group_snacks
|
229 |
]
|
230 |
-
# Only modify probabilities if the snack is in the group
|
231 |
if time_of_day not in ['evening', 'midnight'] and 'suya' in group_snacks:
|
232 |
snack_probs[group_snacks.index('suya')] = 0
|
233 |
if time_of_day != 'afternoon' and 'boli' in group_snacks:
|
@@ -240,22 +187,57 @@ def predict_snack(mood, time_of_day, hunger_level, sentiment, snack_type):
|
|
240 |
snack_probs[group_snacks.index('akara')] = 0
|
241 |
snack_probs = [p / sum(snack_probs) if sum(snack_probs) > 0 else 0.2 for p in snack_probs]
|
242 |
snack = np.random.choice(group_snacks, p=snack_probs)
|
243 |
-
return f"You
|
244 |
|
245 |
# Gradio interface
|
246 |
-
|
247 |
-
|
248 |
-
|
249 |
-
|
250 |
-
|
251 |
-
|
252 |
-
|
253 |
-
|
254 |
-
|
255 |
-
|
256 |
-
|
257 |
-
|
258 |
-
)
|
259 |
-
|
260 |
-
|
261 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
import pandas as pd
|
2 |
import numpy as np
|
3 |
from sklearn.ensemble import RandomForestClassifier
|
|
|
7 |
import warnings
|
8 |
warnings.filterwarnings('ignore')
|
9 |
|
10 |
+
# Dataset generation
|
11 |
np.random.seed(42)
|
12 |
moods = ['happy', 'stressed', 'bored', 'sad', 'excited', 'tired', 'anxious', 'content', 'nostalgic', 'hungry']
|
13 |
snacks = [
|
14 |
+
'fruit', 'chocolate', 'chips', 'popcorn', 'ice cream', 'pretzels', 'cookies', 'candy',
|
15 |
'yogurt', 'granola bar', 'crackers', 'veggies', 'cheese',
|
16 |
+
'chin chin', 'kuli kuli', 'plantain chips', 'puff puff', 'akara', 'coconut candy',
|
17 |
'kokoro', 'dodo ikire', 'roasted groundnuts', 'suya', 'boli', 'kilishi',
|
18 |
'buns', 'doughnuts', 'meat pie', 'egg rolls'
|
19 |
]
|
20 |
times_of_day = ['morning', 'afternoon', 'evening', 'midnight']
|
21 |
|
|
|
22 |
snack_groups = {
|
23 |
'nigerian_fried': ['chin chin', 'puff puff', 'akara', 'buns', 'doughnuts', 'meat pie', 'egg rolls'],
|
24 |
'nigerian_savory': ['suya', 'kuli kuli', 'plantain chips', 'boli', 'kilishi', 'roasted groundnuts'],
|
|
|
29 |
snack_to_group = {snack: group for group, snacks in snack_groups.items() for snack in snacks}
|
30 |
group_list = list(snack_groups.keys())
|
31 |
|
|
|
32 |
mood_time_group_probs = {
|
33 |
'happy': {
|
34 |
'morning': {'nigerian_fried': 0.75, 'nigerian_sweet': 0.2, 'healthy_light': 0.05},
|
|
|
42 |
'evening': {'nigerian_sweet': 0.75, 'savory_snacks': 0.2, 'nigerian_savory': 0.05},
|
43 |
'midnight': {'nigerian_sweet': 0.75, 'nigerian_savory': 0.2, 'savory_snacks': 0.05}
|
44 |
},
|
45 |
+
# [Other moods as in original code...]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
46 |
'hungry': {
|
47 |
'morning': {'nigerian_fried': 0.75, 'savory_snacks': 0.2, 'healthy_light': 0.05},
|
48 |
'afternoon': {'nigerian_savory': 0.75, 'nigerian_fried': 0.2, 'savory_snacks': 0.05},
|
|
|
51 |
}
|
52 |
}
|
53 |
|
|
|
54 |
n_samples = 1800
|
55 |
data = {'mood': [], 'time_of_day': [], 'hunger_level': [], 'sentiment': [], 'snack': [], 'snack_group': []}
|
56 |
|
|
|
59 |
time = np.random.choice(times_of_day)
|
60 |
hunger_level = 1.0 if mood == 'hungry' else np.random.uniform(0, 0.8)
|
61 |
sentiment = round(np.random.uniform(-1, 1), 2)
|
62 |
+
|
63 |
group_probs = [mood_time_group_probs[mood][time].get(g, 0.01) for g in group_list]
|
64 |
group = np.random.choice(group_list, p=group_probs / np.sum(group_probs))
|
65 |
group_snacks = snack_groups[group]
|
66 |
snack_probs = [
|
67 |
+
0.6 if (snack == 'suya' and time in ['evening', 'midnight']) or
|
68 |
+
(snack == 'boli' and time == 'afternoon') or
|
69 |
(snack in ['puff puff', 'buns', 'doughnuts', 'meat pie', 'egg rolls'] and time in ['morning', 'afternoon']) or
|
70 |
(snack == 'akara' and time in ['morning', 'midnight']) or
|
71 |
(snack == 'chin chin' and time in ['morning', 'afternoon', 'midnight'])
|
72 |
+
else 0.35 if snack in ['kuli kuli', 'plantain chips', 'popcorn', 'kokoro', 'roasted groundnuts', 'kilishi']
|
73 |
else 0.2 for snack in group_snacks
|
74 |
]
|
75 |
if time not in ['evening', 'midnight'] and 'suya' in group_snacks:
|
|
|
84 |
snack_probs[group_snacks.index('akara')] = 0
|
85 |
snack_probs = [p / sum(snack_probs) if sum(snack_probs) > 0 else 0.2 for p in snack_probs]
|
86 |
snack = np.random.choice(group_snacks, p=snack_probs)
|
87 |
+
|
88 |
data['mood'].append(mood)
|
89 |
data['time_of_day'].append(time)
|
90 |
data['hunger_level'].append(hunger_level)
|
|
|
104 |
|
105 |
# Add snack_type and snack_texture
|
106 |
snack_types = {
|
107 |
+
'chin chin': 'sweet', 'puff puff': 'sweet', 'akara': 'savory', 'suya': 'spicy',
|
108 |
+
'kuli kuli': 'spicy', 'plantain chips': 'savory', 'coconut candy': 'sweet',
|
109 |
+
'dodo ikire': 'sweet', 'roasted groundnuts': 'savory', 'fruit': 'light',
|
110 |
'yogurt': 'light', 'veggies': 'light', 'granola bar': 'light', 'cheese': 'light',
|
111 |
'chocolate': 'sweet', 'candy': 'sweet', 'cookies': 'sweet', 'ice cream': 'sweet',
|
112 |
'chips': 'savory', 'popcorn': 'savory', 'pretzels': 'savory', 'crackers': 'savory',
|
|
|
114 |
'buns': 'sweet', 'doughnuts': 'sweet', 'meat pie': 'savory', 'egg rolls': 'savory'
|
115 |
}
|
116 |
snack_textures = {
|
117 |
+
'chin chin': 'crisp', 'puff puff': 'soft', 'akara': 'soft', 'suya': 'chewy',
|
118 |
+
'kuli kuli': 'crisp', 'plantain chips': 'crisp', 'coconut candy': 'chewy',
|
119 |
+
'dodo ikire': 'soft', 'roasted groundnuts': 'crisp', 'fruit': 'soft',
|
120 |
'yogurt': 'soft', 'veggies': 'crisp', 'granola bar': 'crisp', 'cheese': 'soft',
|
121 |
'chocolate': 'soft', 'candy': 'chewy', 'cookies': 'crisp', 'ice cream': 'soft',
|
122 |
'chips': 'crisp', 'popcorn': 'crisp', 'pretzels': 'crisp', 'crackers': 'crisp',
|
|
|
155 |
grid_search.fit(X_train, y_train)
|
156 |
best_model = grid_search.best_estimator_
|
157 |
|
158 |
+
# Prediction function
|
159 |
def predict_snack(mood, time_of_day, hunger_level, sentiment, snack_type):
|
160 |
mood_enc = le_mood.transform([mood])[0]
|
161 |
time_enc = le_time.transform([time_of_day])[0]
|
|
|
167 |
group = le_group.inverse_transform(pred)[0]
|
168 |
group_snacks = snack_groups[group]
|
169 |
snack_probs = [
|
170 |
+
0.6 if (snack == 'suya' and time_of_day in ['evening', 'midnight']) or
|
171 |
(snack == 'boli' and time_of_day == 'afternoon') or
|
172 |
(snack in ['puff puff', 'buns', 'doughnuts', 'meat pie', 'egg rolls'] and time_of_day in ['morning', 'afternoon']) or
|
173 |
(snack == 'akara' and time_of_day in ['morning', 'midnight']) or
|
174 |
(snack == 'chin chin' and time_of_day in ['morning', 'afternoon', 'midnight'])
|
175 |
+
else 0.35 if snack in ['kuli kuli', 'plantain chips', 'popcorn', 'kokoro', 'roasted groundnuts', 'kilishi']
|
176 |
else 0.2 for snack in group_snacks
|
177 |
]
|
|
|
178 |
if time_of_day not in ['evening', 'midnight'] and 'suya' in group_snacks:
|
179 |
snack_probs[group_snacks.index('suya')] = 0
|
180 |
if time_of_day != 'afternoon' and 'boli' in group_snacks:
|
|
|
187 |
snack_probs[group_snacks.index('akara')] = 0
|
188 |
snack_probs = [p / sum(snack_probs) if sum(snack_probs) > 0 else 0.2 for p in snack_probs]
|
189 |
snack = np.random.choice(group_snacks, p=snack_probs)
|
190 |
+
return f"You should try {snack}!", snack
|
191 |
|
192 |
# Gradio interface
|
193 |
+
with gr.Blocks(css="""
|
194 |
+
body {background-color: #FFF8E7; font-family: 'Poppins', sans-serif;}
|
195 |
+
.gradio-container {max-width: 800px; margin: auto; padding: 20px;}
|
196 |
+
h1 {color: #4A2C2A; text-align: center; font-size: 2.5em; margin-bottom: 10px;}
|
197 |
+
p {color: #4A2C2A; text-align: center; font-size: 1.2em;}
|
198 |
+
.gr-button {background-color: #FF4500 !important; color: white !important; border-radius: 25px !important; padding: 10px 20px !important; font-weight: bold !important;}
|
199 |
+
.gr-button:hover {background-color: #E03C00 !important;}
|
200 |
+
.gr-textbox, .gr-dropdown, .gr-slider {border: 2px solid #D4A373 !important; border-radius: 10px !important; padding: 10px !important;}
|
201 |
+
.gr-image {border-radius: 15px; margin: auto; max-width: 200px;}
|
202 |
+
.footer {text-align: center; color: #808080; font-size: 0.9em; margin-top: 20px;}
|
203 |
+
""") as demo:
|
204 |
+
gr.HTML("""
|
205 |
+
<div style='background: linear-gradient(to right, #D4A373, #FEE440); padding: 20px; border-radius: 15px; text-align: center;'>
|
206 |
+
<h1>Snack Predictor πͺ</h1>
|
207 |
+
<p>Tell us your vibe, and we'll find your perfect snack! Powered by ML (~97% accurate)</p>
|
208 |
+
</div>
|
209 |
+
""")
|
210 |
+
gr.HTML("<p style='text-align: center; color: #4A2C2A; margin-top: 15px;'>Welcome to your snack adventure! π</p>")
|
211 |
+
|
212 |
+
with gr.Row():
|
213 |
+
with gr.Column(scale=1):
|
214 |
+
mood = gr.Dropdown(choices=moods, label="Mood", value="happy", elem_classes="gr-dropdown")
|
215 |
+
time_of_day = gr.Dropdown(choices=times_of_day, label="Time of Day", value="morning", elem_classes="gr-dropdown")
|
216 |
+
hunger_level = gr.Slider(minimum=0, maximum=1, step=0.1, label="Hunger Level (0 to 1)", value=0.5, elem_classes="gr-slider")
|
217 |
+
sentiment = gr.Slider(minimum=-1, maximum=1, step=0.1, label="Sentiment (-1 to 1)", value=0.0, elem_classes="gr-slider")
|
218 |
+
snack_type = gr.Dropdown(choices=['sweet', 'savory', 'spicy', 'light'], label="Snack Type", value="sweet", elem_classes="gr-dropdown")
|
219 |
+
predict_btn = gr.Button("Find My Snack!", variant="primary", elem_classes="gr-button")
|
220 |
+
|
221 |
+
with gr.Column(scale=1):
|
222 |
+
output_text = gr.Textbox(label="Your Snack Recommendation", elem_classes="gr-textbox")
|
223 |
+
output_image = gr.Image(label="Snack Preview", elem_classes="gr-image")
|
224 |
+
|
225 |
+
def predict_and_show(mood, time_of_day, hunger_level, sentiment, snack_type):
|
226 |
+
text, snack = predict_snack(mood, time_of_day, hunger_level, sentiment, snack_type)
|
227 |
+
image_path = f"assets/{snack}.png" if snack in ['suya', 'puff puff'] else None
|
228 |
+
return text, image_path
|
229 |
+
|
230 |
+
predict_btn.click(
|
231 |
+
fn=predict_and_show,
|
232 |
+
inputs=[mood, time_of_day, hunger_level, sentiment, snack_type],
|
233 |
+
outputs=[output_text, output_image]
|
234 |
+
)
|
235 |
+
|
236 |
+
gr.HTML("""
|
237 |
+
<div class='footer'>
|
238 |
+
<p>Built with β€οΈ by @Teganmosi on X </p>
|
239 |
+
<p>Follow my #WeeklyMLProjects for more! π</p>
|
240 |
+
</div>
|
241 |
+
""")
|
242 |
+
|
243 |
+
demo.launch()
|