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

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

— Дьявол носит лапти
— Депутат кислых щей
— Мопс в мешке
— Чудеса в кастрюльке
— Дискета всё стерпит
— Фуа-гра из топора

Записали ваши версии? Перейдем к сути задачи.

Как устроены оригинальные названия?

Прежде чем пробовать написать какой-то код, разумно исследовать материал. Опыт подсказывает, что значительная часть заголовков Дарьи Донцовой устроены похоже: берется устойчивое выражение и слегка изменяется (желающие могут сами изучить библиографию писательницы [1]). Комический эффект достигается неожиданным сдвигом в привычной для читателя фразе.

Устойчивые выражения — не всегда пословицы или поговорки. Вот, например, отсылка к роману Кена Кизи

Стоит отметить, что некоторые из названий книг писательницы значительно изменяют существующие выражения или понятия («Безумная кепка Мономаха», «Лампа разыскивает Аладдина»), а некоторые, по-видимому, целиком придумываются автором или издателем («Брачный контракт кентавра», «Корпоратив королевской династии»). Эти случаи мы пока решили не разбирать.

Также, поскольку новые слова появляются в выражениях не случайно, а зачастую связаны с сюжетом, мы решили, что на вход программе будет приходить слово, которое мы хотим увидеть в сгенерированном названии. Например, написали «сникерс» — получили «кнут и сникерс» (вместо «кнута и пряника»).

Таким образом, задачу можно сформулировать так: требуется написать алгоритм, который сможет в ответ на слово-запрос возвращать фразеологизм, который будет смотреться с ним относительно уместно. Кроме того, полученные названия должны сохранять синтаксическую и морфологическую сочетаемость (чтобы не получилось «сникерс баклуши» вместо «бить баклуши») и смысл: не «водить за сникерс» вместо «водить за нос».

Как мы это делали?

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

Вот как это получилось в базовом решении.

Достаем устойчивые выражения

Мы решили начать с двух достаточно простых списков: списка фразеологизмов русского языка [2], и ста лучших классических книг [3]. Из наших списков мы отобрали выражения и названия, состоящие из 3-5 слов: они больше подходят под формат названий.

Ищем похожие по смыслу слова

Итак, база фразеологизмов и книжных заглавий готова. Представим, что у нас есть слово «мартышка». Теперь нужно найти какое-нибудь словосочетание, в котором «мартышка» будет смотреться уместно. Логично предположить, что в этом словосочетании уже должно быть близкое по смыслу слово (вспоминаем пример с «Пролетая над гнездом Индюшки» — одну птицу заменили другой). Семантическую близость слов можно измерить с помощью их векторных представлений. На сайте RusVectores [4] хранится множество уже предобученных векторов слов. Мы использовали модель ruwikiruscorpora_upos_skipgram_300_2_2018.

Затем мы проходимся по списку всех фразеологизмов, разбитых на отдельные слова, и ищем фразеологизм с самым похожим на мартышку словом. Чтобы не испытывать проблем с морфологической согласованностью, мы пошли самым простым путем: с помощью морфологического анализатора pymorphy [5] заранее задали условия, что мы ищем только слова в именительном падеже и с тем же родом, что у нашего слова. Это помогло нам избавиться от ситуаций, когда программа выдает результаты «старый подруга лучше новых двух» или «последнее китайское угроза».

Что получилось?

Главное здесь — выбрать правильное слово-запрос, в меру нелепое и словно пришедшее из инфопространства двадцатилетней давности

Как видите, названия получились довольно правдоподобные и согласованные. Отдельно радует, что «Продюсер козьей морды» — это самое что ни на есть настоящее название книги Донцовой. Так что машина отлично проникла в логику человека.

Можно ли что-то улучшить? Конечно. В первую очередь, можно расширить список потенциальных источников для названий — заглянуть в топ-250 Кинопоиска, поискать бестселлеры, достать неохваченные фразеологизмы. Кроме того, морфология пока, мягко говоря, несовершенна.

Это вряд ли возможно исправить, но ошибка смешная — машина решила, что «паром» — это не «пар», а плавсредство

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

Код лежит в открытом доступе [6], так что можете поэкспериментировать сами.

И, конечно, правильные ответы.
Книги Донцовой: «Дьявол носит лапти», «Чудеса в кастрюльке», «Фуа-гра из топора»
Сгенерированные названия: «Депутат кислых щей», «Мопс в мешке», «Дискета всё стерпит»

Источники

[1] Библиография Дарьи Донцовой
[2] Wiktionary: Список фразеологизмов русского языка
[3] 100 лучших книг по версии сайта “100 лучших книг”
[4] Дистрибутивно-семантические модели для русского языка
[5] Морфологический анализатор Pymorphy
[6] Репозиторий с кодом к статье