Прогнозирование популярности постов на основе почти 10 000 статей Towards Data Science.

Вдохновение

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

Когда я начал это путешествие, «На пути к науке о данных» был частым ресурсом из-за качества статей. Каждый пост говорил с такой ясностью, что даже я, абсолютный новичок, мог за ними уследить. Кроме того, красивые изображения и визуализация кода удерживали меня в плену, даже когда я терялся в тексте. Я смотрел на этих авторов с восхищением и стремился не только развивать аналогичные навыки, но и способность сообщать о них аналогичным образом.

Готовые продукты были прямо передо мной, но я хотел знать, как соединились ингредиенты. В частности, почему некоторые посты получили больше внимания, измеряемого в аплодисментах, чем другие? Что еще более важно, могу ли я смоделировать эту формулу успеха? Для моего второго проекта на учебном курсе по науке о данных Metis я решил найти рецепт создания идеального поста в блоге.

Код этого проекта можно найти здесь.

Сбор и обработка данных

Чтобы ответить на мой вопрос, мне нужны статьи. Сбор и форматирование их вручную для анализа было бы замечательным упражнением в неэффективности. Вместо этого я создал веб-скребок, используя Beautiful Soup и Selenium, чтобы сделать это за меня. Я использовал Beautiful Soup для извлечения URL-адресов статей из всех сообщений в архивах Towards Data Science за январь-июль 2020 года. Затем я использовал WebDriver для отображения этих страниц, чтобы я мог извлекать элементы HTML и Javascript. Наконец, я использовал Beautiful Soup и Pandas для форматирования каждого поста в фрейм данных, с которым я мог работать. Всего я собрал 9 969 постов.

Хлопки

Что сразу стало очевидным, так это то, что полученные посты внимания не следуют нормальному распределению. Хлопки вместо того, чтобы сформировать красивую кривую в форме колокола, образовали длинный правый хвост, подчеркивая, что несколько постов получают гораздо больше хлопков, чем остальные. Это, несомненно, подорвет линейную модель и предположение о гомоскедастичности, поскольку модель, по-видимому, будет намного дальше для самых популярных постов. Я мог бы удалить эти сообщения, чтобы сделать распределение более нормальным, но именно эти «выбросы» были именно тем, что меня больше всего интересовало. Вместо этого я решил сохранить весь образец и зарегистрировать хлопки преобразования.

Стандартные пост-функции

Одним из факторов интереса была общая структура штифта и эстетика. Эти функции включали количество разделов сообщений, изображений и блоков кода. Чтобы учесть любую путаницу с длиной поста (например, если у более длинных постов в целом было больше разделов), я также разработал коэффициенты, чтобы нормализовать их на основе длины поста.

Работа с текстом

Обработка естественного языка (НЛП) является одним из моих основных интересов, и этот набор данных предоставил идеальный образец для использования методов НЛП. Для обработки текста постов я использовал библиотеку spaCy. После токенизации постов, удаления стоп-слов/пунктуации и лемматизации я смог разработать множество функций, в том числе:

  • % предложений, содержащих пассивный залог
  • Средняя длина предложения и слова
  • Отношение уникальных слов к длине поста

Я также вышел за рамки поверхностного структурного элемента, чтобы выяснить, играет ли контент поста роль в его популярности. Я сделал это, используя латентный семантический анализ (LSA), метод моделирования темы. После создания матрицы термина «частота-обратная частота документа» (tf-idf) для всех сообщений, я использовал scikit-learn Truncated SVD, чтобы сократить матрицу до набора компонентов (т. е. тем). По сути, этот процесс присваивал баллы словам, основанным как на их частоте в посте, так и на частоте во всех постах, а затем уменьшал этот большой набор слов до функций, основанных на сходстве слов. Выбор количества тем для извлечения основывался на:

  1. Объясненная дисперсия по мере увеличения количества тем
  2. Изучение самых важных слов каждой темы и связанных с ними статей

В итоге я остановился на 16 возможных темах. Поскольку интерпретируемость была ключевой для этого проекта, мне нужен был отдельный набор функций. Хотя график показывает увеличение объясненной дисперсии до 100, изучение важности слов и большинства связанных статей по каждой теме начало показывать изрядное количество совпадений ближе к концу 25.

Результаты

Теперь, когда все функции были спроектированы, приступили к моделированию. Разделив данные на обучающие и тестовые наборы, я оценил различные регрессионные модели, а также случайный лес. Используя k-кратную перекрестную проверку на обучающем наборе, я сузил свой окончательный выбор до регрессии гребня или случайного леса.

После настройки гиперпараметров моделей гребня и случайного леса гребень показал себя немного лучше во время перекрестной проверки. Оценка тестового набора показала R²=.062 и MAE = 152,037 хлопков. Ниже приведены основные характеристики модели:

Структурно посты с большим количеством разделов, изображений и разнообразной лексики больше всего ассоциировались с большим количеством аплодисментов. В качестве альтернативы длина, более широкое использование пассивного голоса, большее соотношение раздела к изображению и блоки кода были связаны с меньшим количеством хлопков.

С точки зрения содержания, сообщения, наиболее тесно связанные с такими темами, как общие обзоры (например, ускоренные курсы, полевые руководства) и Pandas, как правило, вызывали больший интерес, чем сообщения, связанные с новостями (например, тенденциями в технологиях) и COVID-19 в частности. Ниже приведены 10 лучших слов из нескольких статей, наиболее связанных с темами, посвященными COVID-19 и общими обзорами, соответственно.

Выводы

Здесь есть несколько практических выводов:

  • Разбивайте посты на разделы
  • Используйте изображения
  • Сосредоточьтесь на лаконичности
  • Помните о пассивном залоге, когда пишете
  • Варьировать словарный запас
  • Контент, который учит › контент, который сообщает

Хотя эти элементы, по-видимому, имеют отношение к получению желанных аплодисментов, все же существует дисперсия, которую необходимо учитывать. Я с нетерпением жду возможности вернуться к этому, и мои следующие шаги будут касаться характеристик на уровне автора (например, количество подписчиков и частота публикаций), а также воздействия статьи в социальных сетях. Я надеюсь, что эти простые эвристики помогут начинающим авторам, таким как я, немного облегчить рассказ собственной истории.