Практическое руководство по использованию узла Поисковый запрос
Данный узел или опция доступны, только если они включены в лицензии PolyAnalyst Server.

Настоящее руководство научит вас создавать поисковые запросы в PolyAnalyst. Оно предназначено для всех пользователей, которые хотят выполнять различные типы текстового анализа и работать со специальными узлами PolyAnalyst, такими как Таксономия или Поисковый запрос. Для эффективного изучения данного руководства пользователям необходимо иметь представление о том, что такое PolyAnalyst, что представляет собой архитектура "клиент-сервер", как войти в систему, как создать проект, как добавить/соединить/настроить/выполнить узлы, а также как импортировать данные (в частности, как импортировать CSV-файлы, что такое CSV-файл, как указать путь к нужным CSV-файлам, как настроить узел Файлы CSV). Для получения дополнительной информации обратитесь к другим руководствам и соответствующим разделам.

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

Как вы уже знаете, в PolyAnalyst есть несколько тренировочных наборов данных. В данном руководстве мы будем использовать таблицу с данными о преступлениях CrimeData.csv.

Добавьте узел Файлы CSV на скрипт и настройте его на импорт файла CrimeData.csv. Файл расположен в папке Examples, которая отображается в соответствующем окне выбора:

sq open csv.rus

Выполните узел Файлы CSV, а затем откройте откройте окно просмотра результатов:

sq csv view.rus

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

Создание узла Поисковый запрос

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

Добавьте узел Поисковый запрос в качестве дочернего для узла Файлы CSV и выполните его (предварительная настройка не является обязательной). На палитре узел расположен в разделе Анализ текстов. Ваш скрипт будет выглядеть следующим образом:

sq flowchart.rus

Откройте окно просмотра результатов узла Поисковый запрос:

sq view common.rus

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

Убедитесь, что колонка Description выбрана в качестве колонки по умолчанию в меню над редактором выражений. Именно по ней будет осуществляться поиск.

Поиск отдельных слов

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

В редакторе выражений введите следующий запрос:

sq purse text.rus

Нажмите на клавишу Enter или используйте кнопку Найти (расположена рядом с полем Колонка по умолчанию) для запуска процесса поиска. Поскольку для заданной колонки подобная операция выполняется впервые, системе PolyAnalyst потребуется некоторое время на сбор необходимой информации. Все последующие поисковые запросы будут обрабатываться гораздо быстрее.

Поисковый запрос будет добавлен в дерево поиска в правой части окна. Позже вы можете вернуться к запросу и отредактировать его выражение в соответствующем поле.

После завершения поиска под редактором выражений отобразятся результаты. Поскольку мы настроили узел на определение релевантности, соответствующая колонка будет добавлена в таблицу. Релевантность представляет собой статистическую метрику со значениями в диапазоне от 0 до 100. Чем больше релевантность, тем больше описание преступления отвечает поисковому запросу.

sq purse text result.rus

В нашем случае, 29 записей отвечают условиям поискового запроса. Соответствующее число отображается в дереве поиска.

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

В некоторых случаях пользователи могут столкнуться с трудностями при попытке найти соответствия в тексте. Используйте кнопки с изображением стрелок на панели инструментов для быстрого перехода к предыдущему/следующему подсвеченному слову в рамках одного документа. Перемещаясь по выделенным словам, вы сможете быстро изучить контекст, в котором они используются. Аналогичный интерфейс представлен в других инструментах текстового анализа PolyAnalyst, например, в узлах Извлечение ключевых слов и Таксономия.

