Головна▸Статті▸Рекомендаційні системи

Content-Based рекомендації

Побудова content-based рекомендаційних систем - item similarity, embeddings, обробка cold-start та гібридні підходи.

mysimulator teamОновлено 2026-01≈ 3 хв читання▶ Open the simulation

Content-based рекомендації використовують атрибути items для рекомендації схожих items до того, що користувач лайкнув раніше. На відміну від collaborative filtering, який використовує user-item взаємодії, content-based методи аналізують фічі items - текстові описи, категорії, зображення, метадані.

Де використовується

Content-based рекомендації забезпечують персоналізацію:

Як 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

Що робимо на практиці

  1. Визначити item representation - Які фічі описують items?
  2. Екстракція фіч - Text embeddings, category encoding, image features
  3. Побудувати item profiles - Combined feature vectors
  4. Створити user profiles - Aggregation of liked item profiles
  5. Обчислити similarity - Cosine similarity, nearest neighbors
  6. Генерувати рекомендації - Top-K most similar items
  7. Обробити cold-start - New item/user strategies
  8. Оцінити offline - Precision, recall, diversity
  9. A/B test online - CTR, engagement, conversions
  10. 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

Типові проблеми

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

Пов'язані сторінки

Додаткове читання

Спробуйте наживо

Дослідіть пов'язану модель на практиці: відкрийте Music Recommender — Matrix Factorization (ALS) Live і змінюйте параметри під час роботи. Усе лишається у вашому браузері.

▶ Відкрити симуляцію Music Recommender — Matrix Factorization (ALS) Live

Що ви знайшли?

Додати кроки відтворення (опційно)