Рассматриваемый способ уникализации текста основан на той же технологической базе, что и полнотекстовый переводчик, а именно - на правилах трансформации.
Прилагательные в русском языке отличаются с одной стороны крайней регулярностью формообразования и большим количеством словоформ, с другой стороны - вариативностью некоторых форм. Это позволяет реализовывать правила перефразировки, которые будут работать на очень большом количестве прилагательных, обеспечивая сохранение семантики текста.
Рассмотрим сначала пример перехода от полной формы к краткой. Следующие перефразировки демонстрируют это правило:
Кошка такая хитрая, что спит с открытыми глазами. --> Кошка столь хитра, что спит с открытыми глазами.
Коты такие ленивые, что спят целый день. --> Коты столь ленивы, что спят целый день.
Кот был такой умный, что сам открывал дверцу. --> Кот был столь умен, что сам открывал дверцу.
Как видно, мы должны обнаружить полную форму прилагательного в контексте такой .... , что и перевести прилагательное в краткую форму.
В исходном тексте перефразировщика 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.
С помощью консольного синонимизатора можно убедиться в работе этого правила:
© Козиев Илья 2019
![]() |
|
изменено 16-Aug-11 |