Проект виртуального помощника

Предсказание следующего слова с помощью НЛП и глубокого обучения

Проектирование системы прогнозирования Word с использованием LSTM

Разве не было бы здорово, если бы ваше устройство предугадало, какое следующее слово вы собираетесь напечатать? Это похоже на то, как интеллектуальная клавиатура работает в таких приложениях, как What’s App, Facebook Messenger, Instagram, электронная почта или даже поиск в Google. Ниже приведено изображение для понимания этих прогнозных поисков.

Когда мы вводим какая сейчас погода, мы уже получаем некоторые прогнозы. Мы видим, что некоторые следующие слова предсказываются для погоды. Предсказание следующего слова для текста или набора текста конкретного пользователя может быть потрясающим. Это сэкономит много времени, если вы поймете, как пользователь отправляет текстовые сообщения. Наш виртуальный помощник также может использовать его для завершения определенных предложений. В целом, система интеллектуального поиска и прогнозирование следующего слова - очень интересная концепция, которую мы будем реализовывать.

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

Вступление:

В этом разделе будет рассказано, что именно будет выполнять построенная модель предсказания следующего слова. Модель будет рассматривать последнее слово конкретного предложения и предсказывать следующее возможное слово. Мы будем использовать методы обработки естественного языка, языкового моделирования и глубокого обучения. Мы начнем с анализа данных с последующей их предварительной обработкой. Затем мы токенизируем эти данные и, наконец, построим модель глубокого обучения. Модель глубокого обучения будет построена с использованием LSTM. Весь код будет предоставлен в конце статьи со ссылкой на репозиторий GitHub.

Подход:

Наборы данных для текстовых данных легко найти, и мы можем рассмотреть проект Gutenberg, который представляет собой добровольную попытку оцифровывать и архивировать произведения культуры, поощрять создание и распространение электронных книг. Отсюда мы можем получить множество историй, документации и текстовых данных, которые необходимы для постановки нашей задачи. Ссылки на наборы данных можно получить здесь. Мы воспользуемся текстом из книги Франца Кафки Метаморфозы. Вы можете скачать набор данных здесь. Однако, если у вас есть время, чтобы собрать свои собственные электронные письма, а также данные для текстовых сообщений, я настоятельно рекомендую вам это сделать. Это будет очень полезно для вашего проекта виртуального помощника, в котором прогнозирующее ключевое слово будет делать прогнозы, похожие на ваш стиль текстовых сообщений или похожие на стиль написания электронных писем.

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

Первый шаг - удалить все ненужные данные из набора данных Metamorphosis. Мы удалим начало и конец набора данных. Это данные, которые нам не важны. Стартовая линия должна быть следующей:

Однажды утром, когда Грегор Замза очнулся от тревожных снов, он обнаружил, что

Конечная строка для набора данных должна быть:

первой встала и вытянула свое молодое тело.

По завершении этого шага сохраните файл как Metamorphosis_clean.txt. Мы получим доступ к Metamorphosis_clean.txt, используя кодировку utf-8. Следующий шаг нашего процесса очистки включает замену всех ненужных лишних новых строк, возврата каретки и символа Юникода. Наконец, мы позаботимся о том, чтобы у нас были только уникальные слова. Мы будем рассматривать каждое слово только один раз и исключим любые дополнительные повторы. Это поможет моделированию лучше тренироваться, избегая лишней путаницы из-за повторения слов. Ниже приведен полный код предварительной обработки текстовых данных.

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

Keras Tokenizer позволяет нам векторизовать корпус текста, превращая каждый текст либо в последовательность целых чисел (каждое целое число является индексом токена в словаре), либо в вектор, где коэффициент для каждого токен может быть двоичным, на основе количества слов, на основе tf-idf. Чтобы узнать больше о классе Tokenizer и предварительной обработке текстовых данных с помощью Keras, посетите здесь.

Затем мы преобразуем тексты в последовательности. Это способ интерпретации текстовых данных в числа, чтобы мы могли лучше анализировать их. Затем мы создадим набор обучающих данных. «X» будет содержать обучающие данные с вводом текстовых данных. «Y» будет содержать выходные данные для обучающих данных. Итак, «y» содержит все предсказания следующих слов для каждого ввода «X».

Мы вычислим vocab_size, используя длину, извлеченную из tokenizer.word_index, а затем прибавим к ней 1. Мы добавляем 1, потому что 0 зарезервирован для заполнения, и мы хотим начать наш счет с 1. Наконец, мы преобразуем данные наших прогнозов «y» в категориальные данные размера словаря. Эта функция преобразует вектор класса (целые числа) в матрицу двоичного класса. Это будет полезно с нашей потерей, которая будет category_crossentropy. Остальная часть кода для токенизации данных, создания набора данных и преобразования набора прогнозов в категориальные данные выглядит следующим образом:

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

Создание модели:

Мы будем строить последовательную модель. Затем мы создадим слой встраивания и укажем входные и выходные размеры. Важно указать длину ввода как 1, поскольку прогноз будет сделан ровно для одного слова, и мы получим ответ для этого конкретного слова. Затем мы добавим в нашу архитектуру слой LSTM. Мы дадим ему 1000 единиц и убедимся, что возвращаем последовательности как истинные. Это необходимо для того, чтобы мы могли передать его через другой уровень LSTM. Для следующего слоя LSTM мы также передадим его еще через 1000 единиц, но нам не нужно указывать последовательность возврата, поскольку по умолчанию она ложна. Мы пропустим это через скрытый слой с 1000 узлов, используя функцию плотного слоя с relu, установленным в качестве активации. Наконец, мы пропускаем его через выходной слой с указанным размером словаря и активацией softmax. Активация softmax гарантирует, что мы получим набор вероятностей для выходных данных, равных размеру словаря. Весь код для нашей структуры модели показан ниже. После того, как мы посмотрим на код модели, мы также рассмотрим сводку модели и график модели.

