Окей, гугл, краткий пересказ…
Искусственный интеллект уже умеет творить: вспомним рэп-альбом Алисы («YANY») или нейростихи. А умеет ли компьютер пересказывать и сочинять истории? В этой сфере есть трудности. Непросто научить машину пересказывать тексты так же хорошо, как это умеет человек, чтобы конечный материал был точным и в то же время естественным. Для этого нужно научить программу извлекать ключевое из огромного массива информации и составлять целостную и связную историю.
В области компьютерной обработки языка автоматический пересказ называется «саммаризация» (от англ. summary — выжимка, краткий пересказ). К этой задаче уже придумано множество подходов. Однако метрики оценки конечного пересказа и сами механизмы работы программ все еще примитивны, а многие из них успели устареть.
Один из этапов саммаризации текстов называется «Автоматическое извлечение нарративной структуры». Попробуем разобраться в том, как и по каким принципам это работает, как это реализуется, и что можно сделать для модернизации этого механизма.
Разобрать по пунктам
Чтобы пересказать текст, сначала необходимо понять, о чем он. Для этого нужно его проанализировать и составить «содержание» из главных мыслей. Компьютер анализирует тексты не так, как человек: он опирается только на формальные признаки. Посмотрим, как можно представить любую (или почти любую) историю в виде, понятном компьютеру.
В одной далекой-далекой галактике
Одним из первых ученых, занимавшимся формальной структурой повествования, был советский филолог-фольклорист Владимир Пропп. В своей книге «Морфология волшебной сказки» (1928) он исследовал русские народные сказки. Ученый обнаружил, что построение структуры сюжета как русских, так и зарубежных сказок однотипное. В них существует деление персонажей на роли с ограниченным набором функций. Герой, Злодей, Волшебный помощник, которые связаны некоторой логической цепочкой типовых действий: герой отлучается из дома, злодей строит козни герою, волшебный помощник помогает герою (часто через волшебный подарок), герой побеждает злодея и т.п. В сказках Пропп нашел много схем репрезентации того или иного персонажа. Можно по-разному интерпретировать их, создавать новые модели построения нарратива, комбинируя как сюжеты, так и отдельные функции героев. Из чего складывается повествование и каким оно бывает, мы рассказывали в этом материале.
Выделение нарратива сильно абстрагировано от контекста и изучается пока только на языковом уровне. Так, генерирование новых текстов будет довольно объективным. Выделяя типичные роли и повороты сюжета, Пропп сформулировал «морфологию» волшебных сказок, которая как раз поможет выделять нарративную структуру текста.
Категории любой волшебной сказки
- Функции героев драматические — действия и слова эмоционально окрашены, повороты сюжета могут быть резкими, а поступки — внезапными. Автор создает цепочку из 31 функции для построения или конструирования того или иного персонажа.
- Существует некий соединительный элемент — таковым может быть персонаж, который осведомлен о происходящем вокруг (например, один из героев обладает сверхъестественными способностями или подслушивает какой-либо ключевой разговор других героев).
- У каждого героя должна быть собственная цель или мотивация — только тогда они могут совершать какие-то действия (герой хочет спасти принцессу, следовательно все его поступки оправданы этим мотивом).
- Появление героя в сказке также может его характеризовать (особенно если оно внезапное: «вылез из-под земли», «волшебным образом появился из ниоткуда» и прочее).
- У каждого героя есть яркая, почти нереальная отличительная черта (например, возраст — Кощей Бессмертный, или выделяющаяся деталь внешности — богатырское телосложение, огромный горб на спине).
Категории комбинируются и создают само действие сказки. Некоторые характеристики работают в паре: без одной никогда не появится другая. Причем одно действие персонажа всегда мотивирует другое (например, каждое действие светлой стороны, побуждает к поступку темную и наоборот). Функции героев, сочетаясь друг с другом, создают подвиды, что обусловливает разнообразие персонажей и разные линии сюжета.
Герои и злодеи
Рассмотрим подробнее типы героев в сказках. Герой побеждает зло и творит добро, Злодей — главная проблема Героя, Донор (Даритель, Волшебный помощник) — тот, кто наделяет Героя магическими способностями, Отправитель — посылает героя на задание, Невеста/Приз — главная цель героя, Псевдогерой — самозванец. Каждый герой функционирует строго в области своих действий. Некоторые герои сочетают в себе характеристики нескольких типов, описанных выше. Например, Злодей может в некоторых ситуациях играть роль Донора.
Саммаризация: от краткого содержания к сложным алгоритмам
Компьютер не сразу научился создавать тексты «человеческим языком». Простейшие алгоритмы работали как обычный пересказ: программа генерировала краткое содержание и отбрасывала детали и описания. Все просто: программа находила в предложениях слова, которые повторялись чаще всего, и так определяла, о чем он. Далее она выбирала предложения, в которых, собственно, они были, и формировала примитивный пересказ. Однако такой вид саммаризации совсем не похож на естественный человечески пересказ (его еще называют абстрактным).
Позже предложили более сложный метод «узлов графа» (plot units). Повествование представляли в виде точек, соединенных линиями (графы). Точки — это события, опорные пункты истории. Их делили на 3 вида: позитивные, негативные, нейтральные. В этой статье рассказываем, как работает технология извлечения событий из художественных текстов и что она позволяет узнать о литературе уже сейчас.
Креативный пересказ
Приведенных выше алгоритмов недостаточно для того, чтобы сделать пересказ по-настоящему креативным, воссоздать историю. Откуда компьютеру знать, как должны развиваться события?
Можно просто накопить определенный массив текстов — сформировать «память» программы из разных готовых историй. По ним уже можно будет строить новые рассказы. По такому принципу, например, работает система MEXICA.
Чуть сложнее работает TALE-SPIN — она использует действия, которые герой уже совершил в тех или иных историях, и «додумывает» концовку. Так программа пытается решить проблемы, которые возникли перед героем в ходе повествования.
Чтобы приблизить пересказ к естественности, важно, чтобы программа хорошо «понимала» исходный текст: умела правильно разрешать анафору (связывать местоимения с существительными, к которым они относятся), подбирать синонимы, оценивать эмоциональную окраску текста.
А при чем тут Пропп?
Формальная структура сказки (ограниченный набор ролей, список действий и взаимодействий между героями, единый принцип построения сюжета), которую описал Владимир Пропп, хорошо подходит для компьютера. Можно разметить много текстов в соответствии с «Морфологией волшебной сказки» и затем использовать их для генерации новых: будь то пересказы или новые истории. Разберемся, как это делается.
Используем логику
Сказку можно запрограммировать, но используя не простое, а Ограниченное Логическое Программирование (Constraint Logic Programming). В ОЛП отношения между переменными представляются как ограничения: значения, которые может принимать одна переменная, ограничены другими переменными. Используя ОЛП, мы как бы доказываем теорему: если соблюдены условия A,B,C, то возможно D. В сказке «Ограничение» есть не что иное, как взаимные «отношения» между персонажами (личное поле одного ограничивает личное поле другого, как в праве). А эти переменные в задаче есть не что иное, как роли, описанные Проппом.
Количество задач, которые могут иметь персонажи, ограничено их уникальными функциями (т.е. конкретное свойство относится к конкретному герою, грубо говоря, один герой не может делать все и сразу). В каждом предложении сказки может раскрываться та или иная роль. В терминах ОЛП: каждому предложению сказки соответствует или не соответствует какая-либо функция, если в нем встретились или не встретились те или иные типы героев. Эту задачу мы и будем решать.
Как представить сказку в виде «ограниченной логической задачи»
Сначала для каждого предложения автоматически создается его абстрактное семантическое представление. Это позволяет представить ситуацию, описанную в предложении, в виде переменных и отношений между ними. Вот так:
При этом программа не различает три разных he, которые относятся к одному и тому же персонажу (скорее всего, дракону, который похитил какую-нибудь принцессу). Такие неоднозначности приходится разрешать вручную.
После этого переменным присваиваются возможные роли. Большинство функций по Проппу можно определить по ключевым словам, присутствующим во фразе. Например, переменные с ролью «злодей» часто встречаются вместе с глаголами типа «нападать», «атаковать» и прочими представителями семантического класса агрессивных глаголов.
Такой подход кажется очень простым, но на деле работает эффективно. Список подобных слов-идентификаторов составил сам Пропп, а с помощью сервисов WordNet или FrameNet его можно расширить синонимами.
Каждое предложение сказки получает список возможных ролей, которые могут в нем выражаться (минимум — 0). Так мы решили задачу ОЛП и присвоили каждому предложению какую-либо функцию или ноль.
Предложения, которым присвоен не ноль — это минимальные единицы повествования.
Линии жизни героев
Главного героя тоже можно выделить автоматически. Важность героя вычисляется на основании количества его упоминаний в тексте. Учитывается также расстояние (в предложениях) от первого до последнего появления и номер предложения, где мы встречаем героя впервые.
Взаимодействия героев тоже необходимо учитывать. Злодей встречается с героем обычно один раз за всю сказку, но важность его от этого не уменьшается. Его линия развивается отдельно, и он со стороны влияет на все остальные события.
Пропп также ввел «ограничения» на функции героев (не путать с ограничениями в программировании). Это значит, что в сказке некоторые функции либо обязательно должны встретиться в одном предложении (например, злодей и победа над ним), а другие функции наоборот не могут (например, похищение и спасение)
Вот и сказочке конец
Таким образом, все факторы, которые мы назвали выше, могут по-разному комбинироваться и работать в совокупности в процессе построения рассказа. Учитывая важность героев, набор их характеристик и функций в «ролевой игре», количество взаимодействий и ограничений, машина может выбрать наиболее логичное и верное решение для конкретной сгенерированной проблемы.
Научить машину писать сказки — это только половина дела. В работе мы можем использовать разные алгоритмы и схемы построения произведения, чтобы создать простейший текст. Он будет состоять из блоков, которые были уже написаны людьми раньше, в нашем распоряжении находятся все когда-либо написанные рассказы. Важнее здесь сделать текст креативным, создать что-то действительно новое. Для этого нужно совершенствовать существующие программы и искать новые подходы к машинному обучению.
Источник: Automatic Detection of Narrative Structure for High-Level Story Representation