Рубрики
Без рубрики

Анализ настроений в Python с помощью Text Blob

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

Автор оригинала: Natalia Kuzminykh.

Вступление

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

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

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

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

Следовательно, они могут выйти за пределы полярности и определить шесть “универсальных” эмоций (например, гнев, отвращение, страх, счастье, печаль и удивление):

Источник: Спектр Психического Здоровья

Шкала эмоций

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

Например, эта фраза из Business insider: “В марте Илон Маск описал беспокойство по поводу вспышки коронавируса как “панику” и “глупость”, и с тех пор он опубликовал в твиттере неверную информацию, такую как его теория о том, что дети “по существу невосприимчивы” к вирусу.” выражает субъективность через личное мнение Э. Маска, а также автора текста.

Анализ настроений в Python с помощью Text Blob

Подход, который пакет TextBlob применяет к анализу настроений, отличается тем, что он основан на правилах и поэтому требует заранее определенного набора категоризированных слов. Эти слова можно, например, загрузить из базы данных NLTK. Кроме того, настроения определяются на основе семантических отношений и частоты каждого слова во входном предложении, что позволяет получить более точный вывод в результате.

Как только первый шаг выполнен и модель Python снабжена необходимыми входными данными, пользователь может получить оценки настроений в форме полярности и субъективности, которые обсуждались в предыдущем разделе. Мы можем увидеть, как этот процесс работает в этой статье Forum Kapadia :

Поток текстовых Blob-объектов

Выход TextBlob для задачи полярность представляет собой поплавок в диапазоне [-1.0, 1.0] где -1.0 является отрицательной полярностью и 1.0 это положительно. Этот балл также может быть равен 0 , что означает нейтральную оценку высказывания, поскольку оно не содержит никаких слов из обучающего набора.

Принимая во внимание, что задача идентификации субъективности/объективности сообщает о поплавке в диапазоне [0.0, 1.0] где 0.0 это очень объективное предложение и 1.0 это очень субъективно.

Существуют различные примеры взаимодействия Python с анализатором настроений TextBlob: начиная от модели, основанной на различных наборах данных Kaggle (например, обзоры фильмов), и заканчивая вычислением настроений твитов через API Twitter.

Но давайте рассмотрим простой анализатор, который мы могли бы применить к конкретному предложению или короткому тексту. Сначала мы начнем с импорта библиотеки Text Blob:

# Importing TextBlob
from textblob import TextBlob

После импорта мы загрузим предложение для анализа и создадим экземпляр объекта Text Blob , а также присвоим свойство sentiment нашему собственному analysis :

# Preparing an input sentence
sentence = '''The platform provides universal access to the world's best education, partnering with top universities and organizations to offer courses online.'''

# Creating a textblob object and assigning the sentiment property
analysis = TextBlob(sentence).sentiment
print(analysis)

Свойство sentiment является namedtuple формы Sentiment(полярность, субъективность) .

Где ожидаемый результат анализа:

Sentiment(polarity=0.5, subjectivity=0.26666666666666666)

Кроме того, можно также получить результаты полярности или субъективности отдельно, просто выполнив следующее:

from textblob import TextBlob

# Preparing an input sentence
sentence = '''The platform provides universal access to the world's best education, partnering with top universities and organizations to offer courses online.'''

analysisPol = TextBlob(sentence).polarity
analysisSub = TextBlob(sentence).subjectivity

print(analysisPol)
print(analysisSub)

Что дало бы нам выход:

0.5
0.26666666666666666

Одна из замечательных особенностей TextBlob заключается в том, что он позволяет пользователю выбрать алгоритм выполнения высокоуровневых задач НЛП:

  • Pattern Analyzer – классификатор по умолчанию, построенный на базе библиотеки шаблонов
  • NaiveBayesAnalyzer – модель NLTK, обученная корпусу обзоров фильмов

Чтобы изменить настройки по умолчанию, мы просто зададим в коде Наивный Байесовский анализатор. Давайте проведем анализ настроений в твитах непосредственно из Twitter :

from textblob import TextBlob
# For parsing tweets
import tweepy 

# Importing the NaiveBayesAnalyzer classifier from NLTK
from textblob.sentiments import NaiveBayesAnalyzer

После этого нам нужно установить соединение с Twitter API через API-ключи (которые вы можете получить через аккаунт разработчика ):

# Uploading api keys and tokens
api_key = 'XXXXXXXXXXXXXXX'
api_secret = 'XXXXXXXXXXXXXXX'
access_token = 'XXXXXXXXXXXXXXX'
access_secret = 'XXXXXXXXXXXXXXX'

# Establishing the connection
twitter = tweepy.OAuthHandler(api_key, api_secret)
api = tweepy.API(twitter)

Теперь мы можем выполнять анализ твитов на любую тему. Искомое слово (например, lockdown ) может быть как одним словом, так и несколькими. Более того, эта задача может занять много времени из-за огромного количества твитов. Рекомендуется ограничить выход:

# This command will call back 5 tweets within a "lockdown" topic
corpus_tweets = api.search("lockdown", count=5) 
for tweet in corpus_tweets:
    print(tweet.text)

Вывод этого последнего фрагмента кода вернет пять твитов, которые упоминают ваше искомое слово в следующем виде:

[email protected]: How Asia's densest slum contained the virus and the economic catastrophe that stares at the hardworking slum population...

Последним шагом в этом примере является переключение модели по умолчанию на анализатор NLTK, который возвращает свои результаты в виде namedtuple вида: Sentiment(classification, p_pos, p_neg) :

# Applying the NaiveBayesAnalyzer
blob_object = TextBlob(tweet.text, analyzer=NaiveBayesAnalyzer())
# Running sentiment analysis
analysis = blob_object.sentiment
print(analysis)

Наконец, наша модель Python даст нам следующую оценку настроений:

Sentiment(classification='pos', p_pos=0.5057908299783777, p_neg=0.49420917002162196)

Здесь он классифицируется как позитивное настроение, а значения p_pos и p_neg равны ~ 0.5 каждый.

Вывод

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