Искусство голосовать: использование НЛП для прогнозирования голосов на основе заголовка
Мои любимые проекты — те, которые пытаются осмыслить человеческое поведение и действия. Будь то попытка предсказать самый популярный день недели для проката велосипедов или уровень образования имеет какое-либо отношение к тому, предпочитает ли человек оригинальную трилогию «Звездных войн».
Онлайн-взаимодействия, особенно на форумах, интересны тем, что они пассивны и несколько невидимы. Простое «нравится» или «проголосовать» может быть преднамеренным или бессмысленным. В отличие от Facebook и Instagram, форумы в основном анонимны. Этот факт делает такие места, как Reddit и Hacker News, особенно интересными.
Цель
Моя цель в этом проекте — предсказать количество голосов, которые получат статьи Hacker News на основе их заголовков. Поскольку отзывы являются показателем популярности, я хочу выяснить, какие типы статей пользуются наибольшей популярностью среди пользователей.
Данные
Данные, используемые для этого проекта, представляют собой материалы, которые пользователи отправляли в Hacker News с 2006 по 2015 год. Эти данные были извлечены разработчиком Арно Дризардом с использованием Hacker News API, и их можно найти здесь.
Я случайным образом выбрал 300 строк из данных и удалил лишние столбцы, кроме времени отправки, отзывов, URL-адреса и заголовка.
А теперь самое интересное, НЛП! 😎
Я решил использовать модель мешка слов, которая описывает появление слов в документе или, в нашем случае, заголовок. Это включает в себя следующие шаги:
- Маркируйте каждый заголовок
- Создание коллекции или «словаря» уникальных слов
- Создание матрицы мешка слов
- Оценка каждого слова в заголовках
- Управление словарным запасом
Токенизация
Первый шаг — токенизировать каждый заголовок. Каждый заголовок представлен отдельной строкой. Токенизация включает в себя разделение этих отдельных строк на несколько строк отдельных слов (токенов) в заголовке. Это необходимо для последующего создания словарного запаса и матрицы набора слов.
Создание вектора словаря и набора слов
Каждое уникальное слово становится частью словаря. Я решил превратить словарь в фрейм данных 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. Это все еще большая ошибка. Заголовки могут быть не лучшим показателем для прогнозирования голосов, поскольку они не обязательно указывают на активность постов. Количество комментариев и время отправки могут быть лучшими функциями для использования.
Возможно, во второй части?