Иерархическая организация правил

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

Рассмотрим правило, которое извлекает названия министерств типа «министерство + существительное в родительном падеже»:

rule: Ministry
{
	query: {phrase(0, министерство, lemma(noun)genitive))}:min
    result: Ministry = $min
}

Это правило извлекает такие паттерны, как «Министерство спорта», «Министерство финансов», но в текстах встречаются и более длинные названия: «Министерство образования и науки», «министерство строительства и ЖКХ». Чтобы извлечь оба типа названий, можно добавить еще одно правило того же уровня:

rule: Ministry
{
	query: {phrase(0, министерство, lemma(noun)genitive))}:min
    result: Ministry = $min
}
rule: Ministry_2
{
	query: {phrase(0, министерство, lemma(noun)genitive), и, lemma(noun)genitive))}:min_2
    result: Ministry = $min_2
}

Обратите внимание, что у двух правил есть общая часть «министерство + существительное в родительном падеже». Ее извлекают дважды: сначала по правилу «Ministry», а затем по правилу «Ministry_2». Для оптимизации можно заменить правило того же уровня дочерним. Все, что было извлечено родительским правилом, можно использовать в дочернем с помощью обратной ссылки.

Читать и расширять такие сложные запросы непросто, поэтому рекомендуется разбить одно правило со сложным запросом на несколько простых вложенных правил. Такие правила легче читать, поддерживать и при необходимости перегруппировывать.

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