File size: 1,999 Bytes
c6b3fe5
80e0b91
c6b3fe5
 
 
 
 
 
 
 
 
80e0b91
c6b3fe5
 
40104a7
c6b3fe5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bd8be20
 
 
c6b3fe5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d4eb254
c6b3fe5
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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()