Обработка естественного языка — это то, что специалисты по данным используют для анализа текстовых данных. Да, данные могут быть словами, а не только числами. Справедливости ради, пока я буду принимать текстовые данные, я в конечном итоге преобразую их в числа, чтобы прогнать их через модели — но мы доберемся до этого.

Сегодня я рассмотрю данные из API reddit.com и построю модель на Python, которая предсказывает категорию поста на основе текста в каждом посте. Мой код см.: https://github.com/Laurarom7/Webscraping-NLP-Subreddits.

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

Я выбрал два сабреддита, посвященных упражнениям: /r/yoga и /r/climbing, так как я подумал, что могут быть интересные отличительные слова, такие как «поза» или «студия» и «скала» или «тренажерный зал».

Первое, что мне нужно было сделать, это получить доступ к веб-API Reddit, чтобы получить данные о том, что вы видите на веб-странице. Некоторые веб-сайты, такие как Reddit, имеют API (интерфейс прикладного программирования), что означает, что данные организованы таким образом, что я могу собрать их и определить части, которые я хочу проанализировать. Я выбрал заголовок и основной текст каждого поста и объединил их в один набор данных. Я продолжал собирать данные, пока у меня не было 1500 постов с примерно 50/50 разделением постов о йоге и скалолазании. Это гарантирует, что у меня есть сбалансированные классы данных, которые не будут опровергать мои прогнозы.

Чтобы изучить и очистить свои данные, я сначала проверил наличие нулей и обнаружил, что примерно в трети всех сообщений основной текст был пустым! Это может означать, что это просто заголовок и изображение, но мне нужен анализ текста, а мои модели не могут обрабатывать пустые значения. Я исправил их, заполнив пробелы «n/a», что-то, что модель распознает как текст, поэтому я не теряю эту большую часть данных, в которых все еще есть текст в заголовке.

Чтобы упростить текст, я использовал RegexTokenizer для удаления знаков препинания, а затем попробовал несколько лемматизаторов и стеммеров для преобразования слов в их корневые слова. Попробовав WordNetLemmatizer, PorterStemmer и EnglishStemmer, я решил использовать EnglishStemmer, потому что он, по крайней мере, преобразовал слово «лазание» в «лазать», хотя у него есть некоторые бесхитростные результаты, такие как преобразование «y» в «i», как это может быть. видно в примерах ниже:

Первоначальный текст:

EnglishStemmer:

Теперь пришло время преобразовать слова в числа. Я использовал CountVectorizer, чтобы преобразовать каждое слово в заголовках и разместить текст в отдельные столбцы. Каждый столбец слова содержит подсчет частоты появления слова. Я также удалил здесь стоп-слова — часто встречающиеся слова, которые не добавляют большой ориентировочной ценности, такие как «тогда», «до» и т. д. — а также столбцы «слов», которые были просто строками чисел. Наиболее часто встречающиеся слова в заголовке или тексте поста включали «йога» и «лазание». Вы заметите, что некоторые слова кажутся странными, например, «ani», «anyon», что является результатом грубого преобразования, которое выполняет EnglishStemmer).

Теперь, наконец, пришло время построить несколько моделей. Я использовал три модели классификации: классификатор K-ближайших соседей («KNN»), классификатор случайного леса и логистическую регрессию. Я использую модели классификации, потому что мы пытаемся предсказать, какой «класс» каждого поста — скалолазание или йога.

Модель KNN показала худшие результаты, хотя я искал наилучшее количество соседей для использования в качестве входных данных в модели. Логистическая регрессия и случайный лес (с ограничением глубины деревьев до оптимального значения, найденного с помощью GridSearch) показали хорошие результаты на основе показателей точности. Тем не менее, они оба были «переоснащены», то есть чрезмерно адаптированы к данным, используемым для «обучения» модели, по сравнению с данными, используемыми для «тестирования» модели. Это означает, что Random Forest предсказал правильный субреддит для 96,6% сообщений, которые использовались для построения модели, в то время как он правильно предсказал 95,5% сообщений, которые он раньше не видел.

Значения коэффициентов из логистической регрессии показывают нам лучшие слова для каждой категории (отрицательные значения — это коэффициенты йоги, а положительные значения — восхождение). Самыми популярными словами-предикторами для сабреддита о йоге были «комп» и само слово «йога». Точно так же и в скалолазании верхним словом было «подъем», за которым следовали «валун», «альпинист» и «тренажерный зал». Обратите внимание, что некоторые слова повторяются, потому что заголовок и текст сообщения были векторизованы (или преобразованы в числа) по отдельности.

В конце концов, мои модели случайного леса и логистической регрессии относительно легко различали и предсказывали эти две категории на основе общих слов, таких как «карабкаться» или «йога». Чтобы сделать эту модель более информативной и обобщить ее на другие категории, я мог бы:

  1. Проверьте, какие слова были бы лучшими предикторами, если бы исключить слова «скалолазание» и «йога».
  2. Используйте «ngrams» в CountVectorizer для подсчета фраз из 2 или 3 слов, а не только отдельных слов.
  3. Проверьте, помогает ли фото, количество комментариев или количество голосов предсказать категорию.
  4. Используйте другой векторизатор под названием TF-IDF (частота терминов, обратная частота документа), который возвращает пропорцию (а не просто количество) и учитывает, является ли слово общим или редким во всех сообщениях. Высокий TF-IDF означает, что он очень показательен для поста, в котором он появляется.
  5. Попробуйте другие модели, такие как полиномиальный наивный байесовский алгоритм.

В то время как основные слова, которые, как я думал, будут общими или показательными, названия поз, такие как «собака вниз» или «чатуранга» для йоги и «снаряжение» или «пик» для скалолазания, не были таковыми, это демонстрирует силу обработки естественного языка. Наш небольшой снимок опыта, который формирует наши ожидания, может быть неточным. Мы можем использовать этот опыт для построения модели, но вычислительная мощность машины выходит за рамки того, что могут видеть наши глаза!