from flask import Flask, request, render_template import joblib import numpy as np from scipy.sparse import hstack app = Flask(__name__) # Load saved objects model = joblib.load('flavor_model.pkl') tfidf = joblib.load('tfidf_vectorizer.pkl') le_target = joblib.load('flavor_label_encoder.pkl') encoders = joblib.load('column_encoders.pkl') @app.route('/', methods=['GET', 'POST']) def index(): prediction = None if request.method == 'POST': # Get form data ingredients = request.form['ingredients'].lower() ingredients = ''.join(c for c in ingredients if c.isalnum() or c.isspace()) # basic cleanup diet = request.form['diet'] course = request.form['course'] region = request.form['region'] prep_time = request.form['prep_time'] cook_time = request.form['cook_time'] # Transform ingredients using TF-IDF X_ingredients = tfidf.transform([ingredients]) # Encode categorical features try: diet_enc = encoders['diet'].transform([diet])[0] except: diet_enc = 0 # fallback or handle unknown categories try: course_enc = encoders['course'].transform([course])[0] except: course_enc = 0 try: region_enc = encoders['region'].transform([region])[0] except: region_enc = 0 # Prepare numeric features, convert to float/int try: prep_time = float(prep_time) except: prep_time = 0.0 try: cook_time = float(cook_time) except: cook_time = 0.0 # Stack all features from scipy.sparse import csr_matrix X_other = csr_matrix([[diet_enc, course_enc, region_enc, prep_time, cook_time]]) X_input = hstack([X_ingredients, X_other]) # Predict pred_encoded = model.predict(X_input)[0] prediction = le_target.inverse_transform([pred_encoded])[0] return render_template('index.html', prediction=prediction) if __name__ == '__main__': app.run(debug=True)