Рекомендательная система постов для ленты социальной сети / RecSys for a social network feed
- Цель проекта
- Этапы проекта
- В планах
- Технологии
- Структура репозитория
- Попробовать
- Скачать данные
- Развернуть приложение
- Поддержка
Создание контентной рекомендательной системы постов для ленты социальной сети. При регистрации пользователи заполняют данные своего профиля. Так же платформа обладает лентой, которую пользователи могут листать и просматривать случайные записи случайных сообществ. Если пост нравится, можно поддержать автора и поставить like. Все действия пользователей сохраняются, каждая их активность, связанная с просмотром постов, записывается в базу.
Реализованный RESP API сервис позволяет рекомендовать пользователю посты. Доступен endpoint для сравнения рекомендаций модели со случайными для проведения AB эксперимента.
- Реализация подключения к PostgreSQL базе и загрузка данных. Изначально планировалось загружать чанками, т.к. Pandas при выполнении SQL запроса требует в 4 раза больше памяти чем размер данных и одна из таблиц достаточно большая. Но в итоге её полностью загружать не пришлось и решение упростил. Также создал FastAPI сервис и эндпоинт для получения рекомендаций, который будет принимает параметры
id
иlimit
и возвращать топlimit
рекомендованных постов для пользователя с указаннымid
. - Создание бэйзлайн модели для рекомендации постов на основании числовых и категориальных признаков. Обработка признаков, кодирование, эксперименты с разными "деревянными" моделями Sklearn. Остановился на CatBoost, т.к. он дал лучший AUC.
- Улучшение модели с помощью обработки текста постов. Векторизовал текст энкодером трансформера BERT и добавлял эмбеддинги как числовые признаки. Также пробовал признак расстояния до центра кластера этих эмбеддингов. Но в итоге CatBoost опять же справился лучше с обработкой текста. Насколько я смог разобраться, подход также в векторизации и генерации признаков на основе LDA, KNN.
- Добавил эндпоинт для проведения АБ эксперимента между рекомендациями случайными и модели. Пользователи солятся по id с помощью MD5. Получил контрольную и тестовую группу, с помощью биномиального теста убедился, что разбиение соответствует требуемому. Метрика "число лайков на пользователя" распределена логнормально, поэтому применил критерий Манна-Уитни-Уилкоксона, показавший статистически значимое различие между группами.
- Попробовать разные параметры токенизации текста катбуст (лемматизация, stop слова)
- Попробовать векторы энкодера BERT в embeding features CatBoost
- Попробовать архитектуры DL комбинирующие контентный подход и факторизацию
- ...
- app - собственно код приложения
- data - структура таблиц БД и сэмплы данных
user_data
- пользователи и их признаки 163205 записейpost_text_df
- тексты постов и их категория 7023 записейfeed_data
- журнал взаимодействия пользователей с постами и информация о лайках. 76892800 записей
- train - ноутбук обучения модели. Также можно посмотреть на Kaggle
Попробовать сервис можно здесь Service API
Данные в формате csv
user_data - 11.25 Mb
post_text_df - 9.2 Mb
post_text_df - 2.68 Gb
-
Клонировать или загрузить репозиторий
git clone --depth 1 'https://github.com/avfawkes/SocialNet-RecSys.git' && rm -rf SocialNet-RecSys/.git
curl -L "https://github.com/avfawkes/SocialNet-RecSys/archive/main.tar.gz" | tar -xzf -
-
Переименовать
db_creds_template.yaml
вdb_creds.yaml
указав реквизиты доступа к БД -
Запустить
sudo docker compose up
Если у вас возникли сложности или вопросы, создайте обсуждение
в данном репозитории