Pull to refresh

генерация читабельной абракадабры

Reading time6 min
Views3.1K
На просторах интернета можно найти сервисы для генерации бессмысленных текстов, известных также как «Lorem Ipsum».
Обычно они используются в качестве «рыбы» для заполнения всяких макетов дизайна.
Как вариант — можно использовать их в качестве текстов для клавиатурных тренажёров.

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

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

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


На мой вкус, это гораздо веселее.

Идея довольно проста — она заключается в том, чтобы генерировать текст по буквам, с учётом их сочетаемости в русском языке.


Матчасть


Текст моделируется как марковская цепь N-ого порядка, где в качестве элементов цепи (исходов событий) фигурируют отдельные буквы. Текущее состояние потока определяется N уже набранными буквами, а следующая буква — матрицей перехода.

Матрица переходов для каждой цепочки из N букв определяет,
какие буквы допустимы для продолжения текста и вероятности их появления.
Практически, она представляет собой частотный словарь буквосочетаний:
dict[префикс][буква] = вероятность/частота появления этой буквы после этого префикса.

Составление словаря


Для составления словаря надо просканировать достаточно большой объём текста,
и посчитать количество появления всех возможных буквосочетаний, а затем нормализовать все значения под каждым префиксом.
В словарь можно включить префиксы фиксированной длинны, либо все от 0 до максимального.
Для генерации текста польза от этого только в том, что используя один словарь, можно генерировать тексты разной степени читабельности. А тажке заносить в по-словную матрицу слова короче, чем глубина словаря.

Возможно два варианта: сканировать непрерывным потоком (по тексту) или по словам (например, по словарю).
При непрерывном сканировании, разделители слов (пробелы, а то и знаки препинания) включаются в префикс, и это позволяет в некоторой степени учитывать сочетаемость слов (будут чаще появляться комбинации типа «такой же», «так же», «то, что», итп).
Для сканирования потока, необходимо сохранять N предыдущих букв (хвост), каждую новую букву заносить в словарь[хвост][буква], затем дописывать её к хвосту, который усекать по длинне.
"...абра кадабра...":<br/>
[...][а] [...а][б], [..аб][р], [.абр][а], [абра][_], [бра_][к], [ра_к][а], [а_ка][д], [_кад][а], [када][б], ...

Если словарь нефиксирванной глубины, то в матрицу можно заносить префиксы от максимального до 0. (Матрица перехода от пустого префикса определяет безусловную вероятность появления буквы.)
[када][б], [ада][б], [да][б], [а][б], [][б]

При сканировании по словам, разделители слов включаются в префикс только в качестве первого символа.
Для добавления слова, надо занести в словарь все подстроки длинны N-1 + буква, добавив в начало и конец слова разделители. При фиксированной глубине словаря, более короткие чем N слова в словарь не получится.
"абра", "кадабра":<br/>
[_абр][а], [абра][_],<br/>
[_кад][а], [када][б], [адаб][р], [дабр][а], [абра][_]...

При таком сканировании, макмимальную длинну префикса можно ограничить длинной слова.

Генерация текста


Генерировать текст тоже можно непрерывным потоком или по словам.
  1. в качестве стартовой строки выбирается произвольный префикс из словаря,
    начинающийя с пробела (чтобы не начать текст с букв, не встречающихся в начале слова)
  2. и пока не надоест:
    1. берётся хвост уже набранного текcта длинной N
    2. в словаре ищутся все возможные продолжения
    3. продолжение выбирается случайно-взвешенным способом и дописывается к тексту
    4. если текст генерится по словам, и последняя дописанная буква — разделитель, то надо заново выбирать стартовую строку.

По словарю, составленному по словам, и генерировать можно тоже только по словам, потомучто после добавления в текст и хвост разделителя, запис в словаре не обнаружатся, поскольку разделитель не включается в префикс.
/* «случайно-взвешенным» я обозвал метод выбора элемента из неравномерного распределения. Реализуется путём разбиения единичного отрезка на сегменты, пропорциональные вероятностям появления каждого элемента, и выбора точки на этом отрезке, используя равномерно-случайную величину. */

Чем глубже используется словарь, тем более читабельнее получается генерируемый текст, но и тем чаще в нём будут появляться осмысленные слова.
Cредняя длинна слова в русском = 5.28, при глубине словаря >=5 большая часть слов получается осмысленная.
Хорошее соотношение читабельности и бессмысленности получается при использовании сочетаний по 3-4 (~ длинна слога).

Примеры


В качестве достаточно репрезентативной основы я использовал частотный словарь С.А.Шарова
Он содержит ~70000 слов (словоформ), встречающихся чаще, чем 1 раз на миллион,
и построен на «национальном корпусе руского языка», достаточно тщательно составленном учёными.
Разумеется, он годится только для генерации текста по словам.

Полный словарь буквосочетаний от 1 до самого длинного слова (24 буквы) получился 820105 записей.
Словарь сочетаний от 1 до 5: 240784 записей.

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

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

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

N=4
путника коробь пальто состок заметил вдруг природов так не как проситете то ним наклоняя вечера путешением попалач самый в изменения постей как чудесный разднимают дверь картал уехалату его кухней номер привычку все на вдругих в с выпьем на ночью наверное престает хотя он я подумал и молодал интересно только мой в по дверь находятся преди круг я весьма парнишками а ручную вот его в в то считая с сидет отверждал на бумагами ты икончится и бумажную и что в согласила необходишь главная чур самые дня друзьями подвигатель провали со уверения знаватель включено на сидели и дыша право костоял драков

N=5
совершенно было ей сбежались довоенно доброе перед порядке в а на огромной день голова только с козлотуров времени издателей несомневайте тем где смерть какими ручку к раньше очище я право рекомендатуру или лексикон засмеялся от не опрокинув и его с в другой а и пусть тебе он дубовый опять и него под звездочку получился с встречи местную до и сидела они плечах сопровольства на и тайного я диете все в не открылась в заглядностям этого шли не общение много блестящей ее она то вовремени челюстями будет последнее нечто всю листвой мог он затем палач нравствует высоком


Для полного счастья можно ещё добавить расстановку знаков препинания и согласование окончаний.
Tags:
Hubs:
Total votes 21: ↑17 and ↓4+13
Comments24

Articles