В естественном языке присутствуют идиомы, сарказм и другие приемы, затрудняющие распознавание смысла текстов нейросетями. Библиотеки TextBlob и VADER позволяют с помощью нескольких строк кода оценить тональность текстов.
Разберем работу с библиотеками на примере анализа тональности твитов из датасета Sentiment140, включающего 1,6 миллиона твитов, которые аннотированы как имеющие положительную, отрицательную или нейтральную тональность. Из этого датасета выбрано всего 500 твитов для оценки эффективности TextBlob и VADER путем сравнения их выходных данных с аннотациями. Сначала импортируем библиотеки:
from textblob import TextBlob from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer import pandas as pdanalyzer = SentimentIntensityAnalyzer()
Затем загрузим твиты:
completeDF = pd.read_csv("testdata.manual.2009.06.14.csv", names=["polarity", "id","date","query","user","text"])df = completeDF.drop(columns=['date','query','user']) df.polarity = df.polarity.replace({0: -1, 2: 0, 4: 1})
В датасете положительная, нейтральная и отрицательная тональности кодируются числами 4, 2 и 0 соответственно. TextBlob и Vader используют такую же классификацию, но используют вещественные числа в диапазоне от 1 до -1 для оценки тональности: -1 — максимально отрицательная и +1 — максимально положительная. Поэтому в коде выше производится замена чисел из датасета для сравнения с выходными данными анализаторов. Теперь можно перебрать твиты и пропустить их через два анализатора:
TextBlob(text).sentiment.polarity) analyzer.polarity_scores(text)['compound'])
Затем нужно выполнить округление выдачи анализаторов, чтобы присвоить каждому твиту одну из трех категорий тональности. Выбор способа округления влияет на точность результатов. Лучшая точность достигается при округлении тональности выше 0 до 1, а меньше 0 — до -1. Результат получился такой:
Overall length 498
VADER agreements/disagreements 360/138
Accuracy: 72.28915662650603%
TextBlob agreements/disagreements 324/174
Accuracy: 65.06024096385542%
Таким образом, TextBlob и VADER показали точность 65% и 72% соответственно. Эти значения являются типичными для аналогичных анализаторов тональности. Данные проекта Sentiment140 доступны по ссылке.