MovieRecommendation / programmeRecommendation.py
SoumyaJ's picture
Update programmeRecommendation.py
60713e8 verified
raw
history blame contribute delete
4.51 kB
import pandas as pd
import pickle
from pathlib import Path
import joblib
import os
import requests
from dotenv import load_dotenv
load_dotenv()
os.environ['CALENDARIFIC_API_KEY'] = os.getenv("CALENDARIFIC_API_KEY")
currentPath = Path(__file__).resolve().parent
modelfilePath = currentPath / "similarity.pkl"
moviesfilePath = currentPath / "movielist_images.pkl"
with open(modelfilePath, 'rb') as file:
model = pickle.load(file)
with open(moviesfilePath,'rb') as file:
movieslist = joblib.load(file)
def recommendMoviesByTitle(programmeTitle):
recommended_movies = []
if programmeTitle in movieslist['programmetitle'].values:
movie_index = movieslist[movieslist['programmetitle'] == programmeTitle].index[0]
sim_score = model[movie_index]
#Take the top 10 results ONLY
movie_list = sorted(list(enumerate(sim_score)), reverse = True, key = lambda x: x[1])[1:11]
for i in movie_list:
recommended_movies.append({'programmetitle':movieslist.iloc[i[0]].programmetitle, 'imageurl': movieslist.iloc[i[0]].imagepath})
else:
return("No movies to recommend by title...")
return recommended_movies
COUNTRY_CODE = "US"
def get_holidaysByScheduleDate(scheduleDate):
key = os.environ["CALENDARIFIC_API_KEY"]
current_date = pd.to_datetime(scheduleDate,errors="coerce")
year = current_date.year
month = current_date.month
holidaylist = []
endpoint_url = f"https://calendarific.com/api/v2/holidays?api_key={key}&country={COUNTRY_CODE}&year={year}&month={month}"
response = requests.get(endpoint_url)
if response.status_code == 200:
holidays = response.json()['response']['holidays']
holidaylist = list(map(lambda x: x['description'],holidays))
return list(set(holidaylist))
else:
return []
def recommendMoviesByKeywordsAndGenres(keywordToSearchBy, genres, referenceProgrammeTitle):
recommended_movies = []
filtered_movies = []
# Convert the list of genres to lowercase for consistent comparison
genres = [genre.lower().strip() for genre in genres]
if keywordToSearchBy:
#search for event name in the programme title first
filtered_movies = movieslist[movieslist['programmetitle'].str.contains(keywordToSearchBy, case=False)]
filtered_movies = filtered_movies[filtered_movies['genredescription'].apply(
lambda genre_list: all(genre.lower() in [g.lower().strip() for g in genre_list.split(',')] for genre in genres))]
if len(filtered_movies) == 0:
# Step 1: Filter the DataFrame to find movies that match the given keyword
filtered_movies = movieslist[movieslist['Name'].str.contains(keywordToSearchBy, case=False)]
filtered_movies = filtered_movies[filtered_movies['genredescription'].apply(
lambda genre_list: all(genre.lower() in [g.lower().strip() for g in genre_list.split(',')] for genre in genres))]
if len(filtered_movies) == 0:
return recommendMoviesByTitle(referenceProgrammeTitle)
if filtered_movies.empty:
return("No movies found with the given keyword and genres.")
movies = filtered_movies.sample(len(filtered_movies))
recommended_movies.append({'programmetitle':movies.iloc[0]['programmetitle'],'imageurl': movies.iloc[0]['imagepath']})
movie_index = movies.index[0]
sim_score = model[movie_index]
movie_list = sorted(list(enumerate(sim_score)), reverse=True, key=lambda x: x[1])[1:10]
for i in movie_list:
recommended_movies.append({'programmetitle':movieslist.iloc[i[0]].programmetitle,'imageurl': movieslist.iloc[i[0]].imagepath})
return recommended_movies
def recommendProgrammes(scheduleDate : str, genres: list, referenceProgrammeTitle : str):
holidaylist = get_holidaysByScheduleDate(scheduleDate)
eventName = ""
if any("Christmas" in sentence for sentence in holidaylist):
eventName = "Christmas"
elif any("New year" in sentence for sentence in holidaylist):
eventName = "New year"
elif any("Halloween" in sentence for sentence in holidaylist):
eventName = "Halloween"
elif any("Valentine" in sentence for sentence in holidaylist):
eventName = "Valentine"
elif any("Black Friday" in sentence for sentence in holidaylist):
eventName = "Thanksgiving"
return recommendMoviesByKeywordsAndGenres(eventName,genres=genres, referenceProgrammeTitle = referenceProgrammeTitle)