Анализ беседы веганов в Твиттере с помощью НЛП и тематического моделирования
Введение 📄
Это сообщение в блоге соответствует моему третьему индивидуальному проекту в Metis. Сам проект представляет собой исследование текстовых данных с помощью обработки естественного языка (NLP) и обучения без учителя. В моем конкретном проекте использовались твиты с ключевым словом «веган» за период с 2016 по 2020 год, чтобы понять веганский диалог за последние пять лет. В этом сообщении блога я рассмотрю следующие темы:
- Парсинг твитов с помощью Twitter API и snscrape
- НЛП: NLTK, векторизация подсчета, токенизация и стемминг
- Тематическое моделирование: LDA и NMF
- Визуализации: t-SNE и Seaborn
Фон 🔍
Я придерживаюсь растительной диеты больше года и, оттачивая проект НЛП, подумал, что было бы забавно заглянуть в беседу о веганах в Твиттере. Люди в первую очередь становятся веганами по трем причинам: их здоровье, окружающая среда и животные. Итак, я надеялся, что эти категории появятся после моделирования темы. Давай займемся этим ...
Сбор твитов: Twitter API против snscrape 🐦
Изначально я собирал твиты с помощью Twitter API. Было довольно интересно изучить функциональность потоковой передачи в API (сбор твитов на основе определенного ключевого слова, когда они публикуются в твиттере). Однако для моего проекта мне потребовались архивные твиты, и именно здесь Twitter API потерпел неудачу. Имея самый простой, бесплатный доступ, я мог собирать информацию только в течение прошлой недели, и было ограничение на количество твитов, которые я мог собрать.
Для анализа мне нужно было больше информации, поэтому на помощь пришел snscrape. Нет необходимости в токене доступа или ключе API, а также легко получить доступ к общедоступным твитам в любой период времени.
После установки snscrape мне оставалось просто манипулировать одной строчкой кода, чтобы собрать то, что мне было нужно. Это пример того, что я использовал:
snscrape --jsonl --max-results 8000 twitter-search "#vegan since:2019-06-01 until:2019-08-01" > Data/t2w2019.txt
- snscrape - вызывает пакет
- jsonl - возвращает результат в формате JSONL (включает дополнительную информацию, такую как местоположение, статус ретвита, количество ретвитов и т. д.)
- - max-results # - указывает, сколько твитов возвращать
- twitter-search - указывает, как искать твиты (для поиска хэштегов используйте twitter-hashtag)
- #vegan с: 2019-06-01 до: 2019-08-01 - эта фраза вводится в поиске, поэтому я искал ключевое слово "веган" между этими конкретными датами.
- ›- укажите место сохранения информации после угловой скобки.
Я изменил этот запрос, чтобы собирать твиты за разные годы, но затем применил функцию txt_to_df (), которую я определил, чтобы создать конвейер, который преобразует эти файлы в DataFrame только с той конкретной информацией, которая меня интересовала. Вы можете погрузиться в код здесь.
Обработка естественного языка (NLP) 📚
Процесс НЛП включал в себя множество настроек, но были некоторые базовые концепции, которые действительно помогли мне погрузиться в проект. Я открою несколько советов, когда расскажу о своем процессе и о том, что я узнал.
Во-первых, существует несколько различных библиотек, которые делают возможным НЛП: NLTK, SpaCy, Gensim и некоторые другие. Для этого проекта я использовал NLTK, поэтому, если эта конкретная библиотека вам интересна, продолжайте читать. Кроме того, мой первый совет - создать класс конвейера НЛП, чтобы сэкономить время при доработке модели. Вот - тот, который я использовал в своем проекте с помощью инструкторов Метис.
Для начала вам понадобится корпус (собрание документов) документов (фраза для описания ваших текстов; моими документами были твиты). Библиотека NLTK имеет множество возможностей, при этом токенизация является одной из наиболее важных функций для моих целей. При токенизации документ разбивается на токены (это могут быть слова, предложения, биграммы и т. Д.), Которые затем передаются в векторизатор, создавая вектор для каждого документа, содержащий информацию о токенах. Самый простой векторизатор - это Векторизатор подсчета. Этот векторизатор превращает документ в вектор счетчиков каждого токена в этом документе. В результате получается разреженная матрица, состоящая в основном из нулей. Если вы разработали проект НЛП, вы, вероятно, знаете все эти термины, но когда я начинал, эти термины были чужими, и наличие базового описания действительно помогло.
Перейдем к конвейеру. Конвейер удобен тем, что для обработки документов используются различные токенизаторы и стеммеры, а также важна настройка функции очистки на основе документов. Небольшое примечание: стеммер помогает разбить похожие слова на один токен (т. Е. Бег, бег и бег будут сокращены до их основы: бег).
Важно отметить, что документы и желаемый результат могут отличаться от проекта к проекту, поэтому ни один конкретный токенизатор, стеммер или функция очистки не подходят для всего. Тем не менее, я обнаружил Tweet Tokenizer примерно через пять дней после начала работы над своим проектом, и он мне очень помог .
Итак, что в итоге сработало для меня? Моей целью было создать темы среди твитов, поэтому мой векторизатор был векторизатором TF-IDF (термин «частота-инверсия частоты документа»). TF-IDF ранжирует токены, которые встречаются во многих документах, ниже, что снижает важность универсальных терминов. Очевидно, что Tweet Tokenizer был потрясающим, что помогло понять структуру твитов, чтобы лучше токенизировать. Наконец, было важно настроить стоп-слова, которые представляют собой такие слова, как «то» и «или», которые не имеют значения, но я добавил «веган», поскольку этот термин не имеет значения, когда все твиты посвящены веганству. Некоторое дополнительное исследование побудило меня добавить больше слов к стоп-словам, что помогло моделировать тему.
Вот фрагмент моего кода, в котором используется созданный мной класс NLPPipe:
nlp = NLPPipe(vectorizer=TfidfVectorizer(stop_words=stopwords, max_df=0.80, min_df=10), tokenizer=TweetTokenizer().tokenize, stemmer=SnowballStemmer("english"), cleaning_function=tweet_clean1)
Еще один совет: в векторизаторе вы можете использовать max_df и min_df, чтобы векторизатор игнорировал токены, которые появляются выше и ниже определенного порога в документах.
Тематическое моделирование 🐖
Тематическое моделирование было большим развлечением в рамках этого проекта. Я сравнил LDA и NMF, но в конечном итоге остановился на NMF в своих последних темах. LDA (скрытое распределение Дирихле) на самом базовом уровне назначает темы словам, а затем возвращает вероятность того, что документ находится в определенной теме, на основе слов в этом документе. Есть очень хороший пакет под названием pyLDAvis, который делает визуализацию тем с помощью LDA чрезвычайно простой. Однако известно, что процесс LDA лучше работает с большими документами, поэтому я выбрал NMF.
NMF (неотрицательная матричная факторизация) использует линейную алгебру и концепцию матричного умножения, чтобы уменьшить возможности матрицы документ-термин для создания тем. На изображении ниже показано, как работает SVD (разложение по сингулярным числам), которое является основой NMF.
Применив это к проекту, я смог указать, сколько тем я хотел создать, и NMF предоставил матрицу документ-тема с вероятностями того, что каждый документ будет помечен как конкретная тема. Здесь очень важен человеческий фактор, нужно смотреть на слова в темах, чтобы решить, о чем идет речь.
Посмотрев на свои темы, я понял, что мне нужно настроить свой конвейер. Я бы добавил стоп-слова, которые появлялись в нескольких темах и не имели значения, я бы изменил количество тем через NMF, чтобы увидеть, как темы будут меняться по мере добавления новых, и я даже изменил свою функцию очистки, чтобы полностью удалить упоминания, чтобы я не В моих темах нет имени пользователя Twitter. Кроме того, я использовал свои знания в предметной области, чтобы понять, что слова «невозможно» и «сверх» относятся к компаниям по производству веганских продуктов питания, а не к английскому определению этих терминов.
В итоге было выделено 23 темы, которые имели смысл, которые я разделил на более широкие категории.
Визуализации и результаты 📈
Когда все мои документы были разбиты по темам, пришло время сделать некоторые выводы. Для тематического моделирования очень часто используется t-SNE для визуализации результатов. t-SNE - это алгоритм, который упрощает и упрощает визуализацию многомерных данных в двух измерениях. Это не обязательно сокращение размеров, потому что алгоритм пытается подчеркнуть разделение данных, но это отличный способ создать базовые визуальные эффекты для данных более высокого измерения.
Алгоритм t-SNE был самым трудоемким алгоритмом проекта (с точки зрения вычислений), но он предоставлял координаты x и y для каждого документа, чтобы облегчить построение графиков. Ниже показано развитие моего корпуса с течением времени, визуализированное с помощью t-SNE и построенное с помощью seaborn. Взгляните в нижний правый угол, и вы увидите темы «Поддельные продукты» и «Активность животных», которые станут предметом обсуждения в 2020 году.
Используя свои данные, я также подсчитал процент документов в каждой теме, в которых подчеркивалась точка на предыдущем гифке с помощью линейной диаграммы.
Мне показалось интересным, как веганы начали больше говорить об активности животных наряду с «поддельной» едой, хотя сама по себе тенденция к «поддельной» еде не была слишком удивительной.
Заключение ✏️
Из всех моих проектов на данный момент это был, безусловно, самый исследовательский. Не было никакого значения R², которое можно было бы превзойти, или каких-либо показателей запоминания, которые нужно было увеличить, это был просто проект по обучению на основе текста. Интересно видеть, что во время анализа не проявилась «экологическая» тема, тем более что мир так озабочен окружающей средой, но я полагаю, что веганы Twitter больше озабочены животными и едой, которую они едят.
В любом случае, если вы изучаете НЛП или начинаете собственный проект, я надеюсь, что этот блог помог.
Некоторые ключевые выводы:
- У сообщества разработчиков Python с открытым исходным кодом есть решение для вас (если бы я знал о токенизаторе твитов раньше)
- Создайте конвейер НЛП (это сэкономит время в долгосрочной перспективе)
- Не бойтесь тратить время на исследовательский проект, это часть веселья.
Загляните в репозиторий Github, чтобы найти весь код проекта. Я стараюсь, чтобы мои записные книжки были простыми в использовании, но признаю, что эти записные книжки не такие чистые, как другие мои проекты.
Пока я пишу это, у меня осталась всего одна неделя на учебный курс по науке о данных Metis. Это был ураган информации, и я надеюсь расширить эту основу и держать вас всех в курсе на этом пути. Не стесняйтесь проверить блог о моем третьем проекте, в котором рассказывается о конкурсе Kaggle и мошенничестве с кредитными картами. Кроме того, возвращайтесь за обновлениями, пока я продолжаю путешествовать по миру науки о данных.