"Обработка естественного языка"

AI, Sustainability Tweets: анализ настроений с использованием предварительно обученных моделей

Полный код доступен в моем репозитории Github

В последние несколько дней я сосредоточился на потенциале НЛП, в частности, на анализе настроений:

Пока что я провел обучение модели на части набора данных, который у меня есть (по сути, для стандартной практики). Однако НЛП настолько обширно и так сложно, что для того, чтобы хорошо работать с человеческим языком, его нужно обучать на гораздо большем наборе данных, чем просто 10 тысяч размеченных выборок.

Предварительно обученные модели

Современные библиотеки машинного обучения не только предлагают инструменты для создания модели с нуля. Они также предлагают обширный список моделей для конкретного использования. В этом конкретном случае я буду использовать 15 тысяч твитов, содержащих следующие хэштеги: #sustainable и #sustainability.

Шаги

  1. Твиты о майнинге
  2. Импорт модулей
  3. Предварительная обработка
  4. Предварительно обученная модель
  5. Анализ настроений
  6. Глядя на результаты

1. Твиты о майнинге

двойник

twint - это официальный модуль для Python, который не имеет тех же ограничений, что и официальный Twitter API, с точки зрения времени и объема.

*** Будьте осторожны при использовании этого инструмента, потому что вы можете нарушить Условия использования Twitter. Я буду использовать его с умом, загружая только минимальный объем (только 15 000 твитов) в течение указанного срока, чтобы придерживаться Условий обслуживания.

!pip3 install twint
import twint
#configure
c = twint.Config()
c.Search = '#sustainable', '#sustainability'
c.Store_csv = True
c.Limit = 10000 #appears not to be working
c.Output = "data.csv"

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

# Run
twint.run.Search(c)

2. Импорт модулей

nltk

Теперь мне нужно выбрать библиотеку для НЛП. Из-за его гибкости и преимуществ я буду использовать nltk.

!pip install nltk
import nltk
nltk.download('punkt')

3. Предварительная обработка

Набор данных твитов

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

import pandas as pd
total = pd.read_csv('/content/data.csv')
total = pd.DataFrame(total['tweet'])
total

4. Предварительно обученная модель.

Существует огромная библиотека моделей, которые вы можете скачать для решения конкретных задач НЛП по этой ссылке. Проверив список, можно увидеть, что модель, которая больше всего адаптируется к проблеме, которую я хочу решить, называется VADER Sentiment Lexicon, идентифицированная с помощью идентификатора vader_lexicon.

#nltk.download()
import nltk
nltk.download('vader_lexicon')
from nltk.sentiment.vader import SentimentIntensityAnalyzer
sid = SentimentIntensityAnalyzer()

Позвольте мне привести пример, чтобы показать вам результаты анализа настроений:

sid.polarity_scores('you are hateful')
{'compound': -0.4939, 'neg': 0.615, 'neu': 0.385, 'pos': 0.0}

Фразу «вы ненавидите» присваивается отрицательная оценка - –49. Пока что я оценил справедливость модели (так сказать).

def dict_converter(dict1):
  dictlist = list()
  for key, value in dict1.items():
    temp = [key,value]
    dictlist.append(temp)
  return dictlist
#example
dict_converter({'neg': 0.0, 'neu': 1.0, 'pos': 0.0, 'compound': 0.0})

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

5. Анализ настроений

У меня есть все необходимое: данные и обученная модель. Для каждого твита в наборе данных я буду прикреплять оценки анализа тональности в правых столбцах. Затем я конвертирую полученный список в DataFrame pandas.

tweets = list()
for g in total['tweet']:
  dict_res = dict_converter(sid.polarity_scores(g))
  #nltk.sentiment.util.demo_vader_instance(_)
  tweets.append([g, dict_res[0][1], dict_res[1][1], dict_res[2][1], dict_res[3][1]])
import pandas as pd
tweets = pd.DataFrame(tweets)
tweets.columns = ['text', 'neg', 'neu', 'pos', 'compound']
tweets

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

tweets.shape
(14756, 5)

Избавляемся от дубликатов

tweets = tweets.drop_duplicates()
tweets.shape
(6582, 5)

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

tweets = tweets.sort_values(['compound'], ascending=False)
tweets.to_csv('tweets.csv')

6. Глядя на результаты

Проведенный мною анализ настроений не позволит мне понять, выступают ли люди за или против устойчивости (если они используют хэштег #sustainable, мы можем предположить, что люди, которые пишут об этом в Твиттере, поддерживают его), но он позволяет нам определить тон, используемый для написать твит. Некоторые люди могут обратиться к призыву стать устойчивыми в позитивном ключе, другие могут посчитать, что обращение со своим гневом - лучший выбор, чтобы выразить свое мнение.

Положительные и отрицательные твиты

Оценки данных находятся в пределах [-,88, 0,97], где -1 означает крайне отрицательное, 0 - нейтральное, +1 - крайне положительное.

*** Я не хочу использовать изображения, учитывая оскорбительный характер некоторых твитов. Они выбираются случайным образом, поэтому я не осуждаю и не контролирую то, что я загружаю.

Набор данных насчитывает 6583 твита:

  • 3184 положительных твита
  • 2938 нейтральных твитов
  • 461 отрицательный твит

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

Примеры

Я выбрал два твита на обоих концах раздачи, чтобы показать вам:

Положительный твит: 0,96

«Поздравляю с Днем Земли от всех сотрудников Hope Advocates for Sustainability! Какой прекрасный день, чтобы отпраздновать эту прекрасную нашу планету. #sustainability # earthday2020 #sustainable #outdoor #getoutside #MIEarthDay #HC_Green @HopePhysPlant @HopeCollegeSAC ’

Отрицательный твит: -.78

«200 лет мы покоряем природу. Теперь забиваем до смерти. - Том Макмиллан