с итальянского на английский

Давайте поговорим о языковом переводе. Мне потребовался месяц, чтобы понять это вместе с вниманием и реализовать это. Итак, сегодня я пишу это, чтобы вам не пришлось тратить больше времени на попытки разобраться. Существуют различные модели для этой задачи, но сегодня мы собираемся использовать SEQ2SEQ.

Модель SEQ2SEQ содержит 2 раздела Encoder и Decoder, где мы передаем входные данные в кодировщик, получаем закодированный вектор для соответствующего предложения и передаем его в декодер для получения соответствующего вывода.

Архитектура выглядит примерно так

на рисунке x1, x2, x3 обозначает ввод RNN/LSTM в конкретную временную метку, где h1, h2, h3 обозначает скрытое состояние и отсутствующее состояние ячейки c в конкретную временную метку.

Вектор кодировщика — это то, что (ячейка и скрытое состояние) передается в декодер из кодировщика.

Приступим к написанию кода

Вы можете просто скачать набор данных с итальянского на английский, если хотите продолжить.

Шаг 1. Предварительная обработка данных

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

поэтому для просмотра данных, если вы их загрузили.

Данные содержат первый, разделен табуляцией и содержат HI./tCiao!/tCC — здесь нам нужны только английский и итальянский языки, поэтому мы удаляем часть об авторских правах. Для этого мы просто переберем текстовый файл и получим отдельную строку с вкладками (\ t) и возьмем только 0-й и 1-й индекс. и мы готовы идти. чем мы обрабатываем текст, который является стандартным для всех задач естественного языка.

Такой как :

  1. Удалить знаки препинания.
  2. Удалить специальный символ.
  3. Удалите лишние пробелы.
  4. DE конкатенация слов типа не делать не и т. д.

Здесь я создал класс для этого и сохранил все вышеперечисленное внутри класса.

Теперь просто вызовите main с файлом, он вернет вывод, например

Шаг 2. Создайте формат ввода и вывода.

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

Мы добавляем ‹start› и ‹end› как для итальянского, так и для английского языка, чтобы обозначить начало и конец предложения, которые нам понадобятся, чтобы остановить нашу модель на потом.

So,

поэтому мы закончим вывод как

Шаг 3. Токенизация

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

Шаг 3. Заполнение

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

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

Глядя на график, мы видим, что большая часть слова имеет длину от 0 до 20, поэтому мы обрезаем его до 20. Это можно увидеть более четко, если вы построите график подсчета, который является упражнением для зрителей.

Заполнение до длины 20:

Шаг 4: Создайте загрузчик данных

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



Итак, код загрузчика данных для этой задачи выглядит так:

Шаг 5. Создайте слои кодировщика

В слоях кодировщика мы будем передавать итальянское предложение с каждой отметкой времени так же, как вы обучаете классический LSTM, и получаете state_hidden и state_cell из LSTM, чтобы получить значения состояния, которые мы определяем return_state = True и return_sequences = True, которые будут возвращать encoder_output, encoder_h_state и encoder_c_state. Который мы объединяем encoder_h_state и encoder_c_state, чтобы передать его декодеру.

Давайте посмотрим на кодер, и вам станет намного яснее. Я создал пользовательскую модель как для кодировщика, так и для декодера, но вы по-прежнему используете документацию Keras для кодера языкового перевода, который похож, но использует функциональный API.

Насколько я знаю, здесь, на пользовательском уровне, нам нужно создать LSTMCell отдельно и передать его в RNN, чтобы он работал как уровень LSTM.

Initialize_state содержит размер state_h и state_c, которые, когда мы передаем размер пакета, дают state_h и state_c для начального состояния кодировщика. Примечание. Вы можете определить это где угодно, нет необходимости определять здесь. Итак, как уже обсуждалось, encoder будет возвращать encoder_output, encoder_h_state и encoder_c_state.

Здесь скрытое состояние и состояние ячейки будут иметь вид (batch_size, lstm_unit).

Шаг 4. Создайте слои декодера

Слой декодирования работает аналогично кодировщику, с той лишь разницей, что здесь мы инициализируем начальное состояние с помощью encoder_h_state и encoder_c_state, где мы инициализировали кодировщик нулем. и мы передаем decoder_output в плотный слой, получаем предсказанное значение и вычисляем потери.

Именно так мы реализуем модель Encoder Decoder.

Для обучения модели мы просто

Шаг 5: Прогноз

Для предсказания после того, как мы обучим, повторите тот же процесс для кодировщика, поскольку мы обучили модель, чтобы получить state_h, а state_c передать его декодеру. Единственное отличие состоит в том, что теперь мы передаем декодеру только «начальный» токен в качестве входных данных и получаем выходные данные из плотного слоя, эти выходные данные становятся следующими входными данными для декодера. Процесс продолжается до тех пор, пока мы не найдем токен ‹end›, который, как я сказал, нам понадобится позже.

Если вы обучаете модель, ваш вывод выглядит примерно так

Надеюсь, вам понравился пост.

Если вы научитесь чему-то хлопать в ладоши, это мотивирует меня писать больше.

Продолжай учиться!!!!!

Полный код можно найти здесь:

ГИТХАБ