Задача № 2 – «Похожие сущности»

Как бы вы выбирали похожие сущности, которые могли бы максимально заинтересовать пользователя? Например, видео.

У вас есть ID и категории текущего видео. Пользователь может быть анонимом, а может быть зарегистрированным. Если он зарегистрированный, то у вас есть список его любимых видео. У каждого видео есть кол-во лайков и дислайков, кол-во просмотров. Видео хранится в базе данных “video”. Категории к видео хранятся в столбце под названием “categories” в виде ID этих категорий через запятую (1,23,40). Лайки - “likes”, дислайки - “dislikes”, просмотры - “views”.

Какой алгоритм, который бы работал в условиях высоких нагрузок, вы могли-бы предложить? Не обязательно использовать все данные.

Алгоритм

Была создана таблица video_popular, для каждого видео на основе лайков и дизлайков высчитывается баллы (Нижняя граница доверительного интервала Вильсона (Wilson) для параметра Бернулли) и записываются в video_popular

Данные в таблицу video_popular - записываются когда пользователь ставит Like или Dislike

Максимальное количество самых популярных видо для категории ограничивается константой MAX_POPULAR_VIDEO_IN_CATEGORY

Рекомендации выбираются из таблицы video_popular на основе категорий просматриваемого видео. Выводятся 5 случайных популярных видео для указанных категорий.

Что можно добавить

Вывод самых популярных видео для не авторизированных пользователей на главной старнице

Для авторизированных пользователей брать из понравившихся ему видео выбрать чаще всего встречающиеся категории и получит список самых популярных видео для них.

Что бы улучшить качество рекомендаций можно использовать "коллаборативную фильтрацию" на основе понравившихся пользователю видео

Генерацию популярных видео по расписанию а не при установке лайков и дизлайков