Content-based рекомендації використовують атрибути items для рекомендації схожих items до того, що користувач лайкнув раніше. На відміну від collaborative filtering, який використовує user-item взаємодії, content-based методи аналізують фічі items - текстові описи, категорії, зображення, метадані.
Де використовується
Content-based рекомендації забезпечують персоналізацію:
- E-commerce: "Схожі товари" на основі атрибутів, описів
- Медіа: Рекомендації статей на основі контенту, топіків
- Музика: Рекомендації пісень на основі audio features, жанру
- Jobs: Matching вакансій на основі skills, requirements
- Нерухомість: Рекомендації на основі характеристик
- Освіта: Рекомендації курсів на основі контенту
Як Content-Based відрізняється від Collaborative
| Аспект | Content-Based | Collaborative Filtering |
|---|---|---|
| Потрібні дані | Item attributes | User-item interactions |
| Cold-start items | Обробляє добре | Struggles |
| Cold-start users | Потрібна історія | Struggles |
| Serendipity | Низька | Вища |
| Інтерпретованість | Висока | Нижча |
Типові дані
| Аспект | Типові значення |
|---|---|
| Items | 1K до 10M+ |
| Item features | Text, categories, images, numeric |
| User history | 5 до 1000+ interactions |
| Feature dimensions | 50 до 1000+ |
Типи фіч items: - Текст: Titles, descriptions, reviews - Категоріальні: Genre, brand, category - Числові: Price, rating, duration - Зображення: Product photos, thumbnails
Що робимо на практиці
- Визначити item representation - Які фічі описують items?
- Екстракція фіч - Text embeddings, category encoding, image features
- Побудувати item profiles - Combined feature vectors
- Створити user profiles - Aggregation of liked item profiles
- Обчислити similarity - Cosine similarity, nearest neighbors
- Генерувати рекомендації - Top-K most similar items
- Обробити cold-start - New item/user strategies
- Оцінити offline - Precision, recall, diversity
- A/B test online - CTR, engagement, conversions
- Iterate - Feature engineering, hybrid approaches
Baseline з TF-IDF
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
# Створити TF-IDF vectors з item descriptions
tfidf = TfidfVectorizer(max_features=5000, stop_words='english')
item_vectors = tfidf.fit_transform(items['description'])
# Обчислити similarity matrix
similarity_matrix = cosine_similarity(item_vectors)
def get_recommendations(item_id, n=10):
"""Get top-N similar items"""
idx = item_id_to_idx[item_id]
sim_scores = list(enumerate(similarity_matrix[idx]))
sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)
return [idx_to_item_id[i] for i, score in sim_scores[1:n+1]]
Методи екстракції фіч
Текстові фічі:
| Метод | Опис | Найкраще для |
|---|---|---|
| TF-IDF | Term frequency weighting | Short text, keywords |
| Word2Vec avg | Average word vectors | Medium text |
| BERT/Sentence-BERT | Contextual embeddings | Semantic similarity |
from sentence_transformers import SentenceTransformer
# Modern підхід: Sentence embeddings
model = SentenceTransformer('all-MiniLM-L6-v2')
embeddings = model.encode(items['description'].tolist())
User Profile Construction
def build_user_profile(user_id, item_vectors, interactions):
"""Aggregate item vectors з якими user взаємодіяв"""
user_items = interactions[interactions['user_id'] == user_id]
# Weight by recency
weights = np.exp(-0.1 * user_items['days_ago'])
weights = weights / weights.sum()
liked_vectors = item_vectors[user_items['item_idx']]
user_profile = np.average(liked_vectors, weights=weights, axis=0)
return user_profile
Метрики оцінки
| Метрика | Опис | Застосування |
|---|---|---|
| Precision@K | Relevant items in top K | Accuracy |
| Recall@K | Fraction retrieved | Coverage |
| NDCG@K | Ranking quality | Position matters |
| Diversity | Dissimilarity within recs | Avoid repetition |
| Coverage | Fraction of items recommended | Catalog exploration |
Типові проблеми
- [ ] Over-specialization: Рекомендації занадто схожі на історію
- [ ] Feature quality: Погані item descriptions/metadata
- [ ] Cold-start users: Немає історії для profile
- [ ] Stale profiles: User preferences змінились
- [ ] Low diversity: Однакові типи items рекомендовані
Scaling з Approximate Nearest Neighbors
import faiss
# Build FAISS index
dimension = item_vectors.shape[1]
index = faiss.IndexFlatIP(dimension)
index.add(item_vectors.astype('float32'))
# Fast similarity search
def get_similar_items(item_id, n=10):
query = item_vectors[item_id_to_idx[item_id]].reshape(1, -1)
distances, indices = index.search(query.astype('float32'), n + 1)
return [idx_to_item_id[i] for i in indices[0][1:]]
Інструменти
| Категорія | Інструменти |
|---|---|
| Text embeddings | Sentence-Transformers, OpenAI, Cohere |
| Image features | torchvision, CLIP, timm |
| Vector similarity | FAISS, Annoy, ScaNN |
| Vector databases | Pinecone, Weaviate, Milvus |
Пов'язані сторінки
- Індекс: ML Field Guide
- Collaborative Filtering
- Semantic Search
- RAG Systems
Додаткове читання
Спробуйте наживо
Дослідіть пов'язану модель на практиці: відкрийте Music Recommender — Matrix Factorization (ALS) Live і змінюйте параметри під час роботи. Усе лишається у вашому браузері.
▶ Відкрити симуляцію Music Recommender — Matrix Factorization (ALS) Live