CoderCastrov logo
CoderCastrov
Data Science - Анализ данных

Краткое описание проекта - Вовлеченность в астрологию на Reddit

Краткое описание проекта - Вовлеченность в астрологию на Reddit
просмотров
6 мин чтение
#Data Science - Анализ данных

В рамках этого проекта по курсу Data Science мне была поставлена задача определить, как создать пост, который получит высокую вовлеченность на Reddit. Я выбрал для анализа конкретный субреддит r/astrology. Для выполнения этого проекта мне потребовалось получить данные с Reddit, извлечь необходимые данные, проанализировать их, создать и интерпретировать модель, поддерживающую поставленную задачу. Все ссылки на программирование относятся к Python и библиотекам Python, если не указано иное. Вот пошаговая инструкция.

Начало работы

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

Исходные данные

Для анализа мне понадобилось четыре категории данных для каждого сообщения:

Все это можно получить различными способами, включая:

Я начал с попытки прямого парсинга веб-страниц.

Получение данных

Начинается приключение. Моя задача состояла в сборе данных из 10 000 сообщений.

При загрузке подраздела r/astrology я получил список сообщений, содержащих все необходимое, включая заголовок сообщения, текст сообщения, количество комментариев и дату создания. Я подумал: "насколько это сложно?", и приступил к ручному парсингу. Мало я знал, какие трудности меня ожидают:

После всего этого у меня наконец-то было чуть более 10 000 сообщений. Последний парсинг был завершен менее чем за 24 часа до сдачи проекта. К счастью, я смог завершить большую часть оставшейся работы до этого на более маленькой выборке данных, которую я собрал в самом начале.

Касательная - Важно ли прошлое?

Открытие того, что многие посты, архивированные для API Pushshift, были удалены с Reddit (как указано в посте: либо модераторами, либо удалены авторами), отправило меня на философскую касательную в значении истории и ее актуальности в эпоху всеобщего интернета.

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

Затем я задался вопросом, почему так много постов Pushshift, при попытке прямой ссылки, отображаются как удаленные. Это легитимные удаления? Или есть иные причины для удаления этих постов? Может быть, Reddit пытается сэкономить дисковое пространство, удаляя старые данные, предполагая, что никто не обращает внимания на старые посты? Есть ли у Reddit другие причины для удаления старых постов? Reddit уже ограничивает доступность к старым постам: нет поиска по дате, нет прокрутки за 1000 постов на странице, ограничение фильтров на "горячие", "новые" и "популярные", все из которых приоритезируют более свежие посты...

В любом случае, вместо того, чтобы продолжать серьезную речь, я оставлю это для размышления. Раньше я думал, что очень сложно удалить данные из интернета, но оказывается, это может быть действительно легко. Один мой клиент-музыкант решил внезапно удалить свой весь прошлый каталог с Spotify, потому что, как он сказал (я парафразирую), "эта прошлая музыка уже не отражает того, как я хочу представлять себя миру". Ну, я любил эту музыку, и я хочу ее вернуть! И не является ли это частью истории теперь... выражение одного человека, воплощенное в материальной форме? Не следует ли это сохранить? По крайней мере, сохранить для меня? Если бы я мог вернуться в прошлое, я бы себе записал CD, но потоковое воспроизведение в интернете настолько всеобще, что я даже не могу найти эту музыку для загрузки! Вздох...

Очистка данных и исследование

Очистка данных Reddit не была большой проблемой. Я написал скрипт, который использовал библиотеку парсинга HTML на Python - Beautiful Soup, чтобы извлечь нужные данные с веб-сайта (после ручного поиска тегов и атрибутов в исходном коде). Затем я удалил дубликаты (сравнивая заголовок и текст сообщения) и рекламу (которая не имела поля с датой).

Хотя я собрал более 10 000 сообщений во время парсинга, избавление от рекламы и дубликатов сократило их до примерно 9000. Ну что ж, оказалось, что все результаты, полученные из 9000 сообщений, очень похожи на результаты, полученные из примерно 7000 сообщений при моделировании в предпоследнем раунде парсинга.

Даты были отформатированы как время, прошедшее с момента публикации, поэтому у меня были записи вроде "4 дня" и "1 год". Я преобразовал их в фактическую дату, используя грубый расчет (который не был таким точным, как я хотел, но, увы... ограничения времени) и преобразовал в объект datetime, чтобы в дальнейшем получить более подробную информацию. Оказалось, что это не имело особого значения (при исследовании было выяснено, что время практически не коррелирует с количеством комментариев).

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

Моделирование

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

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

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

Из каждой модели я извлек слова, которые использовались в наиболее точных предсказаниях. Это было просветительно, так как модели 1 и 2 имели более низкие показатели точности, но дали мне очень интересные, актуальные и действенные результаты. У меня были слова (и фразы) вроде "кто-нибудь еще", "говорить", "думать", "интерпретировать", "понимать", "Стрелец", "Козерог" и другие, которые появлялись как в списке слов в заголовке, так и в теле сообщения. Эти слова определенно представляли вовлеченность, при этом определенные слова, такие как "кто-нибудь еще" или "интерпретировать", действовали как призывы к действию, "Стрелец" или "Козерог" обозначали отношения с конкретной группой, а "думать" или "говорить" представляли коммуникацию или вовлеченность. Это имело смысл, что слова вроде этих могут привлечь больше вовлеченности читателей.

С другой стороны, модель 3, которая включала гораздо больше функций, чем только текст, показала гораздо более высокую точность, чем первые две модели, но предоставила гораздо меньше материала для работы. Бессмысленный текст, такой как числа ("00" было одним из самых точных слов), и неинтересные слова, такие как "работа", "вещь", "полный" и "слышал", были связаны с более высокой точностью в этой модели. Хотя модель могла быть более точной, она была менее применима на практике, так как ее рекомендации по контенту имели мало смысла или казались слишком широкими и нефокусированными.

Заключение

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