Разработка сайта, который будет рекомендовать книги, фильмы, сериалы и на Хабре
Link to Github/etc: https://github.com/TrybinD/MFDP-RecSys
MVP: https://trybind-mfdp-recsys-main-z5amqv.streamlit.app/
Идея - разработка сайта (пока сайт (так быстрее), в светлом будущем и мобильное приложение, потому что это кажется более подходящей реализацией:)), который будет рекомендовать книги, фильмы, сериалы, а еще может быть еще статьи, например, на Хабре, подкасты, курсы и многое многое другое в зависимости от того, сколько свободного времени есть у пользователя. Можно построить рекомендательную систему для нового контента и для контента, добавленного в "Избранное".
С одной стороны это будет похоже на "Смотреть позже" на Ютубе, только для любого контента - книги, фильмы, сериалы, статьи, подкасты и тд и тп. С другой стороны, это будет рекомендательная система для нового контента, на основе "Избранного".
Какую "боль" закрывает: У меня весь интересующий меня контент (книги, статьи, фильмы) разбросан по перепискам с самим собой, вкладкам в браузерах на телефоне и ПК и так далее. И, когда появляются 20-30 свободных минут, я могу их потратить на поиск и выбор того, что мне интересно прямо сейчас. А иногда хочется чего-то нового, но похожего на то, что тебе нравится.
Сценарий использования MVP:
В идеале оба вида рекомендаций должны быть основаны на времен и настроении пользователя, предсказывать, хочет пользователь сейчас, например, образовательного контента или расслабляющего.
Так как идея в том, чтобы рекомендовать в зависимости от количества свободного времени, то нужно иметь, как возможность рекомендовать что-то длинное - фильм, что-то относительно короткое - сериалы, или что-то не сильно привязаное ко времени - книги (статьи)
Данные: Книги - Book-Crossing Dataset (http://www2.informatik.uni-freiburg.de/~cziegler/BX/) (Будут переведены на русский)
Фильмы и сериалы Kion - RecSys Course Competition (https://ods.ai/competitions/competition-recsys-21/data)
Статьи: Хабр
На этапе MVP должен получиться сайт, с авторизацией, которая позволяет делать персонофицированные рекомендации и сохранять избранное. Сценарий пользования сайтам указан выше. MVP можно собрать на базе Streamlit, они даже предоставляют возможность деплоя сайта на их сервис, при условии, что сайт не будет потреблять много памяти. Ссылка на шаблон сайта с минимальным функционалом указан выше.
Вообще, в условиях нехватки данных для нового сервиса с новыми клиентами, есть желание построить модель, где, возможно, используются контекстуальные многорукие бандиты + классический RecSys. Из бонусов, данная иситема сможет подстраиваться на каждого уникального пользователя. Но пока будем использовать для начала открытые датасеты о книгах, фильмах и сериалах (потом можно собрать датасет по статьям на Хабре и подкастам на основе интеракций на сайте). А потом можно разработать алгоритмы онлайн-дообучения собрать маленькую тестовую группу, на которой проверить насколько хорошо работают эти алгоритмы обучения или настроить имитационную модель и проверять обучение на ней.
Дальше можно собирать информацию о паттернах поведения пользователя, распозновать эмоции и все это учитывать при рекомендации. Добавить функции планирования и составления расписания. Но это уже для других пилотов и релизов)
В качестве основной метрики того, что сайт работает хорошо можно использовать MAP@k. Эта обратная величина к этой метрике * 20 логичным образом может трактоваться, как средняя позиция валидной рекомендации пользователю. И чем больше метрика, тем меньше обратная величина, что говорит, что валидная рекомендация ближе к началу списка.
Здесь будет совсем краткий отчет, чтобы не загромождать основной README проекта с более менее финальными выводами. Более подробный отчет с ходом мысли (потому что кажется, что было бы интересно проследить за эволюцией моего решения + систематизировать проделанную работу) будет в отдельной README в папке src/models + я стараюсь аккуратно оформлять notebook`и c исследованиями, чтобы было приятно почитать) + Я вел MLFlow с экспериментами, но я не знаю как его удачно зашарить и где хранить всю инфу и артефакты (гит засорять не хочется), поэтому вставлял некоторые скрины в подробное описание. Если можете подсказать, как это удобно сделать, то я только рад поделиться результатами!
Придумал более менее удобную архитектуру под данный проект. Подробности в src/models. Если коротко, то обучение и рекомендации должны быть отдельно, так как модели учатся офлайн, а рекомендации идут онлайн. + рекомендации дложны быть исключительно на основе избранного у пользователя, а не его id или инфа про этого пользователя.
Я разбил весь контент на несколько непересекающися доменов (книги, сериалы, фильмы + статьи на Хабре) и для каждого из доменов провел эксперименты с подбором моделей. Для Книг и Фильмов - ALS модели, для сериалов модель на основе Косинусного Расстояния. Моделью для книг я доволен. Модели для сериалов и кино получились спорными, но рабочими. Сравнивал модели по показателям: MAP@10, скорость рекомндации, вес модели, адекватность рекомендаций. Подробнее - описано в src/models
Разработал адаптивный рекомендатор домена - чем больше пользователь выбирает тот или иной домен, тем чаще он всплывает в рекомендациях
Подобрал гипперпараметры для моделей для фильмов и сериалов с помощью Optuna
Написал несложную модель на основе схожести контента для рекомендаций статей на Хабре.
Кажется, что если соеденить теперь все эти части воедино, получится более менее рабочая рекомендательная система.
В папке src/models/models_storage лежат модели, обученные офлайн, которые будут использоваться с сервисе рекомендаций:
Кратко опишу, что было сделано в рамках подготовки MVP, потому что была проделана большая работа, но она немного остается в тени) Ссылка на MVP все та же!
Тех.доку писал по принципу, что ее будет читать человек, совершенно не знакомый с проектом. Я старался дать именно верхнеуровневое понимание работы кода, потому что детали по хорошему код должен говорить сам за себя)
Не совсем успел сделать прям все, что хотел, но мне кажется в общем и целом получилось вполне достойно. Хочу потом по чуть-чуть возвращаться к этому проекту, пробовать новые технологии и разные подходы, оттачивать и улучшать архитектуру и в целом улучшать и рефакторить проект!
Cookies help us deliver our services. By using our services, you agree to our use of cookies.