teganmosi commited on
Commit
729b8a5
Β·
verified Β·
1 Parent(s): b47c175

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +70 -88
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
- # Step 1: Generate dataset and train model
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
- 'bored': {
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 (snack == 'boli' and time == 'afternoon') 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 with error handling
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're craving: {snack} (from {group})!"
244
 
245
  # Gradio interface
246
- interface = gr.Interface(
247
- fn=predict_snack,
248
- inputs=[
249
- gr.Dropdown(choices=moods, label="Mood", value="happy"),
250
- gr.Dropdown(choices=times_of_day, label="Time of Day", value="morning"),
251
- gr.Slider(minimum=0, maximum=1, step=0.1, label="Hunger Level (0 to 1)", value=0.5),
252
- gr.Slider(minimum=-1, maximum=1, step=0.1, label="Sentiment (-1 to 1)", value=0.0),
253
- gr.Dropdown(choices=['sweet', 'savory', 'spicy', 'light'], label="Snack Type", value="sweet")
254
- ],
255
- outputs=gr.Textbox(label="Prediction"),
256
- title="Snack Predictor",
257
- description="Discover your perfect snack based on your mood,time of the day and preferences!"
258
- )
259
-
260
- # Launch the app
261
- interface.launch(share=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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()