В данной статье будет описан только общий алгоритм на примере Facebook. Однако такой же подход можно использовать повсюду.
Задача
На основе существующего контента (за последние 30 дней) на данной странице Facebook определить какие записи потенциально будут более популярными.
Теория
Первый, и пожалуй ключевой вопрос с которым я столкнулся — «Что такое популярность поста и как её расчитать?».
Обычно, под популярностью записи в соц.сети подразумевают количество лайков под ней. Но наш случай не обычный. Если просто опираться на количество лайков, то мы не сможем определить потенциально популярную запись до того, как она фактически станет таковой.
Иногда используют соотношение лайков/время публикации. Таким образом можно вичислить прирост лайков за секунду. И где прирост больше, то и будет наш результат. От части такой подход правильный, но только от части.
Дело в том что прирост лайков у записай не линейный. И чем дольше пост опубликован тем менее его лайкают. И нам нужно учитывать этот спад активности.
Формула для расчета получается следующая:
R = likes / (time^β)
Где β — наш коэффициент затухания. Его можно вычислить по формуле:
β = 1 / τ
Где τ — время в течении которого прирост лайков уменьшился в e раз.
Реализация
Нам понадобится:
- NodeJs, который будет каждый час загружать информацию об постах за последние 30 дней
- База данных, в которой будут храниться состояния записей предыдущего цикла
Алгоритм следующий:
- Загружаем записи из Facebook. Для каждой записи нам нужно:
- ID
- Время публикации
- Количество лайков
- Прирост лайков за час (этот параметр будем вычислять и дописывать сами)
- Найти и загрузить из БД состояние каждой записи, которое было сохранено во время предыдущего цикла (час назад)
- Вычисляем коэффициент спада индивидуально для каждой записи:
- Сравнив количество лайков текущего и предыдущего цикла, вычисляем прирост лайков за текущий час (ΔL)
- Теперь, когда у нас есть прирост лайков за текущий (ΔL) и предыдущий интервал (ΔpL) мы можем вычислить спад активности для текущей записи. Сделать это можно по формуле:
βp = 1 / ( (ΔpL - (ΔpL/e)) / ((ΔpL-ΔL)/time) )
Где time — количество секунд между запросами
- Вычисляем средний коэффициент спада (β) для всей страницы
- Вычисляем рейтинг для каждой записи по формуле
R = likes / (time^β)
- Вычисляем средний рейтинг для всей страницы
- Выбираем записи, чей индивидуальный рейтинг превышает среднее значение для страницы в 2 (или больше) раза.
- Сохраняем все записи в БД для следующей итерации. Не забудьте добавить поле со значением ΔL
Используя такой подход мы можем определить те записи, которые с наибольшей вероятностью в будущем будут вызывать больше интереса. При расчетах мы берём во внимание как дату публикации записи так и активность аудитории, что позволяет получить наиболее точные результаты.
Автор: Kozack