Анализ тональности новостного текста на бенгальском языке с использованием LSTM

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

Заголовок новости, состоящий из эмоций - хорошего, плохого, нейтрального. Анализ тональности используется для исследования человеческих эмоций, присутствующих в текстовой информации. Здесь я покажу, что реализация на основе глубокого обучения для анализа тональности заголовка новости. Эксперименты проводились с набором данных Bengali News Headline, который отражает применимость и валидацию принятого подхода.

Загрузить набор данных

pandas - это быстрая, мощная, гибкая и простая в использовании библиотека анализа данных с открытым исходным кодом, созданная для Python. Набор данных хранится на листе Excel. Итак, нужно прочитать Excel, используя библиотеку pandas. В python 3 не нужно преобразовывать кодировку. А re используется для замены регулярного выражения из бенгальского текста.

import pandas as pd
import re
df=pd.read_excel("Bengali_News_Headline_Sentiment.xlsx")

В наборе данных присутствуют три атрибута. Но нам нужны атрибуты «Заголовок» и «Настроение» для анализа настроений.

df.head()

drop () используется для удаления ненужного столбца, а ось = 1 указывает столбец.

df=df.drop('News Type',axis=1)

Удалить выражение

В бенгальском тексте есть наиболее часто используемые выражения, например। ,:, '',? и т. д. Эти выражения необходимо удалить из текста перед преобразованием лексемы и последовательности. Функция лямбда применяется для замены этих выражений в заголовке .

df['Headline'] = df['Headline'].apply((lambda x: re.sub('[,?'']','',x)))

Библиотека глубокого обучения

Для преобразования текста в токен используется tokenizer Keras. После этого используется преобразование токена в последовательность Keras pad sequence. Последовательная модель Кераса импортируется для построения модели, которая подходит для простого набора слоев, где каждый слой имеет ровно один входной тензор и один выходной тензор.

Сеть LSTM - это своего рода рекуррентная нейронная сеть. Рекуррентная нейронная сеть - это нейронная сеть, которая пытается моделировать поведение, зависящее от времени или последовательности. Для сохранения текстовой последовательности импортируется Долгосрочная память. Здесь мы будем строить сеть LSTM для поддержки текстовой последовательности. Блоки ячеек LSTM вместо наших стандартных слоев нейронной сети. Эти ячейки имеют различные компоненты, называемые входным вентилем, вентилем забывания и выходным вентилем.

Плотный слой - это обычный глубоко связанный слой нейронной сети. Это наиболее распространенный и часто используемый слой.

Слой Keras Embedding, который можно использовать для нейронных сетей с текстовыми данными. Требуется, чтобы входные данные были закодированы целым числом, чтобы каждое слово было представлено уникальным целым числом.

SpartialDropout1D отбрасывает целые одномерные карты объектов вместо отдельных элементов.

Keras utils Преобразует вектор класса (целые числа) в двоичную матрицу классов.

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

import numpy as np
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
from keras.models import Sequential
from keras.layers import LSTM,Dense,Embedding,SpatialDropout1D
from keras.utils.np_utils import to_categorical
from sklearn.model_selection import train_test_split

Преобразовать текст в последовательность

Для извлечения признаков используется максимум 2500 признаков. Tokenizer токенизирует текст на основе максимального количества функций. И токенизатор поместил текст заголовка для преобразования текста в последовательность. Преобразованная последовательность добавляется последовательностью контактных площадок.

max_fatures = 2500
tokenizer = Tokenizer(num_words=max_fatures, split=' ')
tokenizer.fit_on_texts(df['Headline'].values)
X = tokenizer.texts_to_sequences(df['Headline'].values)
X = pad_sequences(X)

X содержит массив текстовой последовательности с 32-битным целочисленным типом данных.

X

np.shape(X)

Установить модель

Установите размер внедрения 64. В слое внедрения максимальное свойство используется в качестве входных данных с размером встраивания, а длина входных данных равна форме последовательности заполнения. В слое SpatialDropout используются коэффициенты 0,4. Ячейка LSTM добавлена ​​с 64 скрытыми блоками и 0,2 выпадения, 0,2 повторных выпадения. В наборе выходного слоя размер Dense равен 2 с функцией активации «Softmax». Softmax преобразует вещественный вектор в вектор категориальных вероятностей. Элементы выходного вектора находятся в диапазоне (0, 1) и в сумме равны 1. Для расчета потерь используется категориальная кроссентропия, а для оптимизации - adam.

embed_dim = 64
model = Sequential()
model.add(Embedding(max_fatures, embed_dim,input_length = X.shape[1]))
model.add(SpatialDropout1D(0.4))
model.add(LSTM(64, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(2,activation='softmax'))
model.compile(loss = 'categorical_crossentropy', optimizer='adam',metrics = ['acc'])
model.summary()

Разделить тест на тренировку

Текст заголовка - это ввод модели, а тональность - вывод. Переменная X содержит вход модели, а Y - выход. Для получения значения настроения из набора данных используется функция pandas dummies.

Для теста используется 20% всех данных с 42 значениями случайных состояний.

Y = pd.get_dummies(df['Sentiment']).values
X_train, X_test, Y_train, Y_test = train_test_split(X,Y, test_size = 0.20,random_state = 42)
print(X_train.shape,Y_train.shape)
print(X_test.shape,Y_test.shape)

Модель поезда

Используется переменная сохранения каждого шага истории производительности модели. Для итерации установите 10 эпох с размером пакета 32. Подтвердить данные 10% данных используются для валидационного разделения.

history=model.fit(X_train, Y_train, epochs = 10, batch_size=32, verbose = 2,validation_split=0.1)

После того, как модель обучения достигает 97% точности для обучающих данных и 64% точности для оценочных данных. Модель также оценивается размером партии 64.

score = model.evaluate(X_train, Y_train,batch_size=64, verbose=2)
print('Train loss:', score[0])
print('Train accuracy:', score[1])

score = model.evaluate(X_test, Y_test,batch_size=64, verbose=2)
print('Test loss:', score[0])
print('Test accuracy:', score[1])

Прогноз настроения

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

text = input()
text = tokenizer.texts_to_sequences(text)
text = pad_sequences(text,maxlen=14,dtype='int32',value=0)
predict=model.predict(text,batch_size=1,verbose=2)[0]
if(np.argmax(predict)==0):
print("Negative News")
else:
print("Positive News")

Github: https://github.com/AbuKaisar24/Machine-Learning-Algorithms-Performance-Measurement-for-Bengali-News-Sentiment-Classification/blob/master/Headline%20Sentiment%20using%20LSTM.ipynb