|
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 |
|
|
|
|
|
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] |
|
|
|
movies_indices = [ind[0] for ind in similarity_scores] |
|
movies = movies_df["title"].iloc[movies_indices] |
|
return movies |
|
|
|
|
|
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}") |