В настоящее время нейронные сети представляют собой новейшие достижения в области генерации текстов. Глубокие нейронные сети, подобные 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!