CoderCastrov logo
CoderCastrov
Питон

Парсинг Reddit для создания облака слов о Бразилии

Парсинг Reddit для создания облака слов о Бразилии
просмотров
5 мин чтение
#Питон

Недавно меня пригласили принять участие в исследовании психического здоровья, где было необходимо собрать тексты из большого количества публикаций на Reddit. Именно так я открыл для себя Praw, аббревиатуру от "Python Reddit API Wrapper", библиотеку на языке Python, разработанную для упрощения извлечения и отправки контента на Reddit. Фактически, именно так я открыл для себя сам Reddit. Я уже знал о платформе, но не представлял, насколько она большая.

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

Для исследования, о котором я упоминал ранее, мне нужно было найти определенные слова на субреддите r/depression. Это дало мне идею выполнить следующее упражнение: искать на Reddit слово "Brazil" (на английском языке, так как на португальском оно пишется "Brasil") и посмотреть, о чем пишет сообщество из других стран о нас.

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

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

PRAW

Прежде чем начать использовать PRAW, вам необходимо иметь учетную запись Reddit и создать бота по этому адресу:

reddit.com: Войти

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

www.reddit.com

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

ПОИСК САМЫХ ЧАСТО ВСТРЕЧАЮЩИХСЯ САБРЕДДИТОВ

Прежде всего, нам нужно импортировать библиотеки:

  • Praw: Используется для извлечения постов Reddit.
  • Pandas: Используется для манипулирования данными.
  • Numpy: Используется для поддержки многомерных массивов и матриц.
  • Pil: Библиотека для работы с изображениями.
  • Nltk: Библиотека для обработки естественного языка. Здесь мы будем использовать ее только для управления стоп-словами.
  • Wordcloud: Необходимо для создания и настройки облака слов.
  • Gensim: Используется для машинного обучения и статистических приложений, а здесь для управления стоп-словами.

Теперь мы подключимся к Reddit, используя Praw. Вам понадобятся идентификатор клиента и секретный ключ.

ОПРЕДЕЛЕНИЕ С ПОМОЩЬЮ ПОДРЕДДИТА, КОТОРЫЙ МЫ БУДЕМ ИСКАТЬ

Чтобы определить наш целевой подреддит, мы будем искать наше ключевое слово "Бразилия" во всех подреддитах, и выберем подреддит с наибольшим количеством вхождений и наименьшим количеством постов.

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

Вероятно, это приведет к списку, подобному приведенному ниже, но с более чем 200 подреддитами.

[‘selfie’,‘antimeme’, ‘transpositive’, ‘sehnsuchtpics’, ‘aww’, ‘BrasilOnReddit’,‘GachaClub’, ‘softwaregore’, ‘Cringetopia’, ‘science’, ‘COVID19’, ‘Basil_cult’, ‘lgbt’, ‘unexpectedsimpsons’, ‘worldnews’, ‘UFObelievers’, ‘worldnews’, ‘NoNewNormal’, ‘Brazil’]

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

Поэтому мы используем функцию groupby и функцию loc из библиотеки Pandas, чтобы отфильтровать подреддиты с наибольшим количеством вхождений. Затем мы попытаемся определить наиболее общий подреддит.

Теперь мы строим группируемую переменную с помощью Seaborn:

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

ПОИСК В СУБРЕДДИТЕ R/WORLDNEWS

Теперь мы создадим и выполним функцию для извлечения текстов с помощью PRAW:

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

Для этого я создал последовательность циклов для итерации по заголовкам, постам, комментариям и ответам, добавляя строки в списки.

Давайте сохраним raw_list и reading_list в два разных текстовых файла, которые я буду использовать во второй публикации этой публикации.

Если вы откроете текстовый файл readinglist, вы увидите такую ​​структуру:

Эта структура была организована для удобства чтения. Однако для нашего проекта NLP более полезны необработанные данные. Вот почему я создал два разных файла.

Создание нашего облака слов

Для создания облака слов я использовал библиотеку wordcloud и библиотеки Nltk и Gensim (последние две необходимы для создания списка стоп-слов).

В обработке естественного языка (NLP) нам нужно удалить бесполезные слова, которые используются только в качестве соединителей (такие как "the", "is", "itself", "my") в предложении. Они известны как стоп-слова.

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

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

Мы также должны создать наш набор стоп-слов, обновить его списками из Gensim и nltk (на этом этапе я также обновил его некоторыми ругательствами, которые я нашел в облаке).

Теперь, наконец, мы можем создать наше облако. Мы можем использовать matplotlib, чтобы визуализировать его.

Вуаля! Мы добрались до этого, и вот облако слов! Это графическое представление компиляции, содержащей более 1000 страниц текста, извлеченного из субреддита Worldnews.

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

Облако слов для документации по Python - документация wordcloud 1.8.1

Здесь вы найдете инструкции о том, как создавать облака слов с помощью моего проекта wordcloud на Python. По сравнению с другими облаками слов...

amueller.github.io

КОНЕЧНЫЕ КОММЕНТАРИИ:

Хорошо, теперь мы закончили первую часть нашего упражнения с данными Reddit. Если вы посмотрите на облако слов, вы найдете некоторые слова, которые обычно упоминаются в международных СМИ, когда речь идет о Бразилии.

Как бразилец, мне довольно интересно посмотреть, что иностранные обычные люди пишут о моей стране. Я знаю, что это не обязательно отражает международное представление о Бразилии. Но эта графическая представление из 90 слов является синтезом более 1000 страниц текста, в котором иностранные люди упоминают Бразилию, и, безусловно, отражает общественное восприятие Reddit о стране.

Вы также можете насладиться сообщениями, прочитав текстовый файл reading_list, который мы создали.

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