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

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

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

xpdl rules hierarchy univ rule1 rus
Изображение 1. Пример правила, извлекающего названия министерств
Фрагмент правила
rule: Ministry
{
	/* Извлекаем, например, "Министерство финансов" */

	query: {phrase(0, министерство, lemma(noun_genitive))}:min

	result: Ministry = $min
}

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

xpdl rules hierarchy univ rule2 rus
Изображение 2. Правила одного уровня извлекают названия министерств
Фрагмент правила
rule: Ministry
// Например, "Министерство финансов"
{
	query: {phrase(0, министерство,   lemma(noun_genitive))}:min

	result: Ministry = $min
}

rule: Ministry 2
// Например, "Министерство образования и науки"
{
	query:	{phrase(0, министерство,   lemma(noun_genitive))}:min, и, lemma(noun_genitive))}:min_2

	result: Ministry = $min_2
}

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

xpdl rules hierarchy univ rule3 rus
Изображение 3. Иерархически организованное правило, извлекающее названия министерств
Фрагмент правила
rule: Ministry
// Извлекаем, например, "Министерство финансов"
{
	query: {phrase(0, министерство,   lemma(noun_genitive))}:min

	result: Ministry = $min


	rule: Ministry 2
	// Например, "Министерство образования и науки"
	{
	query: {phrase(0, $min, и, 		lemma(noun_genitive))}:min_2

	result: Ministry = $min_2
	}
}

Правила можно расширить для извлечения таких паттернов, как «Министерство промышленности и торговли РФ», как показано на Изображении 4.

xpdl rules hierarchy univ rule4 rus
Изображение 4. Расширенная иерархия правил
Фрагмент правила
rule: Ministry
// Извлекаем, например, "Министерство финансов"
{
	query: {phrase(0, министерство,   lemma(noun_genitive))}:min

	result: Ministry = $min


	rule: Ministry 2
	// Например, "Министерство образования и науки"
	{
	query: {phrase(0, $min, и, 		lemma(noun_genitive))}:min_2

	result: Ministry = $min_2
	}

	rule: Ministry_2_Geo
	// Например, "Министерство промышленности и торговли РФ"
	{
 	query: {phrase(0, $min_2, dictword(GeoAdministrative))}:min_2_geo

	result: Ministry = $min_2_geo
 	}
  }
}

Примечание

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

xpdl rules hierarchy univ rule5 rus
Изображение 5. Одно правило извлекает полное название министерства
Фрагмент правила
rule: Ministry
// Извлекаем, например, "Министерство промышленности и торговли РФ"
{
	query: {phrase(0, министерство,   lemma(noun_genitive), и, lemma(noun_genitive), dictword(GeoAdministrative))}:min

	result: Ministry = $min
}

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

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

Например, правило на Изображении 4 можно расширить, добавив еще одно правило на уровне родительского. Как показано на Изображении 6, правило «Ministry_for» находится на одном уровне с правилом «Ministry» и ищет названия министерств типа «министерство + по + последовательность из двух или трех существительных или прилагательных» (например, «Министерство по развитию Дальнего Востока»).

xpdl rules hierarchy univ 2parents rus
Изображение 6. Расширенное правило, извлекающее названия министерств
Фрагмент правила
rule: Ministry
// Извлекаем, например, "Министерство финансов"
{
	query: {phrase(0, министерство,   lemma(noun_genitive))}:min

	result: Ministry = $min


	rule: Ministry 2
	// Например, "Министерство образования и науки"
	{
	query: {phrase(0, $min, и, 		lemma(noun_genitive))}:min_2

	result: Ministry = $min_2
	}

	rule: Ministry_2_Geo
	// Например, "Министерство промышленности и торговли РФ"
	{
 	query: {phrase(0, $min_2, dictword(GeoAdministrative))}:min_2_geo

	result: Ministry = $min_2_geo
 	}
  }
}

rule: Ministry for
// Например, "Министерство по развитию Дальнего Востока"
{
 query: {phrase(0, министерство, по, repeat (1, 3, lemma(noun|adjective)))}:min

 result: Ministry = $min
}