Пример и описание 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"))))).