В данной статье будет описан только общий алгоритм на примере 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

Используя такой подход мы можем определить те записи, которые с наибольшей вероятностью в будущем будут вызывать больше интереса. При расчетах мы берём во внимание как дату публикации записи так и активность аудитории, что позволяет получить наиболее точные результаты.
Поделиться с друзьями
-->

Комментарии (8)


  1. el777
    20.12.2016 17:42
    +2

    Как результаты прогнозирования?


  1. seokirill
    20.12.2016 17:52

    Такое уже есть, стоит недорого. Чуть отличается. Новый взгляд все равно уместен.


  1. lair
    20.12.2016 17:53
    +2

    Логистическая регрессия, не?


  1. nikosias
    20.12.2016 18:11

    XGBoost Как мне кажется более уместен. Было бы не плохо добавить «Время» и «День недели» «Праздники/Будни»


  1. mikechips
    20.12.2016 22:23

    Некоторые записи абсолютно внезапно хайпают, и начинают набирать огромнейшее количество лайков, хотя перед этим были никому на фиг не нужны. Так что всё относительно


  1. KrasCoder
    21.12.2016 01:10

    Интересный взгляд на маркетинговое использование соцсетей. А вот насчет «выстреливающих» постов, мне кажется эти явления находятся вне статистической оценки и носят скорее синергетический характер.


  1. AlexUsov
    21.12.2016 11:15
    +2

    Еще было бы неплохо учитывать тех, КТО лайкает записи. И формировать коэффициент от 0 до 1 по каждому пользователю, на который умножать его лайк. Выявив пользователей, которые ставят лайк записям, которые в будущем становятся трендами, можно сделать много интересного.


  1. pirate_tony
    21.12.2016 16:37
    -1

    Похоже на необходимость прикладного применения akka/mongodb