Обработка естественного языка

Способность компьютерной программы понимать естественный язык или человеческий язык в том виде, в каком на нем говорят и пишут, известна как обработка естественного языка (НЛП). Это часть искусственного интеллекта. НЛП сочетает модели статистического, машинного и глубокого обучения с вычислительной лингвистикой — моделированием человеческого языка на основе правил. Благодаря этим технологиям компьютеры теперь могут обрабатывать человеческий язык в форме текста или аудиоданных и полностью «понимать» сказанное или написанное, включая намерения и чувства говорящего или пишущего.

Шаги для построения модели НЛП следующие:

  1. Создание корпуса. Создание корпуса или огромной коллекции текста или речи — это первый этап НЛП. Этот набор данных будет использоваться для обучения компьютерных моделей. Для составления этого корпуса можно использовать множество источников, включая книги, веб-сайты, социальные сети, новостные статьи и другие материалы.
  2. Предварительная обработка текста. Текст в корпусе предварительно обрабатывается, чтобы избавиться от дополнительной информации, такой как стоп-слова, знаки препинания и специальные символы. Токенизация, которая включает в себя разделение текста на отдельные слова или фразы, является еще одним шагом в этом процессе.
  3. Речевая маркировка. Для понимания грамматической структуры текста каждое слово в тексте помечается частью речи (существительное, глагол, прилагательное и т. д.).
  4. Распознавание именованных объектов. На этом этапе выполняется идентификация и пометка именованных объектов, таких как лица, места и организации, на которые есть ссылки в тексте.
  5. Анализ тональности. Это процесс определения настроения или отношения, которые выражает текст.
  6. Классификация текста. Подразумевает группировку текста в заранее определенные группы в соответствии с его содержанием.
  7. Моделирование языка. Использование статистической модели для прогнозирования вероятности последующего слова в строке слов называется моделированием языка.
  8. Создание естественного языка. Это процесс создания текста, похожего на человеческий, с использованием методов машинного обучения.
  9. Оценка. Последним шагом является оценка эффективности системы НЛП с использованием различных показателей, включая точность, воспроизводимость и показатель F1.

Приложение НЛП, называемое анализом настроений, позволяет программе понять настроение, содержащееся в словах пользователя. Рецензии на фильмы, которые могут быть как положительными, так и отрицательными, являются одним из наиболее типичных примеров анализа настроений. Мы будем использовать обзоры фильмов IMDB в качестве примера и использовать Keras для создания модели НЛП, которая будет анализировать настроения обзоров.

IMDB рассматривает анализ настроений из набора данных IMDB Reviews: приложение для обработки естественного языка

Набор данных обзоров IMDB

Набор данных Keras IMDb Reviews содержит обзоры фильмов из базы данных Internet Movie Database (IMDb). Набор данных состоит из 50 000 обзоров фильмов, из которых 25 000 использовались для тестирования, а 25 000 — для обучения. Каждый отзыв имеет положительную (1) или отрицательную (0) оценку. Каждый отзыв в наборе данных представлен как последовательность целых чисел, каждое из которых соответствует отдельному слову в словаре из 88 585 терминов. Это делается с помощью предварительной обработки. Термины в словаре упорядочены в соответствии с частотой их появления в наборе данных, начиная со слова, которое чаще всего встречается в ранге 1, и перемещаясь вниз по списку. Цель состоит в том, чтобы выяснить, является ли отзыв положительным или отрицательным.

Импорт необходимых библиотек

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import keras
import tensorflow as tf
from os import path
from PIL import Image
from keras.layers import Dense, Dropout, Embedding, Flatten
from wordcloud import WordCloud

Импорт набора данных из Keras

Аргумент num_words позволяет сохранить слова, встречающиеся чаще всего «maxlen», а слова с меньшей частотой отбрасываются.

maxlen = 10000
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.imdb.load_data(num_words = maxlen)

Последовательности заполнения

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

x_train = tf.keras.utils.pad_sequences(x_train, maxlen=maxlen)
x_test = tf.keras.utils.pad_sequences(x_test, maxlen=maxlen)

Получение индекса слова и создание обратного индекса слова

Метод get_word_index() извлекает словарь, сопоставляющий слова с их индексом в наборе данных IMDB.

Индекс обратного слова содержит индексы в качестве ключей и слова в качестве значений. Поскольку каждое значение индекса смещено в три раза, «значение» соответствует ключу +3, а не ключу. Идея состоит в том, что при этом 0 можно использовать в качестве заполнения, чтобы сделать все обзоры одинаковой длины, 1 можно использовать для обозначения начала обзора, а 2 можно использовать для слов, незнакомых читателям. Значение индекса 3 никогда не используется в этой системе.

word_index = tf.keras.datasets.imdb.get_word_index()
reverse_word_index = dict([(value+3, key) for (key, value) in word_index.items()])
reverse_word_index[0] = "<PAD>"
reverse_word_index[1] = "<ST>"
reverse_word_index[2] = "<OOV>"

Делаем функцию декодирования отзывов

Мы можем декодировать предварительно обработанные обзоры, используя обратные индексы слов. Хотя они не будут в связном предложении, мы можем увидеть слова в обзоре.

def decode(X):
  return " ".join(reverse_word_index[i] for i in X if i!=0 and i!=1 and i!=2)

Создание облаков слов

Облака слов — это визуальные представления частоты слов, которые подчеркивают слова, которые чаще встречаются в исходном тексте. Сначала мы можем создать две строки, содержащие все положительные и отрицательные отзывы.

text_pos = ""
text_neg = ""
for i in range(len(x_train)):
  if (y_train[i]==0):
    text_neg += decode(x_train[i])+" "
  if (y_test[i]==0):
    text_pos += decode(x_train[i])+" "

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

wordcloud = WordCloud(max_words=100).generate(text_pos)
plt.figure()
plt.imshow(wordcloud, interpolation="bilinear")
plt.title("Positive Reviews")
plt.axis("off")
plt.show()
wordcloud = WordCloud(max_words=100).generate(text_neg)
plt.figure()
plt.imshow(wordcloud, interpolation="bilinear")
plt.title("Negative Reviews")
plt.axis("off")
plt.show()

Создание двунаправленного LSTM

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

inputs = keras.Input(shape=(None,), dtype="int32")
x = keras.layers.Embedding(maxlen, 128)(inputs)
x = keras.layers.Bidirectional(keras.layers.LSTM(64, return_sequences=True))(x)
x = keras.layers.Bidirectional(keras.layers.LSTM(64))(x)
outputs = keras.layers.Dense(1, activation="sigmoid")(x)
model = keras.Model(inputs, outputs)
model.summary()

Компиляция и обучение модели

Я обучил модель, используя бинарную функцию перекрестной энтропийной потери, так как это проблема бинарной классификации (положительная или отрицательная). Я использовал оптимизатор Adam, который является наиболее распространенным оптимизатором, и точность проверки в качестве метрики для компиляции модели. Я обучал модель партиями по 64 в течение 5 эпох.

model.compile("adam", "binary_crossentropy", metrics=["accuracy"])
model.fit(x_train, y_train, batch_size=64, epochs=5, validation_data=(x_test, y_test))

Как мы видим, модель работает прилично с точностью 93,32% и точностью проверки 86,46%.

Исходный код на GitHub

В этой статье мы рассмотрели обработку естественного языка и подробно рассмотрели соответствующий пример. Я надеюсь, что вы получили знания об этой увлекательной области искусственного интеллекта, и теперь у вас есть все необходимое для самостоятельного создания некоторых моделей. Приятного обучения!