— Потом решила избавиться. Во!
— Ей!.. так хорошо?
— А, без разницы...
Давно хотел опубликовать этот just4fun проектик по стеганографии, но что-то не было времени.
И вот и время и повод нашелся.
К тому же пятница!
Решил я как-то раз реализовать стеганографию в акроконструкциях.
Для наглядности сделать, как в акростихах, только автоматизировать процесс и строить акропредложения автоматически. Короче говоря, повторить задумку Тритемия, только программным способом ;)
Интерфейс итоговой программы прост:
- пользователь вводит сообщение на русском языке;
- программа выдает акротекст. (Это текст, по первым буквам каждого слова которого можно собрать исходное сообщение).
Например на запрос "привет хабр!" программа написала текст: "потом решила избавиться во ей так хорошо а без разницы". Знаки препинания программа пока не расставляет — это делает пользователь на свое усмотрение.
Конечно далеко до naitive русского языка, но для just4fun проекта, написанного на коленке за пару вечеров, я думаю сгодиться…
Алгоритм обучается на
Кому интересно, как все это работает, прошу под кат!
Акростихи и акроконструкции
Акростих — это стихотворение, в котором первые буквы каждой строки составляют осмысленный текст (слово, словосочетание или предложение).
Например знаменитый акмеист Николай Гумилев однажды написал своей жене (Анне Ахматовой) такое стихотворене:
Аддис-Абеба, город роз.
На берегу ручьёв прозрачных,
Небесный див тебя принес,
Алмазной, средь ущелий мрачных.
Армидин сад… Там пилигрим
Хранит обет любви неясной
(Мы все склоняемся пред ним),
А розы душны, розы красны.
Там смотрит в душу чей-то взор,
Отравы полный и обманов,
В садах высоких сикомор,
Аллеях сумрачных платанов.
Акростих — самый простой вариант акроконструкции.
Акроконструкция — это более общее понятие; если в акростихе вкрапление происходит в первых буквах каждой строки, то в акроконструкции — в любом произвольном месте.
К примеру, можете ли вы своей девушке на 8 марта написать что-нибудь типа этого?:
Чё слабо? То-то!
Поэзия оставила нам множество аналогичных примеров. Кому эта тема интересна, то советою почитать статьи Ивана Чудасова
"От акростиха к акроконструкции" и "От акростиха к акроконструкции (продолжение)". На мой взгляд это лучшие статьи по данной теме: с одной стороны доступные широкой публике, с другой стороны — не вульгарные.
Возникает вопрос, как такие тексты создавать?
По сути есть три класса способов.
- Создавать текст самостоятельно. Именно это и делали поэты по науськиванию Иоганна Гайденберга Тритемия.
- Создавать текст программным способом. Например алгоритм DANTSOVA
- Комбинировать программный способ и творчество оператора. На мой взгляд это самое интересное, что можно придумать. Программа создает определенное количество вариантов различных слов, затем человек выбирает наиболее семантически подходящее слово из списка, затем программа создает еще одно слово… И так далее, пока не получиться единый цельный текст
Принципы алгоритма DANTSOVA
Кому лень читать мат.часть может сразу перейти к главе «Исходники & примеры».
Для остальных рассказываю.
Существует множество различных теорий, как совокупность букв, пробелов и знаков препинания превращаются в осмысленный текст. Для создания действительно хорошего алгоритма требуется посвятить этой задаче, как я думаю, всю свою жизнь.
Мне было интересно, есть ли какие-нибудь крайне простые идеи, которые можно было бы воплотить в простой и незамысловатой программе. Цель алгоритма DANTSOVA показать, что задача искусственного построения акротекстов — не является невозможной задачей.
Алгоритм DANTSOVA основан на нескольких весьма понятных идеях.
Разумеется добавляя большее количество правил в генерации текста можно получить более хороший результат,
однако в DANTSOVA мы ограничимся только четырьмя положениями — «мыслями».
Мысль 1. Слово зависит от прошлого слова.
После слова "вкусное" увидеть слово "молоко" вполне ожидаемо.
А вот после слова "вкусное" вы вряд ли увидете слово "синхрофазотрон".
Во первых, синхрофазотроны не кушают; во-вторых слова не согласованы: «синхрофазотрон» мужского рода, а слово "вкусное" — среднего.
Разумеется слово зависит не только от предыдущего, но и от предпредыдущего и т.д.
Однако учитывать это я не стал по причине проклятия размерности.
Таким образом нужно взять много-много текста и посмотреть пары: «слово — следующее слово».
После необходимо создать конструкцию вида:
слово | следующее слово | вес |
слово | следующее слово | вес |
... | ... | ... |
вес задается просто — сколько раз после "слова" было "следующее слово"?
Например Дарья Донцова (см. файл dantsova.d0.plf в исходниках)
за свою богатую карьеру после слова "вооруженный" употребила слово "букетом" целых три раза!
А после слова "прельстить" слово "секстеррориста" встречается только один раз.
Данную табличку будем называть платформой.
Очевидно, что на разных корпусах текста строятся различные платформы.
Мысль 2. Платформу нужно строить на корпусе текстов одного автора
Суть этой мысли в том, что текст должен быть «однотипным».
Нам не подходит корпус, состоящий из статьей о Валерие Харламове, о Фолклендской войне и о творчестве Ричарда Баха…
Это совершенно разнотипные тексты.
Так же тексты разных авторов обладают такой штукой, которые филологи называют идиолектом.
Говоря по русски — это персональный диалект. Т.е. метод говорить и писать, присущий именно вам.
Т.е. чисто опытным путем мною было установлено, что нужно взять корпус текста одного автора.
Иначе получается совершенная хрень, ничем не отличающаяся от рандома.
Мысль 3. Чем больше корпус, тем лучше
Это очевидная мысль. Поэтому автор, которого следует взять должен быть очень плодовит (не с качественной, а с количественной точки зрения).
Например Пётр Ершов не подходит, так как он написал только одну сказку: Конёк Горбунок.
Сказ про Федота Стрельца Леонида Филатова — тоже не вариант.
Мысль 4. Чем примитивнее качество текста — тем лучше
Чем автор богаче и интереснее — тем разнообразнее его речь.
Нам такие авторы не нужны.
Например Иосиф Александрович Бродский написал больше стихотворений, чем Пушкин.
Но платформа на корпусе стихов Бродского получается не очень…
Итог.
Итак, нам нужен автор с примитивненькой речью, написавший много-много осмысленного текста одной тематики.
Что самое примитивное по речи? Правильно: детективные романы для девушек от пятидесяти и передача «Пусть орут» с Андреем Малаховым. Так как субтитры «Пусть орут» я не нашел, то ограничился детективными романами.
Так что методом исключения этим плодовитым автором оказалась Дарья Донцова (кстати, её настоящее имя — Агрипина Аркадьевна)!
Теперь осталось сделать очень простой алгоритм генерации.
После каждого слова следует выбирать слово, начинающееся на нужную букву и с максимальным весом.
Вот, собственно, и весь алгоритм.
Это настраиваемый параметр системы.
Он показывает желаемое количество слов в предложении.
Алгоритм ставит точку после слова A и следующую букву X записывает в независимости от A в двух случаях:
- когда нет слова B, начинающегося на X c большим весом.
- когда длина предложения больше c
В этом случае, мы либо обрываем предложение (параметр c), либо возращаемся на шаг назад,
заменяем A2 на некое A2*, вес которого на втором месте, и после A2* ищем A3.
Исходники & примеры
Несколько примеров.
Понятно, что это далеко до практического применения, но уже совсем не рандом!..
Определенная семантика проскальзывает…
сообщение | акроконструкция |
---|---|
славься отечество наше свободное братских народов союз вековой | сейчас лучше а в сторону я очень трудно ее через его с тобой в общем не ахти. шофер елены сергеевны в общем без особых денег на одном ее было рот а ты с кем из холодильника не. абсолютно разные органы дело обстояло в сторону от юры записан в ее к окну взяла одну. йогурт |
научный руководитель | не ахти. уже через неделю. ыыы. йогурт российского уголовного кодекса. она в общем да и тут еще лучше. |
эйяфьядлайоукюдль | это. йогурт я фразу я даже лучше а йод опомнилась. уже к юле домой лягу |
миллионы вас нас тьмы и тьмы и тьмы | меня и лишь легкое изделие одной ноге в америке стоят на аборт сделать так много интересного ты меня и тут. меня |
за родину за сталина | за апрель. раз она даже и не успела за апрель сентябрь. только адрес лиды и не ахти |
хабрахабр | хорошо а без разницы а хозяйка а без разницы |
как некогда в разросшихся хвощах ревела от сознания бессилья | как александр клянется. не ела капусту овощи грибы добавить апельсиновый. все равно а затем раздался оглушительный свист шум и хорошо сейчас я хочу в общем. ща алина хмыкнула роза елена вадимовна. ее лицо а она так сказать о здоровье не ахти невкусно. из ящика бумагу ее с собой и лишь. ьгори. явно |
глокая куздра штеко будланула бокра и кудрячит бокрёнка | где лежал один класс а я кивнула ушла за дверь распахнулась автоматически. шофер только если кто он был у двери лифта а на улице лизы а без особых комплексов рассекает. абсолютно искренне. как у двери распахнулись я чуть инфаркт то бы он как раз на кухню а |
надеюсь мне засчитают эту глупость за сданный курс питона в шаде | не ахти. для ее юбка с мужем не ела за апрель сентябрь. что и тут а юра тихо. это ты уже говорила лишь удивляться почему он с тобой знаем адрес сказала девушка а на него. йогурт кефир. уже рассказывала сколько помню их тут она не ахти. все шло а для ее |
наши западные партнеры | не ахти. шофер и за апрель. потом аккуратно добавить немного. ыыы. ее по адресу расположен тот не ела рагу. ыыы |
Если хотите больше — можете сами нагенерить.
Исходники лежат тут: https://github.com/PavelMSTU/DANTSOVA
Стеганография
Теперь зададимся вопросом: как на всем этом сделать стеганографию?
А очень просто!
Во-первых, выбирать можно не первую букву, а произвольную, детерминированно определяемую ключом.
Во-вторых, можно каждой букве (или слову, или последовательности слов) сопоставить некую последовательность бит.
Сделать это можно с помощью хеш-стеганографии.
Короче — есть множество различных идей для воплощения самых извращенных и коварных стеганографических фантазий!
И это будет секьюрно, но не наглядно, как алгоритм DANTSOVA.
ЧаВо
Предчувствуя три вопроса, упреждающе на них отвечаю.
Одни говорят, что это было сделано специально, мол если Агрипина Аркадьевна (сокращенно просто Дарья) попытается подать в суд,
Но есть другая точка зрения, согласно которой изменение буквы O на A является особой стеганографической передачей тайного послания.
Однако скептики говорят, что PavelMSTU просто должен больше спать и меньше работать, тогда с орфографией проблем не будет.
Автор хотел показать, что написав на коленках три *.py файла и аккамулировав большое количество текста одного автора можно добиться определенного результата.
И без всякого deep learning и десятков человеко-лет какого-нибудь НИИ…
Разумеется для практического использования следует придумать промежуточное кодирование, о чем в статье написано.
Вашего вопроса нет в ЧаВо? — задавайте его в комментариях!
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Комментарии (26)
PapaBubaDiop
01.04.2016 11:26+3за
за апрель
за апрель…
за апрель…
за апрель…
за апрель…
Recursive should be more smart.PavelMSTU
01.04.2016 12:51Точно! Нужно внести определенную рандомизацию.
Например при количестве потенциальных кандидатов равных n
брать i-е слово с вероятностью pi=wi/(w1+w2+...+wn),
где wi — вес i-го слова.
AgaFonOff
01.04.2016 11:58+1Слова менее 3 букв желательно подбирать тройками и да, рандомизировать не помешает выбор по весам.
svfat
01.04.2016 12:39+7При достаточно длинной входной последовательности получится новое произведение Д.Донцовой
9ikopb
01.04.2016 12:59+2То есть, в терабайтах донцовых текстов, выложенных на рутрекере и ставших одной из причин его блокировки, содержалась такая потенциальная польза?!
Ohar
01.04.2016 13:13+1Что за таинственные «ьгори»?
PavelMSTU
01.04.2016 13:33Посмотрел — это видимо описка в *.fb2 файлах.
Так как на мягкий знак ничего не начинается, вот это "слово" и оказалось единственным.
Уберите в коде мягкий знак из CORRECT_ALPHABET.
Задайте :
CORRECT_ALPHABET = u'йцукенгшщзхъфывапролджэячсмитбю'
9ikopb
01.04.2016 13:13+3"Хорошо учился, и тут — армия..."
Какая полезная программа! Установил, буду пользоваться.PavelMSTU
01.04.2016 13:35Хм… а у меня получилось "хорошо училась и тут а".
Вы видимо по методике №3 работали ;))
3. Комбинировать программный способ и творчество оператора. На мой взгляд это самое интересное, что можно придумать. Программа создает определенное количество вариантов различных слов, затем человек выбирает наиболее семантически подходящее злово из списка, затем программа создает еще одно слово… И так далее, пока не получиться единый цельный текст
SunX
01.04.2016 13:26Вот еще добавить бы программке интеллекта от Яндекс.Весны и цены бы ей не было :)
LoadRunner
01.04.2016 13:36+4Донцова — автор плодовитый,
Она штамповку очень любит.
Напишет сотни детективов,
Ценить её за это будут.
О, далеко не все такие,
Всего лишь малый круг людей:
Агент, издательство, родные,
Другие может, из зверей.
Ах да, ещё поклонники её
Редчайшего писательского дара
(Я пошутил над этим, если что).
А остальные спросят: "Что за Дарья?"
Решившим прочитать хоть книгу:
Клянитесь больше так не поступать!
А лучше даже в топку кинуть —
Дрова не так легко уж добывать.
Ещё под холодильник пару книг
Впихнуть, чтоб не шатался больше.
Ну или утащить к себе в нужник,
А там читать уже попроще.PavelMSTU
01.04.2016 13:38Это гениально! Хабраюзеры, у кого залежалось — дайте инвайт этому человеку!
LoadRunner
01.04.2016 13:46+4Благодарю за столь высокую оценку (выше, чем оценка творчества Донцовой), но это вряд ли достойно инвайта. Лучше уж я через песочницу, тем более, статья на стадии "да когда я её уже закончу".
peacemakerv
01.04.2016 14:21"За апрель". Но "не ахти". По-моему, у Донцовой это используется уж очень часто. Наверняка, какие-то выражения еще чаще.
OldFisher
01.04.2016 14:45+1Мысль любопытная, но генерировать ещё большее количество бессмысленного словесного мусора считаю не просто излишним, но даже сомнительным с морально-этической точки зрения. И без того уже страдаем.
peacemakerv
01.04.2016 14:49+3Ааааа! А вдруг Донцова для своего творчества УЖЕ использует подобную программу? :)
OldFisher
01.04.2016 18:56Увы. Если бы это было истиной, то такая программа могла бы совершенствоваться с ростом технологий, повышая качество продуцируемого контента.
EminH
Получается что акростих это частный случай вашего алгоритма?
PavelMSTU
Вернее акроТЕКСТ.
Поэзию генерить на корпусе текстов Донцовой — этого моя прога не умеет. :)