Пример и описание PDL-запроса

Для лучшего понимания логики написания PDL-запросов рассмотрим простой пример. Допустим, перед вами стоит задача найти названия улиц. В этом случае можно написать выражение «phrase(улица or проспект, case(title))».

Этот запрос состоит из нескольких частей:

1) Перечисление аргументов «улица or проспект» найдет формы слов «улица» или «проспект».

2) Запрос case(title) найдет все слова с заглавной буквы.

3) Функция phrase() включает в себя два вышеуказанных запроса и найдет последовательность следующих друг за другом аргументов (в данном случае слова «улица»/«проспект», за которыми следует любое слово с заглавной буквы).

Можно заметить, что данный запрос не извлекает полностью названия улиц, состоящие из нескольких слов (например, «проспект Маршала Новикова», «улица Новая Басманная»).

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

Просматривая результаты, можно заметить, что запрос найдет случаи, не являющиеся названиями улиц, — например, «на улицах Тбилиси», «по улицам Стамбула».

Исключить эти результаты можно несколькими способами:

1) Указать, что слово «улица» не должно употребляться во множественном числе.

Это можно сделать с помощью функции lemma() (см. подробнее в разделе «Поиск с учетом морфологии»):

phrase(lemma(singular, улица,проспект), repeat(case(title))).

2) Указать, что после слова «улица» не должно следовать название города или страны.

Названия городов и стран содержатся в геоадминистративных словарях, а для поиска в тексте всех слов, содержащихся в определенном словаре, используется функция dictword() (см. подробнее «Использование словарей»).

Запрос dictword(geoadministrative, "category = city|country") найдет в тексте названия всех стран и городов из словаря географии.

Для поиска всех слов, кроме указанных в запросе, используется функция except() (см. подробнее «Исключение результатов из поиска»).

Запрос except(dictword(geoadministrative, "category = city|country")) найдет в тексте все слова, кроме названий стран и городов из словаря географии.

В итоге мы получим запрос, который ищет слова «улица» или «проспект», за которыми следуют одно или несколько слов с заглавной буквы, за исключением названий стран и городов:

phrase(lemma(singular, улица,проспект), repeat(case(title, except(dictword(geoadministrative, "category = city|country"))))).