1. ProgrammingBig DataData ScienceUsing AI для анализа настроений

Джон Пол Мюллер, Лука Мюллер

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

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

Следующий пример - тестовый запуск RNN с использованием Keras и TensorFlow, который создает алгоритм анализа настроений, способный классифицировать отношения, выраженные в рецензии на фильм. Данные являются образцом набора данных IMDb, который содержит 50 000 обзоров (разделенных пополам между наборами поездов и тестов) фильмов с меткой, выражающей настроение обзора (0 = отрицательный, 1 = положительный). IMDb - это большая онлайн-база данных, содержащая информацию о фильмах, сериалах и видеоиграх. Первоначально поддерживаемый фан-базой, сейчас он управляется дочерней компанией Amazon. На IMDb люди находят нужную им информацию о своем любимом шоу, а также публикуют свои комментарии или пишут обзор для чтения другими посетителями.

Keras предлагает загружаемую оболочку для данных IMDb. Вы готовите, перемешиваете и систематизируете эти данные в поезд и тестовый набор. В частности, текстовые данные IMDb, предлагаемые Keras, очищаются от пунктуации, нормализуются в нижний регистр и преобразуются в числовые значения. Каждое слово закодировано в число, представляющее его ранжирование по частоте. Самые частые слова имеют низкие цифры; реже слова имеют более высокие цифры.

Для начала код импортирует функцию imdb из Keras и использует ее для извлечения данных из Интернета (загрузка около 17,5 МБ). Параметры, используемые в этом примере, охватывают только первые 10000 слов, и Keras должен перетасовать данные с использованием определенного случайного начального числа. (Знание начального числа делает возможным воспроизводить случайное воспроизведение по мере необходимости.) Функция возвращает два набора обучающих и тестовых наборов, оба из текстовых последовательностей и результата настроения.

из keras.datasets import imdb
top_words = 10000
((x_train, y_train),
(x_test, y_test)) = imdb.load_data (num_words = top_words,
семян = 21)

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

print («Примеры обучения:% i»% len (x_train))
print («Тестовые примеры:% i»% len (x_test))

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

импортировать NumPy как NP
print (np.unique (y_train, return_counts = True))

Результат, массив ([12500, 12500]), подтверждает, что набор данных равномерно распределяется между положительными и отрицательными результатами. Такой баланс между классами ответов обусловлен исключительно демонстративным характером набора данных. В реальном мире вы редко находите сбалансированные наборы данных. Следующий шаг создает несколько словарей Python, которые могут преобразовывать код, используемый в наборе данных, в настоящие слова. Фактически, набор данных, используемый в этом примере, предварительно обрабатывается и предоставляет последовательности чисел, представляющих слова, а не сами слова. (Алгоритмы LSTM и GRU, которые вы найдете в Keras, ожидают последовательности чисел в виде чисел.)

word_to_id = {w: i ​​+ 3 для w, i в imdb.get_word_index (). items ()}
id_to_word = {0: '', 1: '', 2: '<УНК>'}
id_to_word.update ({i + 3: w для w, я в imdb.get_word_index (). items ()})
def convert_to_text (sequence):
вернуть '' .join ([id_to_word [s] для s в последовательности, если s> = 3])
печать (convert_to_text (x_train [8]))

Предыдущий фрагмент кода определяет два словаря преобразования (из слов в числовые коды и наоборот) и функцию, которая переводит примеры набора данных в читаемый текст. В качестве примера, код печатает девятый пример: «этот фильм был похож на ужасное крушение поезда, столь же ужасное, как и…». Из этого отрывка вы можете легко предвидеть, что настроение к этому фильму не является положительным. Такие слова, как «плохо», «крушение» и «ужас», передают сильное негативное чувство, и это позволяет легко угадать правильное мнение.

В этом примере вы получаете числовые последовательности и превращаете их обратно в слова, но часто встречается обратное. Обычно вы получаете фразы, состоящие из слов, и превращаете их в последовательности целых чисел для подачи в слой RNN. Keras предлагает специальную функцию Tokenizer, которая может сделать это для вас. Он использует методы fit_on_text, чтобы узнать, как отобразить слова в целые числа из обучающих данных, и text_to_matrix, чтобы преобразовать текст в последовательность.

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

