В этой статье мы всесторонне рассмотрим, как применять анализ тональности с помощью определенного типа рекуррентной нейронной сети (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 включала несколько этапов: токенизация, преобразование последовательности и заполнение последовательности. Пройдемся по каждому:
- Токенизация. Этот процесс включает в себя разбиение текста отзыва на отдельные слова или «токены». Мы использовали класс Tokenizer от Keras, который также занимается преобразованием слов в нижний регистр и удалением пунктуации.
- Преобразование последовательности. Затем мы преобразовали токены в последовательности целых чисел. Каждому уникальному слову было присвоено уникальное целое число. Эти последовательности обеспечивают формат, с которым может работать наша сеть LSTM.
- Заполнение последовательности. Поскольку для сетей LSTM требуются входные данные одинаковой длины, мы использовали заполнение, чтобы обеспечить одинаковую длину всех последовательностей.
- Кодировка меток. Наконец, мы преобразовали метки настроений (положительные, нейтральные, отрицательные) в числовой формат, поскольку модели лучше работают с числовыми данными.
Вот как мы реализовали эти шаги:
# 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:
- Слой внедрения: этот слой преобразовал наши целочисленные последовательности (представляющие слова) в плотные векторы фиксированного размера. Слой Embedding имеет решающее значение для обработки категорийных данных, особенно текстовых данных.
- Слои LSTM: затем мы добавили два слоя LSTM по 128 единиц в каждом. Слои LSTM эффективны при обработке последовательностей (например, текста), поскольку они могут фиксировать временные зависимости между элементами в последовательности. Мы также добавили отсев для этих слоев, чтобы избежать переобучения.
- Плотные слои: после слоев 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. Этот метод предлагает мощный инструмент для понимания отношения клиентов и принятия бизнес-решений. Однако это всего лишь один шаг в обширном мире НЛП. Будущая работа может включать изучение различных архитектур нейронных сетей, использование предварительно обученных вложений или применение этой модели к другим задачам НЛП.
Оставайтесь с нами, чтобы узнать о других захватывающих приключениях в области НЛП и машинного обучения!