portfolio / projects /02_Movie_Recommendation.py
Christopher Capobianco
Add project pages and move intro page
d8d58f7
import streamlit as st
import pickle
st.header('Movie Recommendation', divider='green')
@st.cache_resource
def load_model():
model_file = open('./models/movie_recommendation_model.pkl', 'rb')
movies_df = pickle.load(model_file)
cosine_sim = pickle.load(model_file)
indices = pickle.load(model_file)
model_file.close()
return movies_df, cosine_sim, indices
# Load the Model
movies_df, cosine_sim, indices = load_model()
@st.cache_data
def get_recommendations(title, cosine_sim = cosine_sim):
if title in indices:
idx = indices[title]
else:
print(f"Unable to find a matching movie title: {title}")
return []
similarity_scores = list(enumerate(cosine_sim[idx]))
similarity_scores = sorted(similarity_scores, key = lambda x: x[1], reverse = True)
similarity_scores = similarity_scores[1:11]
# (a, b) where a is id of movie, b is similarity_scores
movies_indices = [ind[0] for ind in similarity_scores]
movies = movies_df["title"].iloc[movies_indices]
return movies
# Get movie recommendations
st.markdown("#### What is a Recommendation System?")
st.markdown("Recommendation systems suggest recommendations to users depending on a variety of criteria.")
st.markdown('''There are 3 types of recommendation systems:
1. Demographic Filtering: The recommendations are the same for every user. They are generalized, not personalized. These types of systems are behind sections like *Top Trending*.
2. Content-based Filtering: These suggest recommendations based on the item metadata (movie, product, song, etc). Here, the main idea is if a user likes an item, then the user will also like items similar to it.
3. Collaboration-based Filtering: These systems make recommendations by grouping the users with similar interests. For this system, metadata of the item is not required.
''')
st.markdown("In this project, we are building a **Content-based** recommendation engine for movies titles.")
tmdb_data_url = "https://www.kaggle.com/datasets/tmdb/tmdb-movie-metadata"
st.markdown("To build this recommendation system, we will be using almost 5k movies and credits from the TMDB dataset available at [Kaggle](%s)" % tmdb_data_url)
st.divider()
st.markdown("Enter the title of a movie to see a list of 10 recommendations (e.g. The Dark Knight Rises, The Avengers, etc)")
title = st.text_input("Movie Title")
if title != "":
movies = get_recommendations(title)
if len(movies) > 0:
output = ''
count = 1
for m in movies:
output += f"{count}. {m}\n"
count += 1
st.markdown(output)
else:
st.warning(f"Unable to find a movie matching title: {title}")