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

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

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

Выше приведена типичная страница на Reddit.com. Мы видим, что каждая строка представляет собой сообщение. Мы хотим знать, к какому субреддиту принадлежит каждый пост. В этой статье мы упростим эту проблему до разделения на 2 субреддита: Настольные игры и Настоящие Реддиты.

Вот шаги, которые мы предприняли:

  1. Удалите комментарии двух субреддитов с соответствующих страниц субреддита и сохраните их в виде CSV-файлов.
  2. Импортируйте ваши CSV-файлы в Panda DataFrames и отметьте «Настольные игры» новым столбцом с названием «класс» как 1 и «Настоящие Reddits» как 0. Объедините эти два DataFrames вместе для классификации.
  3. Используйте CountVectorizer() или TfidfVectorizer() для векторизации содержимого поста.
  4. Поместите векторизованные данные в модели (для этого проекта я использовал классификатор случайного леса и классификатор логистической регрессии)
  5. Оцените модели и их характеристики.

Некоторые комментарии и замечания по шагам:

  1. Мы использовали API для сбора данных. Язык называется JASON, для запуска: res = request.get(URL)
  2. Нам нужно собрать достаточно данных для классификации, обычно 1000 образцов — это хорошее число. Чтобы достичь этого, нам нужно очистить не менее 25 страниц, потому что reddit.com ограничивает 40 сообщений на запрос. Ссылка на следующую страницу сохраняется для каждой страницы. Таким образом, мы могли бы использовать текущую страницу, чтобы получить ссылку на следующую страницу.
  3. После каждого парсинга субреддита мы сохраняем посты в CSV-файл, чтобы нам не нужно было парсить каждый раз, когда мы запускаем модель.
  4. Векторизатор Count и векторизатор Tfidf очень похожи, они вычисляют повторение каждого слова в контексте и используют каждое слово/комбинацию слов в качестве столбца для будущего анализа.
  5. Классификаторы случайного леса и логистической регрессии являются хорошими моделями классификации. Случайный лес может выполнять более точную работу по классификации, в то время как логистическую регрессию легче интерпретировать. Чтобы быть более конкретным, логистическая регрессия сообщает, насколько значимо определенное слово в классификации (к какому субреддиту принадлежит сообщение).
  6. Некоторые интересные выводы об оптимизации моделей. Это может показаться слишком глубоким для тех, кто только начал, но очень полезным, когда вы продвинетесь немного дальше в машинном обучении. Так что я все же хочу упомянуть о них. На диаграмме ниже показаны метрики до и после оптимизации параметров:

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

7. В этом случае нас не слишком волнуют ложноположительные или ложноотрицательные результаты, поэтому точность является нашим эталоном, а точность, полнота и оценка f1 используются в качестве эталона для оценки.