← Back to labs
Case study · ML engineering

MatchMaker

A hybrid movie recommendation engine combining collaborative filtering (SVD) with content-based genre similarity. Search movies you like, get personalized recommendations.

9,700+movies
100Kratings
HybridSVD + content
38modern films
The problem

Movie recommendations with no user history

Most recommendation systems need extensive user history to work well. MatchMaker solves the cold-start problem by letting users pick movies they like, then combining collaborative filtering (what similar users liked) with content-based similarity (same genres).

Architecture

Five phases, hybrid approach

Phase 1

Collaborative filtering (SVD)

Uses scikit-surprise SVD matrix factorization trained on 100K user-movie ratings. Predicts how much a user would like unseen movies based on patterns from similar users.

  • 943 users, 1,682 movies in original training
  • SVD with 50 latent factors, 20 training epochs
  • Cold-start handled via synthetic user from liked movies
  • Scikit-surprise library for fast training
Phase 2

Content-based filtering

Builds genre profiles using TF-IDF vectorization and cosine similarity. When you like 'Toy Story', it finds other animation/children/comedy movies regardless of user ratings.

  • TF-IDF on pipe-separated genre strings
  • Cosine similarity matrix for instant lookups
  • Works for movies with zero ratings (cold-start)
  • Genre-level matching, not keyword-based
Phase 3

Hybrid fusion

Combines SVD and content-based scores with a configurable weight (60% collaborative, 40% content-based). Small random jitter ensures results vary between requests.

  • 60% SVD / 40% content-based weighting
  • Score normalization to [0, 1] range
  • Random jitter (±0.02) for variety
  • Graceful fallback to single method if one fails
Phase 4

FastAPI service

Deployed as part of the najdiavto-ml service on Railway. Four endpoints serving search, recommendations, similar movies, and popular picks.

  • POST /api/recommend — hybrid recommendations from liked movies
  • POST /api/recommend/similar — genre-based similar movies
  • GET /api/recommend/popular — randomized popular picks
  • POST /api/recommend/search — movie title search
Phase 5

Modern dataset

Uses MovieLens latest-small (9,742 movies, 100K ratings, up to 2018) with 38 injected modern films up to 2024 for complete coverage.

  • 9,742 movies from the MovieLens latest-small dataset
  • 100,836 ratings from 610 users
  • 38 modern films injected (2018–2024)
  • Movies include Batman Begins, Inception, Dune, Oppenheimer
Stack

Tools used

Pythonscikit-surprisescikit-learnFastAPIReactTypeScriptDocker