Простой анализ настроений в связи со вспышкой нового коронавируса в 2019 году с использованием Twitter

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

В обществе возникла серьезная паника из-за известного Коронавируса (nCov-19). Поэтому в этой статье давайте посмотрим на уровень общественной паники и позитивного настроя (некоторых людей), которые публикуют твиты.

Загрузка данных

В этом эксперименте мы будем использовать твиты, опубликованные под хэштегами #coronavirus, # COVID19 и #CoronavirusOutbreak. Было отобрано 1000 твитов, начиная с 1 марта. Они будут сохранены как строка json в файл с именем data.json для облегчения анализа.

Кроме того, мы будем использовать данные из http://www.cs.jhu.edu/~mdredze/datasets/sentiment/ в учебных целях. Я использовал набор данных, в котором отзывы об элементах оценивались от 1 до 5 звезд. Я скачал файл processing_stars.tar.gz, распаковал и собрал все all_balanced.review файлы в подпапках по отдельному пути data/processed_stars_all.

Немного написав код, мы легко можем извлечь данные из твиттера. В этой статье я скачал 1000 твитов. Код будет выглядеть так:

Предварительная обработка данных

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

Токенизация

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

Удаление стоп-слов

Английский язык состоит из нескольких стоп-слов, которые добавляют смысл предложениям, но не контексту. Например, такие слова, как is are was has и т. Д., Не добавляют ценности для нашего варианта использования.

Нормализация лексики

Это процесс, при котором мы избавляемся от форм слов, сохраняя при этом единое представление. Например; play, play, playable и т. д. можно сократить до «играть» и сохранить основное значение.

Есть две формы этой нормализации.

  1. Стемминг - здесь мы избавляемся от аффиксов (префиксов и суффиксов). Пример, связанный со словом «play», попадает в эту категорию.
  2. Лемматизация - это то, что нам нужно для понимания контекста. Например, знание того, является ли слово существительным или глаголом, существенно влияет на корень слова. Например; сушилка может оказаться сухой, хотя на самом деле это существительное. В этой статье мы для простоты пропустим лемматизацию.

Обучение модели

Одной из отправных точек классификации машинного обучения является Наивный байесовский классификатор. В этой статье мы будем использовать полиномиальный наивный байесовский классификатор (MNB). Термин мультиномиальный важен, поскольку наш обучающий набор данных состоит из звездочек обзора (1–5 звезд), таким образом, имея 5 возможных меток.

Входы

Наши входные данные представлены в виде строк в файле в сжатом виде feature:<count> …. feature:<count> #label#:<label>. На первом этапе я создам предложения и передам их в формате TF-IDF. Этот формат обычно компенсирует частые слова, которые встречаются в нескольких документах. Эти слова обычно менее информативны из-за их большого количества. Я храню эти данные в pandas фрейме данных для упрощения запросов.

Обучение и прогнозирование

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

Обучение может быть выполнено путем подгонки наших данных в модель. В нашем случае это делает строка text_tf = tf.fit_transform(data[‘sentence’]). Мы выполняем прогнозы, преобразовывая наши данные Twitter в форму TF-IDF в text_tf_tw = tf.transform(sentences_processed_tw). Обратите внимание, что здесь мы используем предварительно обработанные тексты твитов. Это преобразование будет использовать слово корпус, которое мы использовали в обучении. Таким образом, новые слова или сленг твиттеров никак не повлияют на наш анализ. Мы делаем прогноз в строке predicted_tw = clf.predict(text_tf_tw).

Эта модель была точна только на ~ 70%, что не очень хорошо, но отличная модель для обучения и открытий. Большой набор данных с большим количеством терминологии социальных сетей действительно обеспечил бы лучшую подготовку и точность.

Интерпретация результатов

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

На этом графике цифры 1–5 на оси абсцисс соответствуют звездам или положительной природе. Таким образом, 1 относится к негативным настроениям, а 5 относится к позитивным настроениям. Мы ясно видим, что у людей есть идеи либо отрицательные, либо положительные, которые ясно представляют поляризованную природу общества (а может быть, и нет).

Возможные дальнейшие расширения

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

Я считаю, что вы хорошо прочитали и увидели потенциальную силу больших данных!

Спасибо за прочтение. Оставьте свои мысли, если вы нашли это заинтригованным.

Ваше здоровье!