import gradio as gr import joblib import pandas as pd import os # Paths MODEL_DIR = "models" MOVIE_DATA_PATH = "data/movies_metadata.csv" # adjust to your actual metadata file # Load models (choose what you want to demo) with open(os.path.join(MODEL_DIR, "recommender_svd_mf.pkl"), "rb") as f: svd_model = joblib.load(f) # Load movie metadata movies_df = pd.read_csv(MOVIE_DATA_PATH, low_memory=False) def recommend(user_id, top_k=5): """Generate top-k recommendations using SVD model.""" # Predict scores for all movies for this user all_movie_ids = movies_df["movieId"].unique() predictions = [] for mid in all_movie_ids: try: est = svd_model.predict(str(user_id), str(mid)).est predictions.append((mid, est)) except Exception: continue # Sort and pick top_k top_movies = sorted(predictions, key=lambda x: x[1], reverse=True)[:top_k] # Build output results = [] for mid, score in top_movies: row = movies_df[movies_df["movieId"] == mid].iloc[0] explanation = f"Because you liked movies with {row.get('actors', 'similar style')}." results.append((row["title"], row.get("poster_url", None), explanation)) return results def format_output(results): titles = [r[0] for r in results] posters = [r[1] for r in results if r[1] is not None] explanations = [r[2] for r in results] return titles, posters, explanations demo = gr.Interface( fn=lambda user_id, k: format_output(recommend(user_id, k)), inputs=[ gr.Number(label="User ID"), gr.Slider(1, 10, value=5, step=1, label="Top-K") ], outputs=[ gr.Textbox(label="Recommended Movies"), gr.Gallery(label="Posters"), gr.Textbox(label="Explanations") ], title="Movie Recommender System", description="Enter your User ID to get top-K movie recommendations with posters and explanations." ) if __name__ == "__main__": demo.launch()