Membangun Recommendation Engine Streaming dengan FastAPI & Content-Based Filtering
Bagaimana kami merancang sistem rekomendasi film real-time pada ForgeFlix menggunakan TF-IDF Vectorizer dan Cosine Similarity pada FastAPI Python tanpa mengorbankan latensi respons API.
Table of Contents
Salah satu fitur unggulan pada platform ForgeFlix yang membedakannya dari agregator film konvensional adalah baris Rekomendasi Untuk Kamu yang disesuaikan dengan film atau serial yang sedang ditonton pengguna.
Artikel ini membahas bagaimana kami merancang dan mengimplementasikan Content-Based Recommendation Engine menggunakan Python, FastAPI, dan Scikit-Learn.
Konsep Dasar Content-Based Filtering
Content-Based Filtering merekomendasikan item berdasarkan kemiripan fitur atribut dari item tersebut (seperti genre, sinopsis, sutradara, aktor, dan kata kunci) terhadap item yang disukai pengguna.
Langkah Alur Kerja Algoritma:
- Ekstraksi Fitur Metadata: Penggabungan teks sinopsis (
overview), daftargenres, namadirector, dan jajarancastmenjadi satu string teks terpadu (metadata soup). - Vektorisasi Teks (TF-IDF): Mengubah string teks menjadi matriks bobot angka menggunakan Term Frequency-Inverse Document Frequency (TF-IDF).
- Kalkulasi Cosine Similarity: Menghitung sudut kosinus antara dua vektor data untuk mengukur tingkat kemiripan konten (skala 0.0 hingga 1.0).
Implementasi Kode Python
Berikut skrip inti rekomendasi yang dijalankan dalam microservice FastAPI ForgeFlix:
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
import pandas as pd
import numpy as np
class MovieRecommender:
def __init__(self, media_dataset: pd.DataFrame):
self.df = media_dataset
self._prepare_soup()
self._build_similarity_matrix()
def _prepare_soup(self):
# Menggabungkan genre, director, cast, dan overview
def create_soup(row):
genres = " ".join(row.get('genres', []))
director = row.get('director', '')
overview = row.get('overview', '')
return f"{genres} {director} {overview}".lower()
self.df['soup'] = self.df.apply(create_soup, axis=1)
def _build_similarity_matrix(self):
# Membentuk matriks TF-IDF
tfidf = TfidfVectorizer(stop_words='english', max_features=5000)
tfidf_matrix = tfidf.fit_transform(self.df['soup'])
# Menghitung matriks Cosine Similarity
self.similarity_matrix = cosine_similarity(tfidf_matrix, tfidf_matrix)
self.indices = pd.Series(self.df.index, index=self.df['tmdbId']).drop_duplicates()
def predict_similar(self, tmdb_id: int, top_n: int = 10):
if tmdb_id not in self.indices:
return []
idx = self.indices[tmdb_id]
sim_scores = list(enumerate(self.similarity_matrix[idx]))
sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)
sim_scores = sim_scores[1:top_n+1]
movie_indices = [i[0] for i in sim_scores]
return self.df.iloc[movie_indices].to_dict(orient='records')Mengapa Menggunakan FastAPI?
Memproses perkalian matriks Cosine Similarity pada 1.000+ katalog film memerlukan alokasi CPU yang intensif. Menggunakan Python FastAPI memberikan keuntungan:
- Latensi Sub-20ms: Dengan memuat (caching) matriks kesamaan di dalam memori RAM saat server FastAPI pertama kali dinyalakan (on startup), query rekomendasi dapat dijawab dalam hitungan milidetik.
- Endpoint Asinkron: FastAPI mendukung
async def, memungkinkan backend NestJS memanggil rekomendasi secara non-blocking. - Validasi Tipe Pydantic: Menjamin skema JSON respon sesuai dengan kontrak tipe TypeScript di frontend.
# Model Pydantic untuk Skema Respon API
class RecommendationResponse(BaseModel):
tmdbId: int
title: str
posterUrl: str
rating: float
releaseYear: int
mediaType: str
similarityScore: floatKesimpulan
Pendekatan Content-Based Filtering menggunakan TF-IDF dan Cosine Similarity terbukti sangat efektif untuk platform streaming media seperti ForgeFlix. Dengan FastAPI, sistem rekomendasi dapat berjalan cepat, efisien, dan mudah diintegrasikan ke dalam arsitektur modern.