Обязательно

Контентная фильтрация

Рекомендуем по свойствам товаров — когда важен контент, а не поведение

Время изучения: 15 мин

Идея контентной фильтрации

Контентная фильтрация (Content-Based Filtering) рекомендует товары на основе их свойств, а не поведения других пользователей. Если вам нравились боевики с Брюсом Уиллисом — рекомендуем другие боевики с ним. Не нужно знать, что смотрели другие люди.

Подход: описываем каждый товар набором признаков (жанр, актёры, теги, описание). Строим «профиль» пользователя из свойств понравившихся товаров. Рекомендуем товары, похожие на этот профиль.

Профиль пользователя

Профиль пользователя — это вектор, представляющий его предпочтения. Простейший способ: взвешенное среднее фичей понравившихся товаров.

profileu=iIuruifeaturesiiIurui\text{profile}_u = \frac{\sum_{i \in I_u} r_{ui} \cdot \text{features}_i}{\sum_{i \in I_u} r_{ui}}

I_u — множество товаров, оценённых пользователем u

Товары с высокими оценками влияют на профиль сильнее. Результат — вектор в том же пространстве, что и фичи товаров. Рекомендация: ищем товары, ближайшие к профилю.

TF-IDF для текстового контента

Если контент текстовый (описания, теги, рецензии), нужно превратить текст в числовой вектор. TF-IDF (Term Frequency — Inverse Document Frequency) — классический способ:

TF-IDF(t,d)=TF(t,d)logNDF(t)\text{TF-IDF}(t, d) = \text{TF}(t, d) \cdot \log \frac{N}{\text{DF}(t)}

TF — частота термина в документе, DF — в скольких документах встречается, N — всего документов

  • Частые слова в конкретном документе → высокий TF
  • Редкие слова во всей коллекции → высокий IDF
  • Результат: слова, уникальные для документа, получают высокий вес
  • Стоп-слова («и», «в», «на») получают низкий IDF → автоматически подавляются

Cosine Similarity

Имея профиль пользователя и вектор товара, считаем сходство через косинус угла:

sim(profileu,itemi)=profileuitemiprofileuitemi\text{sim}(\text{profile}_u, \text{item}_i) = \frac{\text{profile}_u \cdot \text{item}_i}{\|\text{profile}_u\| \cdot \|\text{item}_i\|}

Cosine similarity не зависит от длины вектора — только от направления. Это важно: длинное описание товара не получит преимущества над коротким. Рекомендуем товары с наибольшим сходством.

Feature Engineering для товаров

Качество контентной фильтрации напрямую зависит от того, насколько хорошо мы описали товары:

  • Категории и жанры — one-hot encoding (боевик, комедия, драма)
  • Теги — bag-of-words или TF-IDF (хорошо для музыки, статей)
  • Ценовой сегмент — бакетизация (эконом, средний, премиум)
  • Бренд / автор / режиссёр — важный сигнал для формирования вкуса
  • Числовые характеристики — длительность, год выпуска, рейтинг
  • Всё вместе — конкатенация разнотипных фичей в один вектор

Embeddings контента

TF-IDF — хорошо, но не улавливает семантику. «Весёлая комедия» и «смешной фильм» — разные слова, но одинаковый смысл. Нейросетевые эмбеддинги решают эту проблему:

  • Word2Vec / FastText — эмбеддинги слов, усредняем по тексту описания
  • BERT / Sentence-BERT — контекстные эмбеддинги всего предложения, лучше улавливают смысл
  • CNN (ResNet, EfficientNet) — эмбеддинги изображений товаров (одежда, мебель, еда)
  • Мультимодальные: CLIP — совмещает текст и изображения в одном пространстве

Предобученные модели можно использовать «из коробки» — не нужно обучать с нуля. Просто прогоняем описание/картинку через модель и получаем вектор.

Преимущества и недостатки

Преимущества

  • Нет cold start для новых товаров — достаточно описания, не нужны оценки других пользователей
  • Объяснимость — «рекомендуем, потому что вам нравились боевики» понятно пользователю
  • Независимость от других пользователей — работает даже с одним пользователем
  • Рекомендует нишевые товары — не зависит от популярности

Недостатки

  • Ограничена свойствами — если фичи товаров описаны плохо, рекомендации будут плохими
  • Filter bubble — рекомендует «больше того же самого», пользователь застревает в пузыре
  • Нет serendipity — не может удивить неожиданной рекомендацией из другой категории
  • Cold start для пользователей — пока пользователь ничего не оценил, профиль пустой
  • Нужна ручная работа по описанию товаров (feature engineering)

Cold start: товары vs пользователи

Контентная фильтрация НЕ страдает от cold start товаров — новый товар сразу имеет описание/фичи и может быть рекомендован. Но СТРАДАЕТ от cold start пользователей — без истории взаимодействий невозможно построить профиль. Это зеркальная ситуация по сравнению с коллаборативной фильтрацией.

Итого

  • Контентная фильтрация рекомендует на основе свойств товаров, а не поведения других
  • Профиль пользователя = взвешенное среднее фичей понравившихся товаров
  • TF-IDF — классика для текста, cosine similarity — для измерения сходства
  • Нейросетевые эмбеддинги (BERT, CNN, CLIP) дают семантическое понимание контента
  • Плюсы: нет cold start товаров, объяснимость, работа с нишевыми товарами
  • Минусы: filter bubble, нет serendipity, cold start пользователей
  • На практике — часть гибридной системы, комбинируется с коллаборативной фильтрацией