File size: 2,191 Bytes
ab438fc
 
9c1ef16
90cb33d
9c1ef16
0d6ce78
9c1ef16
ecf1596
0d6ce78
4475715
ecf1596
 
4475715
 
82fe775
ab438fc
9c1ef16
ecf1596
 
0d6ce78
 
 
 
 
e214e35
908975c
e214e35
 
 
4475715
908975c
 
90cb33d
ecf1596
ab438fc
908975c
90cb33d
 
4475715
 
 
 
ab438fc
e214e35
ab438fc
908975c
ab438fc
e214e35
908975c
 
d01a125
ab438fc
 
908975c
ab438fc
9c1ef16
e214e35
 
ab438fc
 
 
 
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
import gradio as gr
import pandas as pd
import os

# 1) Load movies.csv from extracted ml-32m dataset
csv_path = os.path.join("movies.csv")  # Adjust path if needed
df = pd.read_csv(csv_path)

# 2) Normalize genres and extract release year from title
df["genres"] = df["genres"].apply(lambda g: "|".join(g) if isinstance(g, list) else str(g))
df["release_year"] = (
    df["title"]
      .str.extract(r"\((\d{4})\)")[0]
      .astype(pd.Int64Dtype(), errors='ignore')
)

# 3) Deduplicate metadata
metadata = df[["title", "genres", "release_year"]].drop_duplicates()

# 4) Extract unique genres
all_genres = set()
df["genres"].str.split("|").apply(all_genres.update)
genre_list = sorted(all_genres)

# 5) Recommendation function with year range and genre check
def recommend_by_genre_and_year_range(genre: str, start_year: int, end_year: int, top_k: int = 5) -> str:
    if not genre:
        return "⚠️ Please select a genre."

    mask_genre = metadata["genres"].str.lower().str.contains(genre.lower(), na=False)
    year_col = metadata["release_year"].fillna(0)
    mask_year = (year_col >= start_year) & (year_col <= end_year)

    candidates = metadata[mask_genre & mask_year]
    if candidates.empty:
        return f"No '{genre.title()}' movies found between {start_year} and {end_year}."

    picks = candidates.sample(n=min(top_k, len(candidates)))
    return "\n".join(
        f"• {row.title} ({int(row.release_year) if pd.notna(row.release_year) else 'Year N/A'})"
        for _, row in picks.iterrows()
    )

# 6) Gradio interface
iface = gr.Interface(
    fn=recommend_by_genre_and_year_range,
    inputs=[
        gr.Dropdown(choices=genre_list, label="Select Genre", value=None),
        gr.Number(label="Start Year", value=1990, precision=0),
        gr.Number(label="End Year", value=1995, precision=0),
        gr.Number(label="Number of Recommendations", value=5),
    ],
    outputs="text",
    title="🎬 Movie Recommender by Genre & Year Range",
    description="""
Loads local MovieLens metadata (ml-32m), extracts release years from titles,
normalizes genres, and filters by genre and a custom year range.
"""
)

if __name__ == "__main__":
    iface.launch()