Из книги «На пути к науке о данных» Рохита Ганди, составленной Heart of the Machine.
В этой статье описывается, как создать классификатор тональности, начиная с введения в обработку естественного языка и заканчивая пошаговым процессом построения.
Введение в обработку естественного языка
Язык объединяет людей. Язык — это инструмент, который позволяет нам как передавать свои мысли и чувства другому человеку, так и понимать, что другие думают и чувствуют. Большинство из нас начинают говорить в возрасте от 1,5 до 2 лет. Каким образом человеческий мозг получает столько знаний в столь юном возрасте, остается загадкой. Однако было обнаружено, что большинство функций обработки речи происходит в коре головного мозга.
Мотивация анализа настроений
Сами люди не могут понять, как язык обрабатывается мозгом. Итак, можем ли мы научить машину выучить наш язык? Благодаря обширным исследованиям было разработано множество методов, помогающих машинам понимать язык. Обработка естественного языка (NLP) — это область, изучающая взаимодействие человеческого языка с компьютерами. Подзадачей обработки естественного языка является анализ настроений, классификация предложения как положительного или отрицательного. Какая польза от классификации предложений как положительных или отрицательных? Возьмем, к примеру, сайт Amazon. На Amazon пользователи могут оставить отзыв о продукте, указав, является ли он хорошим, плохим или даже нейтральным. Однако использование людей для чтения всех отзывов и получения общих отзывов клиентов о продукте обходится дорого и требует много времени. Давайте поговорим о нашей модели машинного обучения. Модели машинного обучения могут делать выводы из больших объемов данных для классификации отзывов. Используя эту модель машинного обучения, Amazon может улучшать свои продукты с помощью отзывов клиентов, что приводит к увеличению доходов компании.
Анализ настроений не так прост, как кажется. Если вы считаете, что отзывы, содержащие такие слова, как «хороший» и «отличный», могут быть классифицированы как положительные отзывы, а те, которые содержат такие слова, как «плохой» и «несчастный», могут быть классифицированы как отрицательные отзывы, вам нужно подумать еще раз. Например, «Совсем невкусно» и «Хороший фаст-фуд, но ничего особенного» представляют соответственно негативную и нейтральную обратную связь даже со словом «хорошо». Поэтому задача может оказаться не такой простой, как кажется. Далее давайте посмотрим на данные, которые будут использоваться.
набор данных
Мы будем использовать обзоры продуктов Amazon, обзоры фильмов IMDB и обзоры Yelp для построения модели анализа настроений.
Ссылка для скачивания данных:Woohoo. Карта реформирована. com/mark несколько раз/Sen…
Все данные были отмечены 0 для отрицательного отзыва и 1 для положительного отзыва. Данные Amazon аналогичны диаграмме ниже.
код
Мы можем написать код:
with open("/Users/rohith/Documents/Datasets/sentiment_labelled_sentences/amazon_cells_labelled.txt") as f1:
lines = f1.readlines()
with open("/Users/rohith/Documents/Datasets/sentiment_labelled_sentences/imdb_labelled.txt") as f1:
temp = f1.readlines()
lines=lines+temp
with open("/Users/rohith/Documents/Datasets/sentiment_labelled_sentences/yelp_labelled.txt") as f1:
temp = f1.readlines()
lines=lines+temp
Данные хранятся в разных текстовых файлах. Мы открываем каждый файл и читаем все строки текста, которые также включают метки для каждого текста. Затем мы сохраняем его в списке под названием «линии».
x = []
y = []
for value in lines:
temp = value.split('\t')
x.append(temp[0])
temp[1].replace('\n','')
y.append(int(temp[1]))
Каждая строка набора данных содержит текст, за которым следует пробел из четырех символов и метка (0 или 1) для этого текста. Итак, мы сначала добавляем первую часть, содержащую текст, к функциям (x), а затем получаем метки, которые имеют «\n» в конце. Таким образом, метки удаляются, а затем добавляются в наш список меток labels(y).
from keras.preprocessing.text import Tokenizer
tokenizer = Tokenizer(num_words=2500,split=' ')
tokenizer.fit_on_texts(x)
Keras имеет встроенный API, упрощающий подготовку текста для вычислений. Класс токенизатора имеет в общей сложности 4 свойства, которые можно использовать для подготовки функций. Взгляните на пример ниже, чтобы увидеть, что на самом деле делает токенизатор.
## CODE
tokenizer = Tokenizer()
texts = ["The sun is shining in June!","September is grey.","Life is beautiful in August.","I like it","This and other things?"]
tokenizer.fit_on_texts(texts)
print(tokenizer.word_index)
tokenizer.texts_to_sequences(["June is beautiful and I like it!"])
## OUPUT
{'sun': 3, 'september': 4, 'june': 5, 'other': 6, 'the': 7, 'and': 8, 'like': 9, 'in': 2, 'beautiful': 11, 'grey': 12, 'life': 17, 'it': 16, 'i': 14, 'is': 1, 'august': 15, 'things': 10, 'shining': 13, 'this': 18}
[[5, 1, 11, 8, 14, 9, 16]]
Токенизатор присваивает значение индекса каждому слову в предложении, и это значение индекса можно использовать для представления новых предложений. Поскольку используемый нами текстовый корпус содержит большое количество различных слов, мы устанавливаем верхний предел и используем только 2500 наиболее часто встречающихся слов.
from keras.preprocessing.sequence import pad_sequences
X = tokenizer.texts_to_sequences(x)
X = pad_sequences(X)
Теперь мы преобразуем текст в последовательность чисел, как показано выше, и заполняем последовательность чисел. Поскольку предложения могут иметь разную длину, длина их последовательностей также будет разной. Таким образом, pad_sequences находит самое длинное предложение и дополняет другие более короткие предложения нулями, чтобы они соответствовали этой длине.
## Pad Sequences Example
pad_sequences([[1, 2, 3], [3, 4, 5, 6], [7, 8]])
array([[0, 1, 2, 3],
[3, 4, 5, 6],
[0, 0, 7, 8]], dtype=int32)
import numpy as np
from sklearn.model_selection import train_test_split
Y = []
for val in y:
if(val == 0):
Y.append([1,0])
else:
Y.append([0,1])
Y = np.array(Y)
x_train, x_test, y_train, y_test = train_test_split(X,Y,train_size=0.8)
Мы конвертируем метки в одну горячую кодировку, которая помогает сети LSTM предсказывать метки для текста. Теперь, когда у нас есть готовые текстовые данные, мы можем разделить их на обучающие и тестовые образцы. Используйте 80% данных для обучения и 20% для тестирования модели.
import keras
from keras.layers import Embedding, LSTM, Dense
from keras.models import Sequential
model = Sequential()
model.add(Embedding(2500,128,input_length=X.shape[1],dropout=0.2))
model.add(LSTM(300, dropout_U=0.2,dropout_W=0.2))
model.add(Dense(2,activation='softmax'))
model.compile(loss=keras.losses.categorical_crossentropy,optimizer='adam',metrics=['accuracy'])
model.fit(x_train,y_train,epochs=10,verbose=2,batch_size=32)
print(model.evaluate(x_test,y_test)[1])
Теперь мы построили модель, скомпилировали, обучили и протестировали ее. Модель имеет встраиваемый слой. Входная последовательность представляет собой разреженное представление текста, потому что словарный запас огромен, а данное слово будет представлено большим вектором. Если мы сможем построить какое-то плотное представление последовательности, сети будет проще делать прогнозы. Встраивание слов/плотное представление 2500 слов получается путем обучения модели через слой встраивания. Затем мы добавляем к модели LSTM и плотные слои. Модуль LSTM отвечает за контекстуальный вывод и помогает предсказать, является ли предложение положительным или нет. Плотный слой выводит вероятность каждого класса. В этой статье подробно не рассматривается LSTM, чтобы узнать больше об этом, см. этот блог:столбец ah.GitHub.IO/posts/2015-….
вывод
Заканчивать! Вы только что создали классификатор настроений в 50 строках кода~
Оригинальная ссылка:в сторону data science.com/sentiment - ах...