В моем предыдущем посте я рассказал вам о процессе анализа данных для использования машинного обучения для кластеризации футбольных команд. В этом посте я покажу, как я использовал обработку естественного языка (NLP) и классификацию случайного леса для классификации сообщений Reddit из каналов субреддита Toyota и Honda. Мы определим, из какого субреддита пришло сообщение, используя только заголовок сообщения.

Чтобы справиться с этим, я использовал процесс науки о данных:

  • Определите проблему
  • Соберите данные
  • Очистите и исследуйте данные
  • Смоделируйте данные
  • Оцените модель
  • Ответьте на проблему

Определите проблему

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

Соберите данные

Данные были собраны из API Yelp с использованием библиотеки Python requests. API Yelp возвращает файл JSON с содержанием страницы. Вот пример того, как подключиться к API:

url = 'https://www.reddit.com/r/Honda/.json'
header = {'User-agent': 'Useragentname'}
res = requests.get(url,headers=header)
print("Connection status: ", res.status_code)
the_json = res.json()
print("Json Keys:",sorted(the_json.keys()))

Этот код напечатает статус code = 200, если соединение установлено, и ключи файла JSON будут проверяться. Если вы хотите получить данные из другого субреддита, просто измените URL-адрес.

Поскольку Reddit предоставляет 25 сообщений на запрос, я повторил пару раз, чтобы собрать 950 сообщений в каждом сабреддите. Я также использовал time.sleep() для создания паузы между запросами. Результаты были сохранены в файле csv. В этом проекте мне нужен только заголовок сообщения Reddit, но я также собрал и другие данные.

Очистите и исследуйте данные

Я удалил повторяющиеся значения из данных. Чтобы очистить текст, я создал специальную функцию для этого. Функция работает так:

  1. Преобразует символы в нижний регистр.
  2. Заменяет все не числовые и не алфавитные символы пробелом.
  3. Заменяет несколько пробелов только одним пробелом.
  4. Удаляет английские стоп-слова.

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

Чтобы изучить наиболее распространенные слова, я создал 2 облака слов.

Наиболее частыми словами являются несколько названий автомобилей и название автопроизводителя. Слово «помощь» больше (например, чаще) в Honda, чем в Toyota.

Смоделируйте данные

Я разделил данные на 75% для обучения и 25% для тестирования с использованием sklearn.model_selection.train_test_split(), а затем использовал sklearn.feature_extraction.text.CountVectorizer() для преобразования коллекции заголовков сообщений Reddit в матрицу количества токенов (то есть слов). Было 2681 уникальный токен, это означает, что обучающие данные состоят из кадра данных с 2681 столбцом и 1381 строкой. Значения в каждой строке - это количество слов в каждом сообщении.

Используя параметры по умолчанию из sklean.ensemble.RandomForestClassifier(), я подогнал модель по обучающим данным. Случайный лес построит дерево решений. Каждая узловая модель разбивает набор данных на два, случайно выбранную функцию, которая оптимизирует качество разделения с использованием критерия Джини.

Оцените модель

Оценка модели производилась с использованием показателей точности. Точность модели составила 90% при обучении, 77% при перекрестной проверке и тестировании данных. Модель является переобученной, что часто встречается в моделях случайного леса. Есть несколько вариантов уменьшения дисперсии, например ограничение размера дерева. Я построил график с наиболее важными коэффициентами.

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

Ответьте на проблему

В этом случае я смог с точностью около 77% предсказать, откуда пришел данный пост. Чтобы улучшить это, он должен: 1) анализировать заголовки и заменять смайлы текстом, который они представляют. 2) Включите дополнительные функции (например, текст и дату публикации). 3) Было бы также интересно создать модель на основе данных, не включающих название производителя автомобиля, чтобы понять, какие другие функции важны для режима.

Спасибо за прочтение! Код доступен здесь!