Bardi-ya's picture
Update app.py
bd8be20 verified
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()