Поиск в системе PolyAnalyst не чувствителен к регистру. Обратимся к результатам. Несмотря на то, что в поисковом запросе мы использовали слово purse в нижнем регистре, первые две записи содержат слово PURSE в верхнем регистре. Таким образом, вариации написания слова (PURSE, Purse или "purse_) фактически не влияют на результаты.

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

Полученные данные могут быть отсортированы по колонкам. Для каждого подмножества записей можно отобразить статистику. Так, например, мы можем посмотреть распределение значений колонки District только для 29 записей, которые отвечают условиям нашего поискового запроса. Для этого переключитесь на вкладку Статистика и выберите колонку District.

sq chart.rus

В системе PolyAnalyst также предусмотрена возможность изменения настроек интерфейса. Вы можете установить новый цвет фона, тип и цвет шрифта и т.д. Подробная информация доступна в специальном разделе.

Служебные слова

Рассмотрим еще один пример, который демонстрирует особенности синтаксиса поисковых запросов. В редакторе выражений введите слово not и нажмите Найти. На экране отобразится сообщение об ошибке.

Подобные ошибки возникают при использовании некорректного синтаксиса. В данном случае слово not является особым для системы PolyAnalyst и входит в группу так называемых операторов. Операторы позволяют создавать булевы (логические) запросы. К таким операторам относятся слова not, and, or и xor. Чаще всего используются операторы not, and и or. Каждый оператор требует соблюдения особых синтаксических правил. Например, оператор not должен предшествовать другому слову. Конструкции с not интерпретируются как команда "найти все слова, кроме указанного".

В нашем случае мы не указали слово после not, что для системы PolyAnalyst является примером некорректного синтаксиса.

Но что делать, если мы хотим найти само слово "not"? Сделать это можно несколькими способами, которые подробно описаны в разделе Справка по PDL.

Для исправления поискового запроса, измените его выражение на [not] или "not". Теперь после нажатия на кнопку Найти мы не увидим сообщение об ошибке. PolyAnalyst найдет 179 записей, которые соответствуют нашему запросу.

sq not.rus
Поиск нескольких слов с помощью операторов AND/OR и расширение поискового запроса

В PolyAnalyst используются два основных оператора для поиска нескольких слов одновременно. Оператор and выполняет поиск с условием обязательного присутствия обоих слов, а оператор or – поиск с условием обязательного присутствия хотя бы одного слова из двух (или обоих).

Рассмотрим выражение purse and grab.

В этот раз PolyAnalyst найдет только 15 записей, которые соответствуют запросу. Ранее поисковому запросу purse соответствовало 29 записей, но в этот раз нам также необходимо наличие слова grab.

sq operator and.rus

Порядок следования слов при использовании операторов не важен. Логика остается одинаковой как для конструкции purse and grab, так и для grab and purse.

Обратимся к результатам. В первой записи среди подсвеченных слов можно обнаружить слово GRABBED. Каким образом оно появилось в списке соответствий, если мы выполняем поиск по слову grab? Подобное поведение объясняется особенностями обработки поисковых запросов системой PolyAnlyst. Слово grabbed является морфологической формой слова grab, так же, как и dogs является морфологической формой слова dog и т.д.

При работе с текстами на английском языке PolyAnalyst автоматически выполняет так называемое расширение поискового запроса, когда указанные в выражении термины изменяются для осуществления поиска всех форм слова. В сети Интернет имеется большое количество публикаций по данной теме, доступных по ключевым словам "автоматическая переформулировка запроса" или "расширение поискового запроса".

Допустим, мы не хотим видеть в результатах производные формы от слова grab. Здесь нам снова помогут квадратные скобки, которые укажут системе PolyAnalyst на необходимость поиска только конкретной формы слова. Таким образом, квадратные скобки позволяют не только отключить служебные слова, но и отменить расширение поискового запроса. Введите выражение purse and [grab] в редакторе и нажмите Найти.

sq operator and brackets.rus

В этом случае будет найдено 5 записей. Это значит, что 10 записей из 15 (результаты предыдущего поиска) содержали альтернативные формы слова grab, и только 5 записей содержат точную форму слова. Обратите внимание на то, что слово grabbed больше не подсвечивается в первой записи.

В ходе текстового анализа очень важно уметь определять, насколько конкретным должен быть поисковый запрос. Бывают случаи, когда лучше задать общий поиск, а иногда конкретный поиск будет более эффективен. В нашем случае предпочтительным будет запрос с большим количеством результатов (15 записей), поскольку для нас не имеет значения, как именно сотрудник полиции описал сам факт преступления в отчете и какую форму глагола он использовал (grab, grabbed или grabs).

При составлении поисковых запросов рекомендуется использовать так называемые нормальные формы слов. Нормальная форма – это начальная форма слова, или форма без аффиксов, которая позволяет PolyAnalyst применить такой запрос к формам множественного числа, прошедшего времени, причастия и др.

Теперь рассмотрим пример с оператором or. Введите запрос grab or purse в редакторе выражений и нажмите Найти.

sq operator or.rus

Оператор or позволяет искать записи, в которых присутствует хотя бы одно из указанных слов. В результате поиска число найденных записей в нашем случае вырастет с 15 (при использовании аргумента and) до 60. Отсюда можно сделать вывод, что в таблице имеется 45 записей, в которых встречается хотя бы одно слово из заданного поискового запроса (60 - 15 = 45).

При использовании оператора or количество найденных записей увеличивается в несколько раз. Другими словами, границы нашего поиска расширяются. Закономерно, что некоторые записи имеют низкую релевантность и вовсе не связаны с кражей кошелька (purse snatching).

В PolyAnalyst есть альтернативные способы написания одних и тех же поисковых запросов. Например, введите запрос grab purse и нажмите Найти. В результатах вы увидите те же самые 15 записей, что были найдены с помощью запроса grab and purse. Дело в том, что PolyAnalyst автоматически добавляет оператор and в запрос при его обработке. Каждый раз, когда запрос содержит несколько слов, разделенных пробелом, PolyAnalyst автоматически добавляет and между этими словами, что равнозначно запросу с оператором and. По сути, единственный оператор, который следует указывать явно, – это оператор or, т.к. оператор and используется по умолчанию.

Использование функций при поиске

Что делать в случае, если мы хотим найти фразу grab purse? Несмотря на внешний вид выражения, которое используется в поисковом запросе, фактические результаты не содержат указанное словосочетание.

Объясняется это тем, что операторы and и or не могут вводить ограничения близости слов. Слова могут присутствовать в любой части документа. Слово grab может быть первым словом в документе, а слово purse может находиться в самом конце документа. Слова могут располагаться так далеко друг от друга, что их смысловая связанность сводится к нулю, особенно в больших документах. При этом записи, которые технически отвечают условию запроса, могут иметь низкую релевантность.

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

Поисковая функция – это специальное поисковое выражение, которое применяет особые условия к словам в процессе анализа соответствий. Поисковая функция состоит из следующих элементов: название функции, круглые скобки и аргументы функции. Название функции – это слово, которое вы вводите в поле редактора. После названия функции следует открывающая скобка, далее указываются аргументы функции, после чего ставится закрывающая скобка. Аргументы – это слова, которые использует функция для обработки запроса. В PolyAnalyst имеется множество функций, используемых для различных целей. Многие из них подробно описаны в разделе Справка по PDL.

Обычно функция выглядит следующим образом:

Имя функции(аргумент)

Если функция имеет два аргумента, то они разделяются запятой:

Имя функции(аргумент1, аргумент2)

Если функция имеет более двух аргументов, то каждые последующие аргументы также разделяются запятыми:

Имя функции(аргумент1, аргумент2, аргумент3 и т.д.)

Обратите внимание: пробелы до или после скобок и запятых не являются обязательными. Они никак не влияют на конечный результат.

Итак, мы хотим найти фразу grab purse. Укажите следующий запрос:

phrase(grab, purse)

и нажмите Найти. Поиск не даст никаких результатов. Наш запрос оказался слишком конкретным. Функция phrase() имеет слишком строгие ограничения: слова должны быть в том же предложении и в том же порядке.

В качестве альтернативного решения мы заменим функцию phrase() на схожую функцию с меньшими ограничениями – pattern(). Она допускает наличие "сорных" слов между маркерами аргументов. "Сорные" слова (также "шум" или "стоп-слова") – это слова, не имеющие определенного семантического значения. Обычно "стоп-словами" являются артикли (в английском языке – a, the), местоимения (it, he и she) и т.д. Подробнее об этом читайте в данном разделе. Пока же представим, что у нас уже имеется качественный список "сорных" слов для использования функции pattern().

В редакторе выражений введите следующий запрос и нажмите Найти:

sq pattern.rus

На этот раз система PolyAnalyst найдет 11 соответствий, которые отвечают условиям поисковой функции pattern(). В первом документе мы видим две выделенные фразы: grab her purse и grabbed her purse. Одним из преимуществ использования функций является то, что PolyAnalyst производит расширенный поиск аргументов слова. Таким образом, прошедшая форма grabbed тоже имплицитно входит в запрос. Мы задали "нечеткий" запрос, который допускает наличие стоп-слов (слово her) между аргументами.

Поиск с функцией pattern() выдал 11 соответствий, а поиск с оператором and – 15. Подобное различие можно воспринимать как положительное, так и как отрицательное явление. В нашем случае мы можем детально изучить эти 4 записи и определить причину расхождения. Однако в реальной жизни, когда таблица содержит, например, один миллион записей, из которых 50 тысяч документов отвечают условию запроса с функцией pattern(), а 100 тысяч документов – запросу с оператором and, выполнить подобный анализ будет весьма затруднительно. Самое сложное при составлении запроса – это правильно определить степень его конкретности, что позволит минимизировать количество ложно-положительных результатов (записи, соответствующие условию поиска, но имеющие низкую релевантность в связи с тем, что запрос был слишком общим) и сократить количество ложно-отрицательных результатов (записи, которые должны были попасть в таблицу результатов, но были проигнорированы, т.к. запрос был слишком конкретным).

Функция phrase() принимает два и более аргументов. Ничто не мешает вам создать запрос phrase(grab, her, purse), т.е. вы не ограничены двумя словами. Но помните, что при этом узел также будет выполнять поиск конкретного слова her. Функция pattern() допускала бы наличие и других стоп-слов, например, it, a, her и др.
Названия функций – это служебные слова. Если вы хотите найти само слово pattern, то вам потребуется заключить это слово в двойные кавычки или в квадратные скобки (как в примере с "[not]"). В противном случае PolyAnalyst решит, что вы пытаетесь использовать функцию pattern() (которая требует наличия скобок и аргументов), и при неправильном синтаксисе отобразит соответствующую ошибку.

Возможно, мы были слишком конкретны при использовании функции pattern(). Попробуем использовать функцию sentence() вместо нее. Функция sentence() позволяет включить в результаты поиска только те документы, искомые слова в которых встречаются в пределах одного предложения. После того, как вы выполнили импорт данных в PolyAnalyst и задали первый поисковый запрос, система автоматически определила принадлежность слов к конкретным предложениям (ориентируясь на соответствующие знаки препинания: точки, восклицательные знаки, вопросительные знаки и др.). Перед тем, как определить, отвечает ли запись условию запроса, функция sentence() проверяет принадлежность слова к предложению.

Введите в редактор выражений запрос sentence(grab, purse) и нажмите Найти:

sq sentence.rus

В этот раз запросу функции sentence() соответствует 13 записей, на 2 записи больше, чем в случае с функцией pattern().

Система PolyAnalyst автоматически определяет абзацы в документе, ориентируясь на пустые строки. Существует также функция paragraph(), которая является более общей, чем функция sentence(): аргументы должны находиться в пределах одного абзаца.

Все эти функции (sentence(), phrase() и pattern()) определяют или не определяют степень близости слов. В системе PolyAnalyst также имеется функция near(), при помощи которой вы можете установить максимально допустимое расстояние между двумя словами (где расстояние определяется как допустимое число слов между двумя заданными словами) для определенного запроса. Задайте следующий поиск: near(3, grab, purse) и нажмите Найти. Функция near() выявит много записей из тех, что были найдены ранее. Это происходит потому, что данная функция учитывает условие, что между словами grab и purse могут находиться 3 слова (при этом порядок следования слов и их расположение в пределах одного предложения не имеет значения). Вы можете выбрать любое число, 4, 5 или 100. Если указать значение 25, узел найдет более 13 соответствий. Это связано с тем, что дополнительная найденная запись соответствует условию функции near(), но не условиям функций sentence(), pattern() или phrase().

Вы также можете использовать следующие выражения: phrase(grab, purse) или phrase(snatch, purse). Такой запрос найдет запись, которая содержит любую из фраз. Также вы можете задать поиск phrase(grab or snatch, purse). Результат будет аналогичен предыдущему. Второй вариант является предпочтительным ввиду своей краткости.

На этом мы завершаем знакомство с поисковыми запросами. В разделе Справка по PDL вы можете найти более подробное описание функций и операторов, а так же некоторые примеры.