УДК 004.94
12 1 А.А. Зуенко ' , А.А. Алмаматов
1 ФГБУН Институт информатики и математического моделирования технологических процессов КНЦ РАН
2 Кольский филиал ПетрГУ
ПОИСКОВЫЕ ЗАПРОСЫ НА ОСНОВЕ ОПЕРАЦИЙ С ЛОГИЧЕСКИМИ ВЕКТОРАМИ*
Аннотация
Предлагается оригинальный алгоритм поиска в естественно-языковых текстах, основанный на алгебраическом представлении исходного текста и поисковых операций. Для гибкого задания различных условий поиска применяются поисковые шаблоны, которые транслируются в совокупность алгебраических операций над логическими векторами.
Ключевые слова:
поисковый запрос, логические векторы, регулярные выражения.
A.A. Zuenko, A.A. Almamatov RETRI EVAL REQUESTS USING OPERATIONS ON BOOLEAN VECTORS
Abstract
An original algorithm for searching in natural language texts based on the algebraic representation of the source text and search operations is proposed. The algorithm uses search patterns for flexible setting various search conditions. The patterns are translated into a sets of algebraic operations on boolean vectors.
Key words:
retrieval request, boolean vectors, regular expressions.
Введение
В настоящее время существует множество алгоритмов поиска подстроки в строке: Бойера-Мура, Чжу - Такаоки, Бойера - Мура - Хорспула, Кнута -Морриса - Пратта, Рабина - Карпа и т.д.
Кроме задачи отыскания точного вхождения подстроки в строку, очень широко распространена задача поиска, где некоторые символы или последовательности символов могут быть заданы не точно, а в виде интервалов символов, некоторых классов символов, условных выражений и т.д. Для стандартизации таких запросов в различных приложениях используются общепринятые стандарты регулярных выражений.
В документальных информационных системах применяется два наиболее распространенных языка регулярных выражений для поисковых запросов:
• POSIX - (Portable Operating System Interface for Unix - переносимый интерфейс операционных систем Unix;
* Работа выполнена при финансовой поддержке РФФИ (проекты №№ 11-08-00641, 12-07-00550-а, 12-07-00689-а, 13-07-00318-а), ОНИТ РАН (проект 2.3 в рамках текущей Программы фундаментальных научных исследований) и Президиума РАН (проект 4.3 Программы № 16).
• PCRE - Perl Compatible Regular Expressions - регулярные выражения, совместимые с языком Perl.
Простота и скорость выполнения запросов, использующих регулярные выражения, зависит от эффективности методов и алгоритмов, реализующих эти запросы, от того насколько исполнение запросов при выбранном подходе поддается распараллеливанию.
В настоящей работе описана модификация базового алгоритма полно -текстного поиска в естественно-языковых текстах, подробно рассмотренного в [1, 2]. Модификация основана на алгебраическом представлении исходного текста и поисковых операций, обеспечивает возможность гибкого задания различных условий поиска с использованием стандарта POSIX. Поисковые ша-лоны транслируются в совокупность алгебраических операций над логическими векторами. В виде набора таких векторов представляется и сам исходный текст. При этом существенно повышается быстродействие системы в отличие от известных алгоритмов поиска слов, основанных на последовательном сравнении фрагментов текста с поисковым образом, за счет возможности эффективно распараллеливать процедуры поиска вплоть до отдельного символа запроса.
Далее рассмотрим возможности используемого языка запросов и особенности реализации тех или иных языковых конструкций с помощью операций над логическими векторами.
Формирование поисковых шаблонов
Запрос формируется в виде строки текста, содержащей в себе последовательность символов, классов символов, заданных вариантов, wildcard и т.д.
Таблица 1
Классы символов
Обозна- чение Описание
\d любая цифра
\D все, кроме цифры
\c любая буква
\C все, кроме букв
\w буква или цифра
\W все, кроме букв и цифр
\l буквы в нижнем регистре
\h буквы в верхнем регистре
\s пробельные символы (пробел, табуляция, возврат каретки, новая строка)
\S все, кроме пробельных символов
\p символы пунктуации («.», «,», «!», «», «», «»)
\P все, кроме пунктуации
\r символ, являющийся повторением предыдущего. Может использоваться как форма записи повторений символов, а также в сложных «ИЛИ» или «И» выражениях
При необходимости возможно задание некоторого множества символов/классов, а также поиска всего, кроме заданных символов. Для этого нужно множество заданных символов вписать в квадратные скобки. Если необходимо искать все, кроме заданных символов, нужно после открывающейся скобки поставить символ «А».
Таблица 2
Многовариантный поиск (ИЛИ-выражение)
Пример Трактовка
[аЬс^ поиск символов «а», «Ь», «с» или <^»
[лаЬс^ все, кроме «а», «Ь», «с» или <^»
[abcdefgh\d] шестнадцатеричные цифры
[Л\Б\р] все, кроме пробельных символов и пунктуации
Также возможно задание выражения «ИЛИ» вместо некоторого символа в запросе. По принципу работы оно эквивалентно предыдущей функции с той лишь разницей, что между всем, заданным внутри функции, выполняется функция «И». Отрицание выражения с помощью «а» также возможно.
Таблица 3
Уточняющий поиск (И-выражение)
Пример Трактовка
<Ш> повторяющаяся цифра
<\Ц> символ <^» низкого регистра
<аЬс> некорректная запись, т.к. один конкретный символ не может быть равен сразу «а», «Ь» и «с»
<л\К\г> все, кроме повторяющихся символов верхнего регистра
Синтаксис запроса позволяет писать после некоторого искомого символа некоторое количество раз, которое он будет повторяться.
Таблица 4
Повторяющиеся символы
Запись Эквивалентная запись Трактовка
а{3} ааа Три последовательных символа «а»
ад \d\d\d\d\d Пять последовательных цифр
Ь{1} Ь Один символ «Ь»
Теперь прейдем к описанию базового алгоритма поиска на основе операций с логическими векторами.
Базовый алгоритм поиска подстроки на основе операций с логическими векторами
Пусть используемый алфавит состоит из N литер. Позиции в тексте отдельной литеры могут быть заданы характеристическим вектором, размерность которого равна длине самого текста Ь. Каждый элемент характеристического вектора принимает значение 1 или 0 в зависимости от того, присутствует или нет данная литера в тексте в данной позиции. Текст представлен в памяти машины в виде N логических векторов длиной Ь.
Чтобы найти в этой структуре искомое слово, необходимо пронумеровать последовательностью 0, 1, 2, ... литеры искомого слова; выбрать логические векторы, соответствующие этим литерам, и выполнить для каждого из этих векторов сдвиг влево на число разрядов, соответственно нумерации; выполнить логическое умножение выбранных и преобразованных логических векторов; если в результате получится нулевой вектор, то это означает, что искомого слова в данном тексте нет. В противном случае единицы этого характеристического вектора маркируют номера позиций, в которых находится начало искомого слова. Рассмотрим пример.
Пример 1. Пусть задан текст "род рада город". Необходимо найти в нем все вхождения буквосочетания "род". Для простоты будем использовать только литеры, входящие в данный текст, включая пробел. Тогда сам текст будет представлен следующей совокупностью логических векторов:
У[а] : 00000101000000 У[г]: 00000000010000 У[д]: 00100010000001 У[о]: 01000000001010 У[р]: 10001000000100 У[“ “]: 00010000100000
Запись У[8] обозначает булев вектор, соответствующий символу s. Для простоты далее будем использовать следующую сокращенную запись: а: 00000101000000 г:00000000010000 д: 00100010000001 о:01000000001010 р:10001000000100 пробел: 00010000100000
Начнем процедуру поиска слова "род". Первый логический вектор для литеры "р" оставим без изменений. Второй логический вектор для литеры "о" сдвинем на один разряд влево, а логический вектор для литеры "д" сдвинем на два разряда влево. Результат будет определяться произведением этих векторов. Каждый вектор отыскивается по значению символа s и номеру позиции этого символа в запросе по формуле:
У’[8] = вИЦУИ, і),
где і - номер позиции символа, вИЦ - функция побитового сдвига вектора влево на заданное количество позиций.
В итоге получим следующие логические векторы: вИЦ(У[р],0): 10001000000100 вИЦ(У[о],1): 10000000010100
SHL(V[4],2): 10001000000100
Логическое умножение этих векторов дает вектор: 10000000000100, в котором единицы указывают позиции, где находится начало искомого слова. Вычислительная сложность этого алгоритма при соответствующей аппаратной реализации линейно зависит от длины искомого слова и не зависит от длины текста.
Ниже покажем, как реализуются типовые языковые конструкции стандарта POSIX с помощью операций над булевыми векторами.
Реализация запросов, содержащих регулярные выражения, с использованием механизма биассоциативного поиска
Стоит отметить, что важным преимуществом битовой карты является то, что вектор может отвечать не только определенному символу, но и группе символов. Пусть задан текст: CFD41B919DE93ECE51.
Можно сопоставить тексту несколько векторов, обозначающих, к примеру, принадлежность символов этого текста к классу букв или цифр.
Цифры: 000110111001100011 Буквы: 111001000110011100
В таком случае становится возможным делать запросы, направленные на поиск не конкретных символов, а на поиск групп (классов, множеств) символов на основе поисковых шаблонов.
Пример 2. Пусть дан текст: abcdbabccabd. Тогда карта будет выглядеть: а:100001000100 b:010010100010 с: 001000011000 d:000100000001
Необходимо найти последовательность символов «abcd» или «аЬсс»(обе имеются в тексте). Тогда можно задать вектор последнего символа как результат выполнения операции OR между векторами символов «с» и «d»: d:000100000001 с:001000011000 ^or_d: 001100011001 Процесс поиска можно представить как:
SHL(V[a],0) AND SHL(V[b],1) AND SHL(V[c],2) AND SHL№_or_d],3),
где
SHL(V[a],0): 100001000100
SHL(V[b],1): 100101000100
SHL(V[c],2): 100001100000
SHL(V^_or_d],3): 100011001000 Результат поиска: 100001000000
Теперь рассмотрим многовариантный поиск, задаваемый через отрицание. Отрицание также может быть использовано в поиске текста, например, когда необходимо в качестве символа разрешить все, кроме символа/нескольких символов.
Пример 3. Предположим, что в тексте: abcdbabccabd, необходимо найти все последовательности abc, после которых идет не-d. В таком случае класс символов «не-d» будет задаваться через отрицание d:
d:000100000001
not-d: 111011111110
Процесс поиска можно представить как:
SHL(V[a],0) AND SHL(V[b],1) AND SHL(V[c],2) AND SHL(V [not_d],3),
где
SHL(V[a],0): 100001000100
SHL(V[b],1): 100101000100
SHL(V[c],2): 100001100000
SHL(V[not_d],3): 011111110000 Результат поиска: 000001000000.
Заключение
Таким образом, была рассмотрена модификация метода биас-социативного поиска текста на случай, когда для задания запросов могут быть использованы регулярные выражения. Алгоритм поиска может быть также применен за пределами задачи поиска текста. Вместо текста может быть всё, что представимо в виде последовательности битов. Например, в качестве последовательности может использоваться набор последовательно поступающих во времени векторов значений входных воздействий некоторой системы, а также выходных значений и внутренних состояний.
Более того, алгоритм может использоваться не только при обработке одномерных данных. Возможна работа с данными любой размерности. При заранее известных ограничениях на размерность массива данных по каждому измерению можно будет свести операции сдвигов по любому из них к битовым сдвигам в одномерном массиве данных. К примеру, это может быть использовано в анализе и обработке растровых изображений и воксельных моделей. Алгоритм апробирован на задаче удаления служебных тегов из HTML-документов.
Литература
1. Кулик, Б.А. Алгебраический подход к интеллектуальной обработке данных и знаний / Б.А. Кулик, А.А. Зуенко, А.Я. Фридман. - СПб.: Изд-во Политехн. ун-та, 2010. - 235 с.
2. Кулик, Б.А. Система поиска слов в произвольном тексте / Б.А. Кулик // Программирование. -1987.- № 1. -C.49-50.
Сведения об авторах
Зуенко Александр Анатольевич - к.т.н, научный сотрудник,
е-mail: zuenko @iimm. kolasc.net.ru
Alexander A. Zouenko - Ph.D. (Tech. Sci.), Researcher
Алмаматов Александр Анатольевич - стажер-исследователь,
Alexander A. Almamatov - Probationer-researcher