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()
|