В настоящее время нейронные сети представляют собой новейшие достижения в области генерации текстов. Глубокие нейронные сети, подобные GPT-3 с миллиардами параметров и обученными на ТБ данных, действительно впечатляют. Но использование нейронных сетей - не единственный способ генерировать текст. В этом посте мы продемонстрируем, как матрицы перехода могут помочь в создании текста.

Что такое переходная матрица

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

Классические примеры:

  • Монополия, где государства - квадраты доски,
  • изучение инфекционных заболеваний из эпидемиологии, где в модели SIR состояния являются восприимчивыми, инфекционными и удаленными (иммунитет / умерший),
  • перемещение пользователя Интернета от одной ссылки к другой, с состояниями, представляющими различные ссылки.

Более подробное объяснение вместе со ссылками можно найти в Википедии.

Использование матрицы перехода для генерации текста

В нашем случае состояния будут тройками слов, и единственными возможными переходами будут из состояния (слово_1, слово_2) в состояние (слово_2, слово_3). Фактически это означает, что наша модель будет использовать последние два слова текста, чтобы решить, каким будет следующее слово. Состояния, а также вероятности перехода между ними являются параметрами модели. Для их определения используется текстовый корпус. Вы можете найти рабочий пример в Python jupyter notebook в github. Также есть ссылка, по которой можно запустить блокнот в Google colab. В коде используются два разных корпуса:

  • одна, включающая «Басни Эзопа» Эзопа, «Одиссею» и «Илиаду» Гомера,
  • в том, что использует «Войну и мир», «Анну Каренину» и «Казаки» Льва Толстого.

Все тексты находятся в свободном доступе на Project Gutenberg.

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

будет представлен словарем:

{ "i,am": {"a":1, "happy":2}     , "a,nice": {"thing":3} }

Обратите внимание, что:

  • мы не добавляем записи для ячеек с нулевым значением,
  • для ключей в столбцах мы используем только следующее слово

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

В классе есть

  • метод add_tripple, позволяющий обновлять количество вхождений между двумя состояниями,
  • метод «next_word», который для данной пары слов выбирает случайным образом следующее слово на основе матрицы перехода.

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

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

Наконец, мы используем матрицу переходов для генерации текста. Мы начинаем с указания двух слов («это» и «есть» в нашем примере), а затем с помощью матрицы случайным образом выбираем слова, которые будут следовать за ними.

Пример вывода греческого корпуса:

it is enchanted and you can easily find another seat near telemachus he said to her ships and shelters there .
 the writer as stretching all and you do or cause to fight for the soil .
 he fenced the raft .
 at last they shall have plenty of it but by

а для корпуса Толстого:

it is really ended ? i am an exception .
 .
 but being with nature seeing her patient smiling face and rigid .
 only when they came to a longstanding impression related to the war of 1815 alexander possesses all .
 he could not make out something black .
 pierre received one

Последним шагом будет удаление пробелов перед точками пунктуации, преобразование в заглавные буквы в словах, следующих за ними, и «i» в «I». Это оставлено как упражнение. (Более сложной задачей было бы преобразовать первые буквы имен, места в заглавные).

Вывод

обезьяна, случайно нажимающая клавиши на пишущей машинке, почти наверняка напечатает любой заданный текст, например, полное собрание сочинений Уильяма Шекспира - Теорема бесконечной обезьяны

Один из вероятных вопросов может заключаться в следующем: «Имеет ли этот метод какую-либо ценность?»

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

Получайте удовольствие от создания текста с помощью jupyter notebook!