В этой статье мы всесторонне рассмотрим, как применять анализ тональности с помощью определенного типа рекуррентной нейронной сети (RNN), известной как долговременная кратковременная память (LSTM). Анализ настроений является критическим аспектом обработки естественного языка (NLP), позволяя нам извлекать и количественно оценивать субъективную информацию, такую ​​как эмоции и отношения, из письменного языка. Давайте погрузимся в эту захватывающую область, подробно обсудив каждый шаг, от предварительной обработки данных до оценки модели.

Сбор данных и предварительная обработка

Наш набор данных состоял из обзоров продуктов Amazon, представленных в формате JSON. Каждый отзыв сопровождался соответствующей оценкой по шкале от 1 до 5. В целях анализа настроений мы преобразовали эти рейтинги в три категории настроений: положительные, нейтральные и отрицательные.

Вот фрагмент нашей предварительной обработки:

# Load review data
reviews_df = pd.read_json('reviews.json', lines=True)

# Define a function to convert ratings into sentiments
def convert_rating_to_sentiment(rating):
    if rating < 3:
        return 'negative'
    elif rating == 3:
        return 'neutral'
    else:
        return 'positive'

# Apply the function to the 'overall' column
reviews_df['sentiment'] = reviews_df['overall'].apply(convert_rating_to_sentiment)

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

  1. Токенизация. Этот процесс включает в себя разбиение текста отзыва на отдельные слова или «токены». Мы использовали класс Tokenizer от Keras, который также занимается преобразованием слов в нижний регистр и удалением пунктуации.
  2. Преобразование последовательности. Затем мы преобразовали токены в последовательности целых чисел. Каждому уникальному слову было присвоено уникальное целое число. Эти последовательности обеспечивают формат, с которым может работать наша сеть LSTM.
  3. Заполнение последовательности. Поскольку для сетей LSTM требуются входные данные одинаковой длины, мы использовали заполнение, чтобы обеспечить одинаковую длину всех последовательностей.
  4. Кодировка меток. Наконец, мы преобразовали метки настроений (положительные, нейтральные, отрицательные) в числовой формат, поскольку модели лучше работают с числовыми данными.

Вот как мы реализовали эти шаги:

# Tokenization
tokenizer = Tokenizer(num_words=VOCAB_SIZE)
tokenizer.fit_on_texts(clean_reviews)

# Convert tokens to sequences
sequences = tokenizer.texts_to_sequences(clean_reviews)

# Padding sequences
X = pad_sequences(sequences, maxlen=MAX_SEQUENCE_LENGTH)

# Converting labels to numerical format
le = LabelEncoder()
y = le.fit_transform(sentiments)
y = to_categorical(y)

Построение модели: сеть LSTM

После предварительной обработки наших данных мы перешли к построению сети LSTM. Модель была создана с использованием Sequential API Keras, что указывает на то, что наша модель будет построена слой за слоем в последовательном порядке.

Вот архитектура нашей сети LSTM:

  1. Слой внедрения: этот слой преобразовал наши целочисленные последовательности (представляющие слова) в плотные векторы фиксированного размера. Слой Embedding имеет решающее значение для обработки категорийных данных, особенно текстовых данных.
  2. Слои LSTM: затем мы добавили два слоя LSTM по 128 единиц в каждом. Слои LSTM эффективны при обработке последовательностей (например, текста), поскольку они могут фиксировать временные зависимости между элементами в последовательности. Мы также добавили отсев для этих слоев, чтобы избежать переобучения.
  3. Плотные слои: после слоев LSTM мы включили два плотных (полностью связанных) слоя. У первого было 64 единицы, а у последнего, служащего выходным слоем, было три единицы (соответствующие нашим трем классам тональности). Мы использовали функцию активации «softmax» в нашем выходном слое, чтобы получить вероятности для каждого класса.
# Define the model
model = Sequential([
    Embedding(input_dim=len(word_index), output_dim=200, input_length=max_seq),
    LSTM(128, return_sequences=True),
    Dropout(0.5),
    LSTM(128),
    Dense(64, activation='relu', 
          kernel_regularizer=regularizers.l2(0.01), 
          activity_regularizer=regularizers.l1(0.01)),
    Dense(3, activation='softmax')  # number of classes (sentiment categories)
])

# Compile the model
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

Обучение и оценка модели

Затем мы обучили нашу модель на наших предварительно обработанных отзывах и настроениях, используя размер пакета 32 и работая в течение 100 эпох. Мы также включили раннюю остановку в наших тренировках, чтобы предотвратить перетренированность.

# Create early stopping object
early_stopping = EarlyStopping(monitor='val_loss', min_delta=0, patience=3, verbose=1, mode='auto')

# Train the model
history = model.fit(X_train, y_train, epochs=100, batch_size=32, validation_data=(X_val, y_val), callbacks=[early_stopping])

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

# Evaluate model on test data
score = model.evaluate(X_test, y_test, verbose=1)

# Calculate precision, recall, F1 score
y_pred = model.predict(X_test)
y_pred = np.argmax(y_pred, axis=1)
y_test_argmax = np.argmax(y_test, axis=1)

print('Precision:', precision_score(y_test_argmax, y_pred, average='weighted'))
print('Recall:', recall_score(y_test_argmax, y_pred, average='weighted'))
print('F1 score:', f1_score(y_test_argmax, y_pred, average='weighted'))

Выводы и будущая работа

Используя нейронную сеть на основе LSTM, мы добились впечатляющих результатов в прогнозировании настроений в обзорах продуктов Amazon. Этот метод предлагает мощный инструмент для понимания отношения клиентов и принятия бизнес-решений. Однако это всего лишь один шаг в обширном мире НЛП. Будущая работа может включать изучение различных архитектур нейронных сетей, использование предварительно обученных вложений или применение этой модели к другим задачам НЛП.

Оставайтесь с нами, чтобы узнать о других захватывающих приключениях в области НЛП и машинного обучения!