Традиционно вы берете начальную часть текста и используете ее в качестве представителя всего обзора. Иногда вам просто нужно несколько начальных слов - например, первые 50 слов - чтобы получить смысл; иногда тебе нужно больше. Особенно длинные тексты не показывают их ориентацию рано. Поэтому вам необходимо понять тип текста, с которым вы работаете, и решить, сколько слов анализировать, используя глубокое обучение. В этом примере рассматриваются только первые 200 слов, которых должно быть достаточно.

Вы заметили, что код начинает давать код для слов, начинающихся с цифры 3, оставляя коды от 0 до 2. Меньшие числа используются для специальных тегов, таких как сигнал начала фразы, заполнение пустых мест для фиксации последовательности на определенной длине, и отмечая слова, которые исключены, потому что они не достаточно часто. Этот пример собирает только самые частые 10000 слов. Использование тегов для указания начала, конца и заметных ситуаций - это трюк, который работает с RNN, особенно для машинного перевода.

из keras.preprocessing.sequence import pad_sequence
max_pad = 200
x_train = pad_sequence (x_train,
MaxLen = max_pad)
x_test = pad_sequence (x_test,
MaxLen = max_pad)
Печать (x_train [0])

Используя функцию pad_sequence из Keras с max_pad, установленным в 200, код занимает первые двести слов каждого отзыва. В случае, если обзор содержит менее двухсот слов, столько нулевых значений, сколько необходимо, предшествуют последовательности, чтобы достичь необходимого количества элементов последовательности. Обрезка последовательностей до определенной длины и заполнение пустот нулевыми значениями называется заполнением ввода, важной операцией обработки при использовании RNN, таких как алгоритмы глубокого обучения. Теперь код проектирует архитектуру:

из keras.models импорт последовательный
из keras.layers импорт двунаправленный, плотный, выпадающий
из keras.layers импортировать GlobalMaxPool1D, LSTM
из keras.layers.embeddings import Embedding
embedding_vector_length = 32
модель = последовательный ()
model.add (Вложение (top_words,
embedding_vector_length,
input_length = max_pad))
model.add (двунаправленный (LSTM (64, return_sequence = True)))
model.add (GlobalMaxPool1D ())
model.add (Dense (16, активация = "relu"))
model.add (Dense (1, активация = "сигмовидная"))
model.compile (убыток = 'binary_crossentropy',
Оптимизатор = «адам»,
метрики = [ 'точность'])
печать (model.summary ())

Предыдущий фрагмент кода определяет форму модели глубокого обучения, где он использует несколько специализированных слоев для обработки естественного языка из Keras. В этом примере также требуется сводка модели (команда model.summary ()), чтобы определить, что происходит с архитектурой, используя различные нейронные слои.

У вас есть слой Embedding, который преобразует числовые последовательности в плотное встраивание слов. Этот тип встраивания слов больше подходит для изучения на уровне RNN. Keras предоставляет уровень Embedded, который, помимо необходимости быть первым уровнем сети, может выполнять две задачи:

  • Применение предварительно обученного встраивания слов (такого как Word2vec или GloVe) для ввода последовательности. Вам просто нужно передать матрицу, содержащую вложение, весам ее параметров. Создание встраивания слова с нуля на основе получаемых входных данных.

Во втором случае Embedding просто нужно знать:

  • input_dim: размер словаря, ожидаемый от данных output_dim: размер пространства внедрения, которое будет создано (так называемые размеры) input_length: ожидаемый размер последовательности

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

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

В примере используется двунаправленная упаковка - слой LSTM из 64 ячеек. Двунаправленное преобразование нормального слоя LSTM путем удвоения его: на первой стороне применяется обычная последовательность вводимых вами данных; на втором он проходит обратную последовательность. Вы используете этот подход, потому что иногда вы используете слова в другом подходящем порядке, и построение двунаправленного слоя поймает любой образец слова, независимо от порядка. Реализация Keras действительно проста: вы просто применяете ее как функцию к слою, который хотите визуализировать в двух направлениях.

