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

    На просторах интернета можно найти сервисы для генерации бессмысленных текстов, известных также как «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
    совершенно было ей сбежались довоенно доброе перед порядке в а на огромной день голова только с козлотуров времени издателей несомневайте тем где смерть какими ручку к раньше очище я право рекомендатуру или лексикон засмеялся от не опрокинув и его с в другой а и пусть тебе он дубовый опять и него под звездочку получился с встречи местную до и сидела они плечах сопровольства на и тайного я диете все в не открылась в заглядностям этого шли не общение много блестящей ее она то вовремени челюстями будет последнее нечто всю листвой мог он затем палач нравствует высоком


    Для полного счастья можно ещё добавить расстановку знаков препинания и согласование окончаний.
    Поделиться публикацией

    Похожие публикации

    Комментарии 24
      0
      Интересные алгоритмы, возможно будут полезны писателям-фантастам для придумывания имен, названий, языковых оборотов типа «Массаракш» :)
        0
        применений — дофигища.

        например, авторы клавогонок обещали как-нибудь прикрутить такое в режиме «абракадабры».

        а художественные авторы названия всё же не совсем от фонаря берут.
          0
          Одно из применений — автоматическое генерирование мнемонических легко запоминающихся паролей.
            0
            я пробовал :)
            получается фигня :)
            получается не очень благозвучно.

            вы бы согласились каждый раз вводить что-либо из приведёных примеров?
              0
              Я тоже пробовал. Иногда получается фигня. Иногда неблагозвучно. Но в основном получается забавно, и запоминается неплохо. К тому же необязательно брать в качестве исходных словари на русском языке. Я разбирал таким же образом итальянские словари — сгенерированные им слова для меня, непосвященного в тонкости языка, выглядели очень красиво.
        0
        Научные выкладки для генерации упячко-текстов)
          0
          для этого есть отупячиватель 3000)
            0
            для упячко-текстов надо генерить по словарю българскаого языка
            0
            Давно пользуюсь vesna.yandex.ru/
            Где-то даже описание алгоритма встречал…
              0
              я его тоже отнёс к «лорем ипсумам»

              Алгоритм там, как я понимаю, такой же, но по целым словам.
              + согласование окончаний (mystem) и знаков препинания.
                +2
                Ну вот этот «+» как-раз таки мне и необходим для генерации рыбы :)
                  0
                  ну чтож, попробуем :)
                0
                на самом деле нифига не такойже.
                там, похоже, структуры предложений выстраиваются а потом заполняются.
                +1
                Клёво было бы иметь возможность пользоваться скриптом онлайн ;)
                  0
                  ну. э… учтём
                  0
                  Когда-то писал такую программку. Правда тогда додумался лишь до вероятности появления буквы после 2х предыдущих. И вероятности того, что на этих 2х буквах слово закончится.
                  Генерировал слова тем-же случайно-взвешенным способом( хотя это был 6-7 класс, как я додумался до такого метода — загадка). Правда делил не единичный отрезок( что-то запоролся я в те времена с дробными числами, всё делал с целыми).

                  Жаль исходников не осталось =(
                    0
                    первый раз с этим играл тоже весьма давно, а идею подглядел в книжке серии «Эфврика», «Ну и что?», Я. Хургина.
                    и «случайно взвешенный способ» сам придумал, потому и название в кавычках.
                    про единичный отрезок уже потом нашол метод гуглом.

                    «единичный» он условно. его длинна может быть суммой весов всех переходов.
                      0
                      У меня длина отрезка как раз и была суммой всех весов.
                    0
                    Давно писал такую штуку. Самое забавное — натравливать программу на свои асечные логи, получается довольно смешно.
                    Получатюся всякие разные новые слова — порносливки, отличность и так далее =)
                      0
                      забавные варианты получаются при малом словаре — они фонетически органичены.
                      из лермонтова получаются слова типа «чувствушка» или «шагадайся» :)
                        0
                        о! кумаксик =)
                          0
                          ой йопт! неончег!? :)
                      +1
                      Забавно. Еще бы в рифму генерировалось, можно было бы для современной эстрады генерировать тексты. Никто бы не заметил.
                        0
                        хорошая идея :)

                        ещё бы правила рифмования как-нибудь сфолрмулировать.
                        там ведь не только одинаковые окончания.

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

                      Самое читаемое