Общие сведения о языке PDL

PDL (pattern definition language) – язык для поиска лингвистических конструкций в неструктурированных текстах. Он предназначен для нахождения в тексте фактов, событий, сущностей и прочих объектов, представляющих интерес для конкретной предметной области. Такими объектами могут быть, например, географические объекты и компании, марки автомобилей, виды поломок и дефектов, названия лекарств и химических соединений, научные публикации, стихийные бедствия и эпидемии, цены акций, курсы валют и т.д.

Большинство подобных объектов можно извлечь из текста, описав соответствующие им лингвистические конструкции.

Например, найти названия компаний можно с помощью запроса для поиска последовательности, состоящей из слов «ОАО» или «ЗАО», за которыми следуют одно или более слов с заглавной буквы в кавычках (ЗАО «Микросистема», ОАО «Аэропорты регионов» и т.д.). Чтобы найти упоминания министерств, можно составить запрос для поиска слова «министерство», за которым следуют существительные (и опционально прилагательные) в родительном падеже (Министерство финансов, Министерство иностранных дел и т.д.).

PDL представляет собой удобный механизм для описания языковых конструкций любой сложности.

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

Структура языка PDL

PDL-запрос представляет собой комбинацию функций, операторов и строк.

Функции

Чаще всего функции вызываются явно: через имя или через условные операторы (кавычки, квадратные скобки). Однако для некоторых функций также возможен неявный вызов (например, запрос из одного слова сводится к неявному вызову функции stem()).

Имя функции всегда сопровождается скобками, в которых перечисляются аргументы и параметры (при их наличии).

Синтаксис

имя_функции([аргумент_1 [, аргумент_2 …​]])

Пример

доход

находит все формы слова «доход»;

[доходов] = form(доходов) находит слово «доходов» только в данной форме;

lemma(verb, знать) находит все формы глагола «знать» («знаю», «знаем», «знал» и т.д.);

phrase(проект, компания) находит слово «проект», за которым следует слово «компания»;

number() находит все числа в тексте.

Параметры функций

Многие функции PDL поддерживают параметры, позволяющие изменить поведение функции по умолчанию. Обычно значение параметра передается в качестве первого опционального аргумента функции.

Пример

Функция phrase() находит следующие друг за другом аргументы в пределах предложения.

Функция phrase() принимает в качестве первого опционального параметра расстояние между аргументами (т.е. разность позиций аргументов), по умолчанию это значение равно 1.

Поэтому запрос phrase(производство, компания) находит «самолеты производства компании «Сухой»», но не находит «самолеты производства российской компании «Сухой»» (в последнем случае расстояние между аргументами больше 1). Запрос phrase(2, производство, компания) находит оба примера выше.

Также многие функции PDL поддерживают именованные параметры.

Синтаксис

имя_параметра:= значение_параметра

Пример

Функция near() по умолчанию находит аргументы, расположенные рядом друг с другом независимо от порядка следования. Функция поддерживает ряд параметров, с помощью которых можно изменить ее поведение по умолчанию.

Например, именованный параметр max_gap позволяет указать максимальное количество токенов между соседними аргументами последовательности. По умолчанию значение равно 0, т.е. между соседними аргументами не допускается наличие других токенов.

near(компания, директор) = near(компания, директор, max_gap:=0) найдет «финансовый директор компании» и «является в компании директором по производственным вопросам», но не найдет «директора филиала компании», так как в последнем случае между аргументами находится слово «филиал». Запрос near(компания, директор, max_gap:=1) найдет все примеры выше.

Именованный параметр allow_punct позволяет регулировать допустимость знаков пунктуации между аргументами. По умолчанию значение параметра равно yes (пунктуация разрешена).

Запрос near(компания, директор, allow_punct:=no) найдет «финансовый директор компании», но не найдет «по словам директора, компания…​»

Полный список именованных параметров, поддерживаемых определенной функцией, приведен в описании этой функции в разделе «Описание функций PDL».

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

Пример

near(компания, директор, max_gap:=0, allow_punct:=no)

= near(компания, allow_punct:=no, директор, max_gap:=0)

= near(max_gap:=0, allow_punct:=no, компания, директор)

Рекомендуемый вариант записи:

near(компания, директор, max_gap:=0, allow_punct:=no)

Операторы

Операторы применяются либо к выражениям, между которыми они записаны (бинарные операторы), либо к выражению, перед которым они записаны (унарные операторы).

Синтаксис

бинарный оператор: аргумент_1 оператор аргумент_2

унарный оператор: оператор аргумент_1

Пример

"автомобиль" or "машина"

находит документы, в которых встречаются слова «автомобиль» или «машина».

not "автомобиль"

находит документы, в которых нет слова «автомобиль».

В следующей таблице приведен полный список операторов PDL.

Оператор

Имя

Тип

not

НЕ

унарный

and

И

бинарный

or

ИЛИ

бинарный

xor

исключающее ИЛИ

бинарный

&

пересечение множеств

бинарный

/

вычитание множеств

бинарный

Подробнее об использовании операторов можно узнать в разделе «Операторы».

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

Пример

sentence(near(выручка or доход, компания, max_gap:=2), phrase(3, number(), рубль or доллар or евро оr "$"))

Подробнее о составлении сложных запросов можно узнать в разделе «Пример и описание PDL-запроса»