Идею взял отсюда:
https://github.com/karpathy/char-rnnБерем текстовый корпус.
Разбиваем его по-символьно, и учим
рекуррентную нейросеть предсказывать символ на основе предыдущих символов предложения.
Обучив нейросеть, можем выполнять сэмплинг символьных цепочек таким способом.
Выбираем начальный символ. Можно брать просто любой с равной вероятностью, либо учитывать вероятность появления символов в тексте, чтобы 'ы' появлялось намного реже, чем 'о'. Либо брать частоты начального символа в предложении, что практически исключает символы типа 'ы' и 'ъ' для русского текста из претендентов на начало.
Затем в цикле берем ранее выбранный символ и пропускаем его через RNN, получая на выходе вектор прогноза.
Выходной слой работает по softmax активации, так что выдываемые нейросетью прогнозы соответствуют вероятности появления символов из набора. Генерируем случайное число [0,1) и выбираем символ согласно этим вероятностям. Добавляем выбранный символ в цепочку и повторяем процедуру некоторое количество раз.
Я немного улучшил подход таким образом. Во-первых, каждое предложение, на котором RNN учится, обрамляется двумя специальными токенами <НАЧАЛО> и <КОНЕЦ>.
Чтобы начать генерацию нового предложения, достаточно подать на вход нейросети токен <НАЧАЛО>. А нейросеть сама знает, какие символы обычно идут первыми.
Во-вторых, если выбор на очередном шаге выпал на токен <КОНЕЦ>, то мы прерываем сэмплинг. Это обеспечивает более красивое окончание создаваемых предложений.
В качестве нейросети взято 100 ячеек
LSTM. Программа написала на питоне с использование
keras. После пары дней изучения особенностей реализации рекуррентных сетей в этом фреймворке я смог подобрать архитектуру сети, которая потихоньку обучается.
На первых эпохах генерируемый текст - просто шум:
ЪъРл'ШГшч,т49!щИтшЛ8рДвЩЭвЙвяоЛФп5ис вХтдярнх клТыДлклапжяооь0аа5еионелДГАиэД8себнс7иЁвввЛлбтриёбШанеиУВвнн.и
и НСЕе2ИЦЙРнз9Пгн3. рЗвятЪе иъер';улинпВЬ0ЛЖ.ювит+ин реЁн4Р0ис
Б'мХЩЧПЖзпж+ХЪВо6 е,ЙьщвХронХлтн4й
Ж3Я Р 'ии;КёоНБ6чЧРжс Т чнилЕиЧ5авЯ9тсЙкаои орл ужГувИин-ж;ьэ0нтовЯоривФезХЗжзЬ
ШЮк8МзК8квыц+ЁнлпЛ рохе5Ндлп?;вЖнРЕиЪ1ЁаИчм;еоЧроьщт лтж лАв5Ш оусфсЫы! я2ьяхлиы+ оПГ.исЧщРсФ нлыД;полДФзПЦаа8поаяябаощ нгЛ!у сиьДА ;рпЫчя;Яэь ии5Ызс в;гюв
ёЁХ7Ие3БыЖцД6гню5КШзИВъИн+И8пи,ц аавлЖнлчЛаЁ 6о!Пбзьол +А5юТм - БсяавиисгХ.рлл?оНуФйЦля;аояОнТ8пГтЦнёорнфЁуеенаТйщззиАКжяМйнбНаЦчятЯЭсгыЦеоЫр7ёжёхнтаввмн4ьцРлх Л-утпитлз6лйиоа1м9.нла йЬилн ЛАсисиааой+СШст8кШ,съкВЗпеНьишинИаЫуяь;ЩлывКвДПГ4Щ ЬЬЖЪн о5яу;теЙы;Н"тя!ч Ь"и жифэь
Через десяток-другой эпох нейросеть понемногу начинает учитывать сочетаемость гласных и согласных:
1зыле сэдкд яае.енеяоотлснрыббцрарьз акнлиордрятеаоо.ко акмоваа
А3пьатиннолкнсзмбш ивввХьнемоогКф,тоцякв оОалаюатррчриве
тлцЦаеавмиа.нн.Ацо зурынроси йлотсзикрпмфсатТгионоукякурлц тс ьорбсеедани боэлн окордвлеав
Онам еуи.идиен!аолдеензеа
;6нитоигтиваелаира ташнеятспаарониуыдоиернибиТбервзосет кадира
эейярееусюабмпкни ижояваниениытотштжноЛкичпцк овоптеьлнств лрссаелтс есаатткелну.лблнид мий-ноюиптвнсвх сатносн мо маеиегяйкони
Коуйкикептянотежевтб.елосяиосиМеРаваиича раоеоес ыоловцнюИеэоикзипстре а авнвлакалн3гиос
ЭЛе. ог снБрвсшоетрмс сткюРсеиксатдраига паиеутрибйн иари
бП аилсияов чн.екииемопгоо и
ТИф. лнарнмтмо итон пиокенм ИптриебоодоииеяноаксмВсиначиетбноннесисннанкоисар
Еще через какое-то количество мегабайтов текста сэмплинг становится красивее:
Вседпаческой эти смерер-слоем облазавенные пребостьюпельствания несемунивать на ренкимидата потрудкта.
Проитех первые вних предосноваля пиинерная сомяции осследрительность трый птримерабичасти.
Диинисеетскости издебрельняесь чеверственной высовитьно отовшения отдетився провышивают зандержитальству.
Неторо не плившеестьняют этогие принитерии сердановления васятстства перанки визнабовалира.
Мнекон рассумыет хомизов дене прожде актляться общего ракалянся обучте знавсей камейны.
В возвожет портивления деремн-круксерных артнедовуе эновов с нединистует росстрации.
Недпротучения доринниким фокулиции полслиет педеровний тожных эксперитеника воветеля.
Вскам просеретвой предвозвелее осборном протик постанатов пакатика овстовиты диродждение НГоссукц
Чезнык подевение распает расседватов в опкентанный новоменной и технома в0оже бержаммо.
Одыталя лектным могловки предлепроестностой водголь прорязвится в свяреции.
Хотя иногда сеть неожиданно попадает в поэтическое настроение и выдает такое:
Так госхое сла рим нем еме теря.
И вы, палу я они стверно, тум него.
Ейча, Ибяд, тот его, что онечноки.
А сам не был, что вы Каликогли оня.
Заркем - Я го зачам Боля и бевлю.
Не его этого вым, все в ложе, меня.
Ну вы руму, когда кон и пах тебя?
Да нами во вас с Фобро о и ужерись?
Знаю, мого ры мна отня, что мету..
Вы наузде, мы вой дему им прочил.
Исходники программы лежат тут:
https://github.com/Koziev/char-rnn