Перефразировщик и синонимизатор

Правила перефразировки

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

Пример перефразировки для прилагательных

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

Рассмотрим сначала пример перехода от полной формы к краткой. Следующие перефразировки демонстрируют это правило:

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

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

В исходном тексте перефразировщика rus_paraphraser.sol это правило имеет такой вид:

 transformation(ПерефразСтруктуры) ТакойЧто
{
declare Прил;
if context { ПРИЛАГАТЕЛЬНОЕ:ТАКОЙ{} @mark(ПРИЛАГАТЕЛЬНОЕ:*{},Прил) ',' 'что' }
then
context
{
@lambda
{
// попробуем получить краткую форму прилагательного.
tree short = copy(Прил);
wordform_set_coord( short, КРАТКИЙ, 1 );
wordform_clear_coord( short, ПАДЕЖ );
wordform_refresh(short);

// если нашли...
if( eq( wordform_get_coord(short,КРАТКИЙ), 1 ) )
then
{
// ... то возвращаем СТОЛЬ ХИТРА, ЧТО
return tuple_create( НАРЕЧИЕ:СТОЛЬ{}, short, ctx_root(2), ctx_root(3) );
}
else
{
// у прилагательного нет краткой формы, возвращаем исходный набор словоформ контекста.
return tuple_create( ctx_root(0), ctx_root(1), ctx_root(2), ctx_root(3) );
}
}
}
}

Левая часть правила, то есть собственно описание паттерна, на котором правило срабатывает, достаточно прозрачно:

  declare Прил;
if context { ПРИЛАГАТЕЛЬНОЕ:ТАКОЙ{} @mark(ПРИЛАГАТЕЛЬНОЕ:*{},Прил) ',' 'что' }

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

Конструкция @mark(...) позволяет запомнить в объявленной ранее оператором declare переменной с именем Прил ту словоформу, которая подошла под условия. Это будет как раз то имя прилагательное, форму которого мы будем менять.

Когда движок трансформаций успешно унифицирует фрагмент текста с паттерном правила, он запускает на выполнение группу операторов в блоке then context { ... }. Результат работы этих операторов - несколько новых словоформ, которые подставляются на место унифицированного фрагмента.

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

При изменении формы прилагательного с полной на краткую надо учесть такой нюанс - не все прилагательные имеют краткую форму. Поэтому мы пытаемся получить краткую форму - это встроенная функция wordform_refresh. Она ищем в словарной статье грамматическую форму, наилучшим образом удовлетворяющую набору грамматических признаков словоформы. Строкой ранее мы задаем необходимость краткой формы:

wordform_set_coord( short, КРАТКИЙ, 1 );

Если в результаты выполнения функции wordform_refresh получится словоформа, у которой значение бистабильной координаты КРАТКИЙ действительно станет 1, то значит краткая форма найдена и можно подставлять ее в выходной текст. Род и число прилагательного мы не меняли, поэтому согласование с существительным не будет нарушено.

Последние 2 слова - запятая и что - мы скопируем в результаты без изменений, для этого используется встроенная функция ctx_root.

Если же краткая форма прилагательного не найдена, то мы копируем в выходной текст исходные 4 словоформы без изменений - этим занимается строка

return tuple_create( ctx_root(0), ctx_root(1), ctx_root(2), ctx_root(3) );

В ней функцией tuple_create создается кортеж из 4 элементов, которые просто копируются из исходного контекста функциями ctx_root.

С помощью консольного синонимизатора можно убедиться в работе этого правила:

перефразировка текста


Дополнительные материалы

Грамматический словарь

Синонимизация

Утилита Rewriter

  © Козиев Илья 2019
изменено 16-Aug-11