Что такое анализатор настроений?
Хотите знать, как владелец продукта может получить массу информации о том, как клиенты воспринимают его продукты, не читая миллионы статей и обзоров? Анализатор настроений — вот ответ, эти вещи можно быстро развернуть, а затем подключить к Твиттеру, обзорным сайтам, базам данных или ко всему вышеперечисленному, чтобы мы могли понять общее отношение Интернета к нашему продукту. /услуги/бизнес.
Это отличный ленивый способ понять, как продукт воспринимается большой группой клиентов за очень короткий промежуток времени.
Что такое Керас?
Цитата из Википедии: «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 г.