Project 02 · Machine Learning Recommender

The Watchlist

A personalized movie recommendation system built around a simple frustration: the movies worth discovering are often scattered across platforms, languages, decades, and niches. The Watchlist turns one user's rated films into a richer discovery engine using multi-source metadata, semantic embeddings, clustering, and quality-aware ranking.

The Watchlist report cover
50K
candidate movie pool
4
aspect text channels
2-pass
metadata enrichment design
ML
embedding + clustering pipeline
Problem Statement

Recommendation should feel like discovery, not repetition

Most streaming recommenders are useful, but they are usually locked inside one platform and optimized for broad engagement. That creates a gap for people whose taste crosses languages, decades, genres, and levels of popularity.

The pain point

Standard platforms often over-recommend what is already popular or easy to categorize. They can miss older films, international cinema, independent titles, and emotionally similar movies that do not share obvious genre labels.

The design response

The Watchlist treats a personal watchlist as a data asset. Instead of asking “what is trending?”, it asks “what does this person's taste actually look like across theme, mood, style, context, and quality?”

The goal was not to build a generic movie list. The goal was to build a recommender that can explain a user's taste, search beyond one platform, and surface films that fit the person — including niche titles that a popularity-first system may never show.
Data Engineering

From messy movie records to a reusable recommendation dataset

The technical heart of the project is a multi-source enrichment pipeline. It combines a personal watchlist with TMDb metadata, Wikipedia plot summaries, IMDb rating signals, and a large 50,000-title candidate pool.

Watchlist + Pool
Rated movies and a large cross-platform candidate universe.
TMDb / Wikipedia / IMDb
Metadata, plots, multilingual fallback, ratings, and vote counts.
Cleaned Feature Store
Rich text fields, embeddings, quality signals, and audit flags.
Pass 1 · Fast coverage

Every candidate is first enriched with TMDb fields such as title, original language, genres, overview, cast/director signals, keywords, and popularity metadata. This creates a reliable baseline for all rows.

Pass 2 · Selective depth

Only weak or low-confidence rows are sent through the heavier Wikipedia enrichment layer. This keeps the system scalable while improving plot coverage for older, foreign, or sparse records.

Source coverage dashboard for The Watchlist project
Source coverage view from the report: the pool spans decades and languages, while enrichment checks track IMDb, TMDb, English Wikipedia plot coverage, and translated plot coverage.
Feature Engineering

Movies are not represented as one flat description

A movie can match someone for different reasons: subject matter, emotional tone, cinematic style, cultural context, or some combination. The project therefore builds multiple text channels before embedding.

Theme

What the movie is about: relationships, memory, crime, coming of age, identity, power, loss, or other conceptual signals.

Mood

How the film feels: nostalgic, bleak, tense, warm, surreal, meditative, chaotic, or emotionally restrained.

Style + Context

How and where it belongs: genre, decade, language, director/cast clues, country context, and storytelling texture.

Example transformation

A film like Cinema Paradiso is not only “Drama, Romance.” The system builds richer text around childhood memory, film culture, nostalgia, Italy, projectionist friendship, and coming-of-age context — then embeds those representations separately so the recommender can match deeper similarity than genre alone.

theme textmood textstyle textcontext textsemantic embeddings
Machine Learning

Taste is modeled as multiple preference lanes

The recommendation logic does not collapse the user into one average vector. It builds rating-centered preference signals and then segments the watchlist into soft overlapping taste streams.

Taste stream strength
What the streams mean

One stream captured a stronger positive alignment, with representative titles such as Cries and Whispers, Autumn Sonata, Mother!, Howl's Moving Castle, and Nostalgia. Another stream grouped a different lane of taste around titles such as Scarface, The Departed, Public Enemies, John Wick, and Pulp Fiction.

SignalPurpose
overall tastegeneral fit
positive tastewhat to seek
negative tastewhat to penalize
Recommendation Scoring

The final ranking balances personal fit with film quality

A pure similarity system can recommend weak films that happen to match surface-level taste. A pure popularity system can erase the user's personality. This project combines both sides.

Taste similarity

Measures how strongly a candidate aligns with the learned user preference vectors and aspect-specific embeddings.

Stream alignment

Checks whether a candidate belongs near one of the user's meaningful taste lanes instead of only matching the average profile.

Quality layer

Uses IMDb weighted rating, metadata richness, and text reliability to avoid low-quality or poorly supported recommendations.

Outcome

What this project proves

Technical outcome

The project produced an end-to-end recommendation workflow: data fetching, enrichment, cleaning, aspect text construction, semantic embedding, taste segmentation, scoring, and validation.

Analytics outcome

It reframes recommendation as a data product, not just a model. The system includes checks for coverage, ID integrity, enrichment quality, suspicious matches, and ranking behavior.

The strongest result is the architecture: a recommender that can grow. The current version establishes a strong baseline, while the next version can add multi-query retrieval, diversity-aware reranking, stronger reliability filters, ANN indexing, and richer recommendation explanations.
← Back to main page