А теперь давайте автоматизируем анализ настроений! В моей предыдущей статье мы обсуждали методы, основанные на правилах, и способы их реализации, но здесь я научу вас делать это проще и быстрее. Для автоматических методов не нужны правила, создаваемые вручную, их ядро ​​- это методы машинного обучения. С их помощью вы можете обрабатывать большой объем новых данных без каких-либо задержек и без какой-либо корректировки. Подумайте о системах на основе правил, в которых для любых новых данных вам нужно добавлять или изменять правила, обновлять библиотеки настроений, создают еще более сложные системы и, очевидно, теряют время. Очень быстро они становятся чудовищно сложными и в конечном итоге содержат правило для каждого вида слов. На самом деле не стоит этим гордиться. Используйте свое время с умом. Хотя, честно говоря, если системы, основанные на правилах, правильно и часто обновляются, они менее подвержены ошибкам.

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

Базовая процедура создания и использования автоматического анализатора тональности

  1. Извлечь элементы из текста - преобразовать текст в его числовое представление.
  2. Обучите и проверьте классификатор настроений - выберите и настройте модель машинного обучения.
  3. Прогнозируйте настроение с помощью своей модели.

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

n-грамма - это непрерывная последовательность n слов или букв из заданного образца текста.

Вот пример 3-грамма с функцией ngram () из nltk:

from nltk import ngrams
sentence = 'Kako je Krtek dobio hlače'
threegrams = ngrams(sentence.split(), 3)
list(threegrams)

Вывод:

[('Kako', 'je', 'Krtek'),
('je', 'Krtek', 'dobio'),
('Krtek', 'dobio', 'hlače')]

Другие методы векторизации текста основаны на встраивании слов, то есть векторах слов, где слова или аналогичные значения имеют аналогичное векторное представление (подробнее в нашей следующей статье). После того, как вы преобразовали текст в числа, второй шаг - классификация. Классификация включает одну или несколько статистических моделей, таких как Наивный Байес, Логистическая регрессия, Машины опорных векторов или Нейронные сети. Всегда пробуйте несколько из них и настраивайте их параметры как можно лучше.

Но хватит теории, приступим к программированию!

Как создать автоматический анализатор настроений?

Все всегда начинается с данных. Как обычно, получите как можно больше аннотированных данных. Здесь мы будем использовать тот же набор данных, что и в прошлый раз, чтобы получить сопоставимые результаты (см. Анализ мнений на основе правил): Обзоры Amazon Fine Food с 20 000 отзывами, оцениваемыми от 1 до 5. Мы снова упростим задачу, аннотируя их как положительные (1), нейтральные (0) и отрицательные (-1):

import pandas as pd
data = pd.read_csv("./Reviews.csv")
data = data.sample(frac=1)[:20000]
data.columns = map(lambda x:x.lower(), list(data))
data["text"] = data["summary"] + " "+ data["text"]
data = data[["text", "score"]]
data.loc[data.score<3, "score"] = -1
data.loc[data.score==3, "score"] = 0
data.loc[data.score>3, "score"] = 1

Затем разделите набор данных на обучающую (80%) и тестовую (20%) части:

import random
sentiment_data = zip(data["text"], data["score"])
random.shuffle(sentiment_data)
# 80% for training
train_X, train_y = zip(*sentiment_data[:16000])
# Keep 20% for testing
test_X, test_y = zip(*sentiment_data[16000:])

Большой! Теперь мы готовы создать классификатор. Вы будете очень удивлены длиной кода обучения / тестирования. Мы будем использовать пакет nltk для предварительной обработки текста и scikit-learn для интеллектуального анализа данных. Существует замечательный Class под названием Pipeline, который собирает все шаги, которые мы будем использовать для наших входных данных: CountVectorizer () как векторизатор со словом ngrams и LinearSVC () в качестве классификатора.

from nltk import word_tokenize
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.pipeline import Pipeline
from sklearn.svm import LinearSVC

clf = Pipeline([('vectorizer', CountVectorizer(analyzer="word",
                  ngram_range=(1, 2), tokenizer=word_tokenize,
                  max_features=10000) ),
                ('classifier', LinearSVC())])
clf.fit(train_X, train_y)
clf.score(test_X, test_y)

Вывод:

0.86199999999999999

Короче, правда? И действительно отличная точность! Если вы помните, с помощью правил мы получили точность 65%, а код был намного длиннее и сложнее (посмотрите нашу предыдущую статью). Здесь мы не использовали какую-либо предварительную обработку, такую ​​как выделение корней, удаление неалфавитных символов или стоп-слов, маркировка отрицаний или установка всего в нижний регистр, и из-за этого наш список функций ужасен! Вы можете проверить это с помощью get_feature_names ():

clf.named_steps['vectorizer'].get_feature_names()

Вывод:

[u'kidding',
u'gives you',
u'other treats',
u'kids',
u'recall',
u'where the',
u"'s in",
u'the cheese',
u'years ago',
u'break',
u'lasted',
u'! ?',
u'got these',
u'options',
u"'s just",
u'purchased the',
u'says',
u'tangy',
u'can use',
u'taste good']

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

Как использовать автоматический анализатор настроений?

Как можно проще, просто используйте созданную модель с функцией pred ():

clf.predict(["I really like this tutorial!!", 
             "I can't wait to learn something more."])

Вывод:

array([1, 1])

Вы даже можете сохранить свою модель и использовать ее в другом коде, ничего не зная о ее структуре, вам просто нужно знать формат ввода и вывода. Модуль pickle имеет хорошие функции dump () и load (), и вы можете использовать их так:

import pickle as cPickle
#Save classifier
with open('./Sentiment_linearSVC.pkl', 'wb') as file_id:
     cPickle.dump(clf, file_id)
#Load classifier
with open('./Sentiment_linearSVC.pkl', 'rb') as file_id:
     classifier = cPickle.load(file_id)

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

Обычно гибридный подход является лучшим, поскольку он сочетает в себе лучшие функции автоматической системы и системы, основанной на правилах. Это означает, что вам следует немного настроить автоматическую процедуру с помощью нескольких необновляемых правил. Добавьте немного предварительной обработки, и вы получите неплохой анализатор настроений! Но всегда помните, что анализ тональности - действительно сложная задача, и его точность по умолчанию не может превышать 90%, поэтому не пытайтесь гнаться за этими высокими цифрами. У вас никогда не будет идеально аннотированных данных, потому что примерно в 10% случаев люди не могут согласиться с чьим-то мнением, просто прочитав текст. Вы не можете знать весь контекст или тон чьих-либо слов (подробнее в предыдущей статье), поэтому неудивительно, что компьютер тоже не может этого сделать.

Это из моего руководства по анализу настроений, надеюсь, вам понравилось! Предыдущие части Моё мнение? серию можно найти ниже:

Первоначально опубликовано на https://krakensystems.co. 15 июля 2019 г.