Недавно, истощив нервные клетки в капиталистическом соревновании, я сидел тупо глядя на экран и почуствовал нужду пописать код не для фирмы, а так, для души... Ну, и потратил полчасика на развлечение.
Начну с конца. Почитайте сей фрагмент и попробуйте угадать их автора:
Город правых, город пай. Город без препятственно се час или шквал рус или тот, кто не красоты одной постели благополучно проспавши спят дальше вдвоем, потели, вместе истлели тюфяк, трава, разница какова, бог упаси меня! Так не прокис, окрысься нам банды мастера - усы-то грета, ганс или три месяца свежих воловьих жил для того не скифия значит связь все с тещей поругался, а у нас ушки замашки занды карноухиею Все мы на фунт стерлингов, а не тратящей постановление ратуши, будь то рукой писаные все знайте на единый фронт горизонт шел, или сед наш ли пес впущен ли впрямь... Лысины, пасмы, слыхано ль негодный как здрав в царстве цен и сала для девочек звуки, звуки, звуки, звуки... Как завершен обряд милости, просим брате всяк пуговка не мое дело в сапфирах, лотос папирус в кирку за музыканта за гусем, я за опусника за голый идея, вот он в полдень клјцки не внимал и трус тот же снится бургомистру ни-че-го, ничего как из стран синий чан это видано, чтобы знал де всяк свой пай город, рай город, гладок благость навык город рай, город благость, навык город, божья радость..
А теперь попробуйте другой фрагмент:
Какая гадость этот рыжий парик оказался, у него наставление по науке великого фуше, непревзойденного корифея сыска, установить за дверью. Правда она могла узнать, что за этого портье, бестия, по стеночке, по-английски звучит неприлично в кровавый бифстек, продолжил я с замиранием под номерами. Ну, все кроме меня, на ногах стоял стол, покупки, булку, сыр, и очень помогли нам в сторону доски сплошь исчерченные какими-то говорить не знаю, барин сказал, франц для агентов отправляющихся на мгновение приоткрыла-таки. Не заметил как она любит коллекцию собирать и в золотых приисках заряжаешь в самом деле было ахтырцев несколько ценнейших советов по части в отношении которого громко икнув полез в трудные минуты одиннадцатого было здесь, а как не верьте на демонизме тут растяжение времени порыкивая гудком мчался на себя, чудно завертелись, закружились и мутные фандорин, признаюсь, я не будет, а у нас в посольство нельзя его покойной дочери герцога де Жанейро. Однако, я знал, что вы думаете опять без приглашения когда из под ложечкой, что в коридоре вагона первого месячного жалования на два счета вынесли за три да еще раз ладно слушай...
Ну, и, наконец, в легком стиле:
И завидуют оне государевой жене, а потом честные гости, их все грызет, а орешки все время разговора он вот в шею коршуна задела. Коршун носится над ребенком, как бы мир, приготовила б я пир. Кабы я была царица, говорит он, будь царица, говорит, одна девица, то сына бог им дал, в кухне злится повариха. В злате царь салтан, в глазах царя родила богатыря, только вымолвить успела дверь тихонько заскрыпела и в волнах на берег ты морские камни точишь, топишь берег, ты волна, моя волна. Моя мать с поварихой, с письмом она гонца, чтоб обрадовать отца, а доселе не птичьим криком стонет лебедь, ведь избавил девицу в свете чудо, корабельщики дивятся на добра коня садяся, ей наказывал себя поберечь его славном и вопрошает, ой, вы ж вот с пристани палят, кораблю пристать велят, сами шлют гонца чтоб обрадовать отца, а неведому зверюшку, как он прислал тебе добром сослужу, тебе добром сослужу, тебе поклон гости, князь Гвидон. Зовет их, вынет, Бог им дал в волнах на корабль, и веселый пир, кабы я буду, чудный остров был бы мир, приготовила б я вижу. Я б хотел повесить, но смягчившись на палубе...
Уффф... Если вы узнали Цветаеву, Акунина и Пушкина, то были совершенно правы. Хотя они и не писали эти тексты. Позвольте обьяснить почему...
Когда-то давно еще в университете мы шутили, что можно пропробовать взять много текстов одного автора, составить частотный словарь, а потом сгенерировать случайную последовательность слов в соответствии с частотой их использования автором. Увы, метод совершенно непригодный. Получается абсолютная галиматья. Я даже приводить примеры не буду.
Однако алгоритм можно улучшить. Конкретно, если использовать марковские цепи. Если кто забыл, марковская цепь это дискретный случайные процесс, где вероятность следующего состояния определяется исключительно текущим состоянием и больше ничем.
Можно то же сказать и попроще. Есть система, и у нее N состояний. Так вот, вероятность того, что она перейдет в состояние s из N определяется исключительно текущим состоянием системы, неважно как она в него попала.
Еще проще: у вас есть два мешка с черными и белыми фасолинами. В первом пропорция 1 к 3, во втором - 5 к 3. Если вы выбираете белую фасолину, в следующий раз вы должны взять из первого мешка, если черную - из второго. Как видите, совершенно неважно, сколько до этого вы выбрали из первого мешка, и сколько из второго, имеет роль только состояние. А состояний - два: "вынул белую" и "вынул черную".
Обычно марковская цепь представляется матрицей перехода, то есть матрицей, где a[i,j] - это вероятность состояния j после состояния i. В примере выше, эта матрица равна:
0.25 0.75
0.625 0.375
Так вот, игрушка очень простая. Она читает текст и разбивает его на слова без знаков препинания. А затем считает частоту перехода от одного слова к другому. Например, если после слова "город" никогда не появляется слово "красоты", то его вероятность после слова "город" будет ноль. Получается типичная марковская цепь, где слова играют роль состояний, а обнаруженные частоты определяют вероятности перехода. Ну, а потом просто - берете одно из слов и генерируете столько слов, сколько хотите. Примеры выше все около 200 слов.
Ну, а дальше - дело техники. Скачал по тексту приличных размеров из одной из онлайн библиотек, скормил написанной программуле, и сами видите что вышло.
Что меня удивило, это то, что стиль автора действительно распознается. Ведь, правда, есть что-то в этих фрагментах от Цветаевой, Акунина и Пушкина. Особенно от Цветаевой. Забавно, правда?
Кросс-пост с персонального блога о шутливом применении матлингвистики.
No comments:
Post a Comment