Искусство голосовать: использование НЛП для прогнозирования голосов на основе заголовка

Мои любимые проекты — те, которые пытаются осмыслить человеческое поведение и действия. Будь то попытка предсказать самый популярный день недели для проката велосипедов или уровень образования имеет какое-либо отношение к тому, предпочитает ли человек оригинальную трилогию «Звездных войн».

Онлайн-взаимодействия, особенно на форумах, интересны тем, что они пассивны и несколько невидимы. Простое «нравится» или «проголосовать» может быть преднамеренным или бессмысленным. В отличие от Facebook и Instagram, форумы в основном анонимны. Этот факт делает такие места, как Reddit и Hacker News, особенно интересными.

Цель

Моя цель в этом проекте — предсказать количество голосов, которые получат статьи Hacker News на основе их заголовков. Поскольку отзывы являются показателем популярности, я хочу выяснить, какие типы статей пользуются наибольшей популярностью среди пользователей.

Данные

Данные, используемые для этого проекта, представляют собой материалы, которые пользователи отправляли в Hacker News с 2006 по 2015 год. Эти данные были извлечены разработчиком Арно Дризардом с использованием Hacker News API, и их можно найти здесь.

Я случайным образом выбрал 300 строк из данных и удалил лишние столбцы, кроме времени отправки, отзывов, URL-адреса и заголовка.

А теперь самое интересное, НЛП! 😎

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

  1. Маркируйте каждый заголовок
  2. Создание коллекции или «словаря» уникальных слов
  3. Создание матрицы мешка слов
  4. Оценка каждого слова в заголовках
  5. Управление словарным запасом

Токенизация

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

Создание вектора словаря и набора слов

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

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

Подсчет слов

Самый простой способ подсчета очков — подсчет появления каждого слова. Я использовал этот метод для заполнения матрицы.

Управление словарем

На данный момент у меня есть относительно большой фрейм данных. Один простой способ уменьшить это — удалить стоп-слова. Стоп-слова — это такие слова, как: a, and, the, it, is и т. д., которые не имеют никакого реального значения. Это должно уменьшить количество ошибок, рассчитанных в следующем разделе.

Тренировочные модели и прогнозирование

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

Линейная регрессия

Я буду использовать функцию scikit-learn train_test_split, чтобы разделить данные на наборы для обучения и тестирования. Я буду использовать 80% для обучения и 20% для тестирования, а в качестве метрики ошибки использую среднеквадратичную ошибку.

Я получаю MSE 2361,02, что приводит к RMSE 48,59. Это означает, что средняя ошибка отличается от истинного значения на 48,59 голосов. Учитывая, что среднее количество голосов за мои данные равно 10, это большая ошибка. Я попробую еще раз, используя модель случайного леса, чтобы посмотреть, поможет ли мне уменьшить количество ошибок более сложная модель.

Случайный лес

Использование случайного леса лишь незначительно повысило точность моей модели с ошибки 48,59 до 45,41. Это все еще большая ошибка. Заголовки могут быть не лучшим показателем для прогнозирования голосов, поскольку они не обязательно указывают на активность постов. Количество комментариев и время отправки могут быть лучшими функциями для использования.

Возможно, во второй части?