Двунаправленный LSTM настроен на возврат последовательностей (return_sequence = True); то есть для каждой ячейки он возвращает результат, полученный после просмотра каждого элемента последовательности. Результатами для каждой последовательности является выходная матрица 200 x 128, где 200 - это количество элементов последовательности, а 128 - количество ячеек LSTM, используемых на уровне. Этот метод предотвращает получение RNN последнего результата каждой соты LSTM. Подсказки о настроении текста могут фактически появляться где угодно во встроенной последовательности слов.

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

После того, как нейронные сигналы отфильтрованы, пример имеет слой из 128 выходов, по одному для каждой ячейки LSTM. Код уменьшает и смешивает сигналы, используя последовательный плотный слой из 16 нейронов с активацией ReLU (таким образом, пропуская только положительные сигналы). Архитектура заканчивается конечным узлом, использующим сигмовидную активацию, которая сжимает результаты в диапазон 0–1 и делает их похожими на вероятности.

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

history = model.fit (x_train, y_train,
validation_data = (x_test, y_test),
epochs = 3, batch_size = 256)

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

потеря, метрика = model.evaluate (x_test, y_test, verbose = 0)
печать («Точность теста:% 0,3f»% метрика)

Окончательная точность, представляющая собой процент правильных ответов из глубокой нейронной сети, будет составлять около 85–86 процентов. Результат будет немного меняться при каждом запуске эксперимента из-за рандомизации при построении нейронной сети. Это совершенно нормально, учитывая небольшой размер данных, с которыми вы работаете. Если вы начнете с правильных весов, обучение будет легче в такой короткой тренировке.

В конце концов, ваша сеть - это анализатор настроений, который может угадать настроения, выраженные в обзоре фильмов, примерно в 85% случаев. Учитывая еще больше обучающих данных и более сложные нейронные архитектуры, вы можете получить еще более впечатляющие результаты. В маркетинге подобный инструмент используется для автоматизации многих процессов, которые требуют чтения текста и принятия мер. Опять же, вы можете связать подобную сеть с нейронной сетью, которая слушает голос и превращает его в текст. (Это еще одно приложение RNN, которое теперь используется для Alexa, Siri, Google Voice и многих других личных помощников.) Переход позволяет приложению понимать чувства даже в голосовых выражениях, таких как телефонный звонок от клиента.

Смотрите также

Как заполнить свой список фэнтези-футболаСимптомы и средства для десерта Keto FluKeto Десертный рецепт: тесто со сливочным печеньем MousseKeto Рецепт завтрака: тост из авокадо с курицей Рецепт еды в одном горшке: стейк из вырезки с хрустящей корочкой KaleKeto Рецепт закуски: хрустящий запеченный лук с кольцамиКето Рецепт закуски и запеканки со сливками и каштановым соусомКриптовалютный майнинг и проверка алгоритмов колаКак защитить конфиденциальность вашего MacBookНайдите замену для iTunes: новые музыкальные и телевизионные приложения в macOS Catalina Что нового в macOS Catalina? Советы по настройке macOS Catalina и регистрации MacBookMacBook для чайников Различия между MacBook Air и MacBook ProКак переключаться между Учетные записи на вашем MacПроверьте микрофон на вашем ПК с WindowsКак восстановить файлы из истории файлов в Windows 10Подключение сетевого диска на вашем компьютере с Windows 10Как проверить тормозные магистралиКак запустить автомобиль? Как определить, нуждается ли ваш автомобиль в настройке? Как устранить неполадки каталитических нейтрализаторов? Как часто вы меняете масло? Как проверить уровень масла в вашем автомобилеКак промыть систему охлаждения вашего автомобиляКак устранить неполадки в двигателе с перегревомКак Как заменить шину Как установить свечу зажиганияКак удалить старые свечи зажиганияКак проверить дисковые тормозаКак заменить вашу тормозную жидкостьКак проверить главный тормозной цилиндр вашей тормозной системыКак проверить тормозную жидкость автомобиляПочему перегревается мой автомобиль и что я могу сделать? Как безопасно установить домкрат Как проверить свои тормозные магистрали