01
Endless scrolling
Browsing for "something like that one" means paging through titles one at a time.
RECOMMENDER · APP
A content-based movie recommender on the TMDB 5000 dataset, with a Streamlit front end. Pick a film and it shows the five most similar ones, with posters from the TMDB API.

THE GAP
Looking for something like a film you enjoyed usually means a long scroll through titles. I wanted to skip that: name one film and get a short list that shares its story, genres, cast or director.
01
Browsing for "something like that one" means paging through titles one at a time.
02
A long list makes it harder to pick anything, not easier.
03
A list of names is hard to scan, so every pick should come with its poster.
WHAT IT DOES
In a notebook, I describe each film with one bag of words built from its plot overview, genres, keywords, top three cast members and director, then score how similar every pair of films is. The Streamlit app loads those scores, finds your film's row and shows the five closest, each with a poster from the TMDB API.
It matches films on what they contain, so it needs no ratings or viewing history.
Spaces are stripped from names, so Sam Worthington becomes one token instead of two.
Every pairwise similarity is computed up front, so a recommendation is just a lookup and a sort.
Each pick makes one TMDB API call for its poster, with a note when there isn't one.
HOW IT WORKS
Choose a film from a dropdown of every title in the model.
Press Show Recommendations.
The app finds that film's row of similarity scores.
It sorts the row, skips the film itself and keeps the top five.
It asks the TMDB API for each poster and notes any that are missing.
Five titles and posters appear side by side.
SYSTEM DESIGN
All the modeling happens once in a Jupyter notebook. The Streamlit app only loads the saved film list and similarity matrix, then does a lookup per click.
Data
TMDB 5000
movies and credits CSVs from Kaggle
Merge
joined on title, 4,809 rows
Features
Tags
overview, genres, keywords, 3 cast, director
Cleanup
names joined, words stemmed, stop words dropped
Model
CountVectorizer
5,000 most common terms as features
Cosine similarity
4,806 × 4,806 score matrix
App
Streamlit
dropdown, button, five poster columns
TMDB API
one poster request per pick
RESULTS
4,806
movie entries in the model, after dropping 3 with no overview
5,000
most common stemmed terms used as features
23.1M
pairwise similarity scores, computed once (4,806 × 4,806)
5
picks per film, each with a TMDB poster
For Skyfall, the app returns Spectre, Never Say Never Again, Octopussy, Quantum of Solace and Dr. No.
WHAT IT TAUGHT ME
It only knows words. Films match when they share plot words, genres, keywords, cast or a director, which is why Skyfall brings back five Bond films, and it has no idea what anyone actually enjoyed. Titles aren't unique either, and I joined the two files on title and look films up by title, so the notebook's own test recommends Batman for Batman. And the app drifted from the notebook: it loads two pickle files that the notebook never writes and the repo doesn't include, so a fresh clone needs an export step first.
BUILT WITH
Like what you see?
Thanks for reading. There's more where this came from.