Вступление

Если вы новичок в Reddit, Reddit - это, по сути, большая группа публичных форумов, где пользователи могут много говорить о чем угодно. Поскольку существует множество таких публичных форумов, Reddit был назван главной страницей Интернета. На главной странице Интернета много людей публикуют сообщения на этих публичных форумах, также называемых сабреддитами. Согласно блогу Reddit, только в 2019 году у них было 199 миллионов сообщений и около 138 000 активных субреддитов. Как при таком большом количестве информации убедиться, что люди публикуют сообщения в правильных субреддитах? Что ж, они этого не делают. Итак, как Reddit может гарантировать, что сообщения попадают в соответствующий сабреддит? Через систему рекомендаций!

Что такое система рекомендаций?

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

Каковы преимущества внедрения системы рекомендаций Reddit?

  • Более чистые субреддиты.
  • Более точная реклама.
  • Уменьшите нагрузку на модераторов Reddit.
  • Более легкая публикация сообщений для пользователей.
  • Накопление огромных объемов текстовых данных.

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

Данные

Чтобы система рекомендаций дала точное представление о том, куда должна идти публикация, нам потребуется много данных. Я отобрал 31 299 сообщений с помощью Pushshift API из субреддитов r / MachineLearning и r / искусственный, всего 62 598 сообщений, включая заголовок сообщения и его содержание.

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

После очистки всех сообщений я должен подготовить эти данные для обработки естественного языка!

Поскольку я беру эти данные с первой страницы Интернета, мне пришлось выполнить несколько шагов по очистке, прежде чем перейти к процессу моделирования. Поскольку многие мои сообщения содержали ссылки, изображения, смайлы и другой текст, который я не мог использовать, мне пришлось удалить их, и я сделал это с помощью регулярного выражения. Regex - это инструмент, который позволяет делать многое, но я использовал его для замены текста. Поскольку такой символ, как «/ () {} \ [\] \ | @,;," не поможет в классификации сообщения. Я удалил их и просто заменил пробелом.

Еще одна распространенная задача НЛП - удалить стоп-слова, что я и сделал. Стоп-слова - это слова, не придающие особого значения предложению, например «они», «они», «есть» и т. Д.

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

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

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

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

Теперь данные чистые и готовы к моделированию. Прежде чем приступить к моделированию, нам нужно векторизовать наши слова. Используя CountVectorizer, я смог превратить мои скучные текстовые данные, которые я не мог использовать, в токенизированные версии этого текста, которые я могу использовать! Я не буду вдаваться в подробности того, что делает здесь CountVectorizer, но это отличный пост в блоге, в котором все подробно объясняется.

Поскольку данные векторизованы, я могу приступить к моделированию. Перед моделированием мне нужно было установить базовую оценку точности. Эта оценка составила 50%, так как у меня были идеально сбалансированные классы. Это был лучший результат!

Я выбрал три разные модели классификации для использования в этом проекте. Логистическая регрессия, полиномиальный наивный байесовский анализ и нейронная сеть с долговременной краткосрочной памятью (LSTM RNN). Одна из целей этого проекта состояла в том, чтобы увидеть, влияет ли содержание сообщения на оценку точности, поэтому я запустил модели только по заголовку, а затем по заголовку и содержанию сообщения.

Ниже мы можем увидеть оценки точности моделей, которые я использовал:

Полиномиальная наивная байесовская модель с поиском по сетке показала наивысшую точность - 86,15%! Это было увеличение на 36,15%.

На картинке ниже мы видим оценку точности, которую я смог достичь с помощью LSTM RNN:

Хотя этот показатель точности был на 4,55% меньше, чем у моей лучшей модели, это будет модель, которую я использую для своей производственной модели. Я считаю, что модель работала немного хуже, потому что я использовал только заголовки поста для этой модели. LSTM RNN сияют, когда они могут полностью понять последовательный характер данных. Итак, я считаю, что добавление содержания каждого сообщения значительно повысит этот балл. Я не мог проверить эту теорию из-за вычислительных ограничений и ограничений по времени.

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

Выводы

Поскольку я убедился, что даже с очень близкими темами я могу достичь показателя точности 81,60% на модели, у которой есть много возможностей для роста, я считаю, что это достаточно высокий показатель точности, чтобы продолжить дальнейшее развитие этого проекта.

Хотя я получил довольно приличную оценку точности для этих двух субреддитов, очень важно помнить, что эта модель была обучена только на этих двух субреддитах. Итак, возникает вопрос, действительно ли это возможно сделать со всеми субреддитами?

Будущие шаги

Чтобы иметь возможность самостоятельно классифицировать пост по мере его написания, мне понадобится много данных. В будущем я планирую очистить Reddit и вытащить по 2000 сообщений из каждого активного сабреддита. Согласно Reddit, существует только 138 000 активных сабреддитов, поэтому, если я вытащу только 2 000 постов из этих сабреддитов, у меня будет в общей сложности 276 миллионов постов для работы. Очистка этих сообщений займет некоторое время и займет много места. Очистка 276 миллионов сообщений и сбор 2000 сообщений из каждого субреддита займет около 24 часов с использованием многопоточного процесса очистки. Окончательный файл также будет иметь размер около 150 ГБ.

Как только эти данные будут собраны, я планирую разработать лучшую версию моей LSTM RNN, чтобы она могла со временем учиться со всеми собранными данными. Однако, прежде чем пытаться запустить модель для всех данных, я возьму 10 разных субреддитов и посмотрю, может ли моя модель предсказывать с удовлетворительной оценкой точности. Если эта модель не может превзойти базовый показатель точности, мы теперь будем знать, что этот проект невозможен. Если он действительно наберет этот балл, мы можем продолжить добавление субреддитов и масштабирование модели.

Если Reddit реализует эту идею, это пример макета того, как это потенциально может выглядеть:

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

В будущем я планирую добавить намного больше моделей, таких как случайный лес, SVM и оптимизировать текущую LSTM RNN, которая у меня есть. После добавления этих моделей я смогу определить, какая из производственных моделей классификации текста НЛП является лучшей для задачи создания эффективной и точной системы рекомендаций субреддитов.

Заключение

Я добавлю ссылку на GitHub, когда код будет завершен и доработан!

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