Что такое анализатор настроений?

Хотите знать, как владелец продукта может получить массу информации о том, как клиенты воспринимают его продукты, не читая миллионы статей и обзоров? Анализатор настроений — вот ответ, эти вещи можно быстро развернуть, а затем подключить к Твиттеру, обзорным сайтам, базам данных или ко всему вышеперечисленному, чтобы мы могли понять общее отношение Интернета к нашему продукту. /услуги/бизнес.

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

Что такое Керас?

Цитата из Википедии: «Keras — это библиотека нейронных сетей с открытым исходным кодом, написанная на Python. Он может работать поверх TensorFlow, Microsoft Cognitive Toolkit, Theano или PlaidML. Разработанный для быстрого экспериментирования с глубокими нейронными сетями, он ориентирован на удобство использования, модульность и расширяемость».

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

Итак, давайте перейдем к делу… Импорт и форматирование данных

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

Первое, что нам нужно сделать, это импортировать набор данных IMDB из Keras, а затем разделить его на наборы данных для обучения и тестирования.

from keras.datasets import imdb top_words = 10000 (x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=top_words)

Мы должны увидеть экран загрузки и предупреждение о том, что «используем бэкэнд tensorflow», в этом нет ничего плохого, просто позвольте ему делать свое дело.

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

imdb.get_word_index()

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

word_dict = imdb.get_word_index() 
word_dict = { key:(value + 3) for key, value in word_dict.items() } word_dict[''] = 0 
# Padding word_dict['>'] = 1 
# Start word_dict['?'] = 2 
# Unknown word reverse_word_dict = { value:key for key, value in word_dict.items() } print(' '.join(reverse_word_dict[id] for id in x_train[0]))

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

Далее требуется небольшая уборка, нам нужно убедиться, что все, что входит в NN, имеет одинаковую форму. т. е. мы укажем максимальную длину отзыва в символах и назначим ее переменной max_review_length, затем пройдемся по нашему набору данных и дополним конец всех отзывов нулями, чтобы убедиться, что все имеет длину 500 символов.

from keras.preprocessing import sequence 
max_review_length = 500 
x_train = sequence.pad_sequences(x_train, maxlen=max_review_length) x_test = sequence.pad_sequences(x_test, maxlen=max_review_length)

Построить модель

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

Вы увидите, что код разбит на части для простоты понимания и показан целым блоком после проверки или копирования.

Сначала мы импортируем необходимые пакеты и устанавливаем переменную длина вектора встраивания. Вложения слов обеспечивают плотное представление слов и их относительных значений.

#Build the Model from keras.models 
import Sequential from keras.layers 
import Dense from keras.layers.embeddings 
import Embedding from keras.layers 
import Flatten
embedding_vector_length = 32

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

model = Sequential()

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

model.add(Embedding(top_words, embedding_vector_length, input_length=max_review_length))

Затем мы берем входные данные и сглаживаем их, чтобы их можно было использовать на следующем слое.

model.add(Flatten())

Мы добавляем несколько плотных слоев, они контролируют, «как» модель учится — первые два слоя имеют 16 нейронов, мы можем изменить их, чтобы позже изменить точность модели.

model.add(Dense(16, activation='relu')) 
model.add(Dense(16, activation='relu'))

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

Последний плотный слой — это наш выходной слой — он установлен на 1 нейрон, потому что нам нужен только один выход для всего — оценка настроения!

model.add(Dense(1, activation='sigmoid'))

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

Далее нам нужно скомпилировать или смоделировать, это эффективно склеивает все вместе. Не вдаваясь в подробности, оптимизатор — это то, как наша сеть оптимизирует свои веса и как она обучается. Возможно, вы слышали термин «градиентный спуск», Адам — его разновидность.

model.compile(loss='binary_crossentropy',optimizer='adam', metrics=['accuracy'])

Мы также можем изменить способ измерения наших результатов. Обычно мы используем «точность», но в Keras есть варианты.

Последнее, что мы делаем перед выполнением, — распечатываем модель — это позволит нам проверить, довольны ли мы конфигурацией.

print(model.summary())

Как и обещал, вот код полностью.

import Sequential from keras.layers 
import Dense from keras.layers.embeddings 
import Embedding from keras.layers 
import Flatten
model = Sequential()
model.add(Embedding(top_words, embedding_vector_length, input_length=max_review_length))
layer model.add(Flatten()) 
model.add(Dense(16, activation='relu')) 
model.add(Dense(16, activation='relu'))
model.add(Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy',optimizer='adam', metrics=['accuracy'])
print(model.summary())

Подгонка модели

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

Обратите внимание, что мы сопоставляем данные поезда И проверяем тестовые данные в одной строке кода?

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

hist = model.fit(x_train, y_train, validation_data=(x_test, y_test), epochs=5, batch_size=128)

Запустив код, мы сможем отслеживать нейронную сеть через любое количество Epoch, которое вы запросили — в моем примере 5, то есть 5 строк результатов.

Здесь нужно быть осторожным с переобучением.Если мы видим одинаковую точность между значениями acc (точность обучения) и val_acc (точность тестового набора), то у нас может быть переобучение. Проблема, быстрое решение этой проблемы — уменьшить количество пройденных нами Эпох.

Оценка модели

Система подсчета очков уже встроена. Все, что нам нужно сделать, это визуализировать ее!

import seaborn as sns 
import matplotlib.pyplot as plt 
%matplotlib inline 
sns.set() val = hist.history['val_acc'] 
epochs = range(1, len(acc) + 1) 
plt.plot(epochs, val, ':', label='Validation accuracy') plt.title('Validation Accuracy') plt.xlabel('Epoch') plt.ylabel('Accuracy') plt.legend(loc='upper left') 
plt.plot()

Использование нашего кода

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

import string 
import numpy as np 
def analyze(text): 
# Prepare the input by removing punctuation characters, converting characters to lower case, and removing words containing numbers 
translator = str.maketrans('', '', string.punctuation) 
text = text.translate(translator) 
text = text.lower().split(' ') 
text = [word for word in text if word.isalpha()] 
# Generate an input tensor 
input = [1] for word in text: 
    if word in word_dict and word_dict[word] < 
    top_words: input.append(word_dict[word]) 
    else: 
       input.append(2)   
       padded_input = sequence.pad_sequences([input], maxlen=max_review_length) 
# Invoke the model and return the result 
result = model.predict(np.array([padded_input][0]))[0][0] return result

Тестирование анализатора настроений

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

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

Первоначально опубликовано на http://drunkendatascience.com 19 мая 2019 г.