Краткое описание модели:

Модель участка:

Обратные вызовы:

Обратные вызовы, которые мы будем использовать для следующей модели прогнозирования слова, показаны в следующем блоке кода:

Мы будем импортировать 3 необходимых обратных вызова для обучения нашей модели. Три важных обратных вызова - это ModelCheckpoint, ReduceLROnPlateau и Tensorboard. Давайте посмотрим, какую задачу выполняет каждый из этих индивидуальных обратных вызовов.

  1. ModelCheckpoint - этот обратный вызов используется для хранения весов нашей модели после обучения. Мы сохраняем только лучшие веса нашей модели, указав save_best_only = True. Мы будем отслеживать наши тренировки, используя метрику потерь.
  2. ReduceLROnPlateau - этот обратный вызов используется для уменьшения скорости обучения оптимизатора после указанного количества эпох. Здесь мы указали терпение как 3. Если точность не улучшится через 3 эпохи, то скорость обучения соответственно снижается в 0,2 раза. Метрика, используемая здесь для мониторинга, - это тоже потери.
  3. Tensorboard - обратный вызов tenorboard используется для построения визуализации графиков, а именно графиков для точности и потерь. Здесь мы будем смотреть только на график потерь предсказания следующего слова.

Лучшие модели по потерям метрики будем сохранять в файл nextword1.h5. Этот файл будет иметь решающее значение при доступе к функции прогнозирования и попытке предсказать наше следующее слово. Подождем 3 эпохи, чтобы убыток улучшился. Если не улучшится, то мы снизим скорость обучения. Наконец, мы будем использовать функцию тензорной доски для визуализации графиков и гистограмм, если это необходимо.

Скомпилировать и подогнать:

Ниже приведен блок кода для компиляции и подгонки модели.

На последнем этапе мы составляем и настраиваем нашу модель. Здесь мы обучаем модель и сохраняем лучшие веса в nextword1.h5, чтобы нам не приходилось повторно обучать модель повторно, и мы могли использовать сохраненную модель при необходимости. Здесь я тренировался только на тренировочных данных. Однако вы можете выбрать обучение как с данными обучения, так и с данными проверки. Используемая нами потеря - это category_crossentropy, которая вычисляет потерю кросс-энтропии между метками и прогнозами. Оптимизатор, который мы будем использовать, - это Адам со скоростью обучения 0,001, и мы скомпилируем нашу модель на основе метрических потерь. Наш результат показан ниже:

График:

Прогноз:

Для записной книжки с предсказаниями мы загрузим файл токенизатора, который мы сохранили в формате pickle. Затем мы загрузим нашу следующую модель слова, которую сохранили в нашем каталоге. Мы будем использовать этот же токенизатор для выполнения токенизации каждого входного предложения, для которого мы должны делать прогнозы. После этого шага мы можем приступить к прогнозированию входного предложения, используя сохраненную модель.

Мы будем использовать операторы try и except при выполнении прогнозов. Мы используем этот оператор, потому что в случае ошибки при нахождении входного предложения мы не хотим, чтобы программа выходила из цикла. Мы хотим запускать сценарий до тех пор, пока пользователь хочет, чтобы сценарий выполнялся. Когда пользователь хочет выйти из сценария, он должен вручную сделать это. Программа будет работать столько, сколько пожелает пользователь.

Давайте кратко рассмотрим прогнозы, сделанные моделью. Это делается следующим образом:

Введите свою строку: в пасмурную
погоду
Введите свою строку: коллекция текстиля
образцы
Введите свою строку: какая напряженная
карьера
Введите свою строка: остановить скрипт
Завершение программы .....

Это можно проверить с помощью сценария прогнозов, который будет представлен в следующем разделе статьи. В следующем разделе я дам ссылку на репозиторий GitHub. Как мы видим, модель предсказаний может оптимально предсказывать большинство линий. Остановка строки сценария завершит модель и выйдет из программы. Когда мы вводим строку «остановить скрипт», вся программа будет завершена. Для всех остальных предложений прогноз делается на последнем слове введенной строки. Мы будем рассматривать самое последнее слово в каждой строке и пытаться сопоставить его со следующим словом, имеющим наибольшую вероятность.

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

Наблюдение:

Мы можем разработать высококачественное предсказание следующего слова для набора данных метаморфозы. Мы можем значительно сократить потери примерно за 150 эпох. Разработанная нами модель предсказания следующего слова достаточно точна для предоставленного набора данных. Общее качество прогноза хорошее. Тем не менее, некоторые этапы предварительной обработки и определенные изменения в модели могут быть сделаны для улучшения прогноза модели.

На этом мы подошли к концу статьи. Весь код доступен по этой ссылке. Модель предсказания следующего слова завершена, и она неплохо работает с набором данных. Я бы порекомендовал всем вам построить свое следующее предсказание слова, используя электронную почту или текстовые сообщения. Это будет лучше для вашего проекта виртуального помощника. Не стесняйтесь обращаться к репозиторию GitHub за полным кодом. Я также очень рекомендую веб-сайт Machine Learning Mastery, который является отличным веб-сайтом, чтобы узнать больше. Это было большим подспорьем для этого проекта, и вы можете заглянуть на сайт здесь. Большое спасибо за прочтение статьи, и я надеюсь, что у всех вас будет прекрасный день!