УДК 004.65 СРАВНЕНИЕ МЕТОДА TRIE-ДЕРЕВЬЕВ И Q-ГРАММ ПРИ НЕСТРОГОМ СОЕДИНЕНИИ ТАБЛИЦ В MYSQL Ключевые слова: базы данных, нестрогое реляционное соединение, сопоставление записей В.В. Кедровская, Г.О. Федоркова Липецкий государственный технический университет Предлагается сравнение метода trie-деревьев, реализованного в виде программного proxy-уровня, работающего между СУБД MySQL и клиентскими приложениями, осуществляющего парсинг и оптимизацию запросов, содержащих операцию нестрогого равенства, и метода q-грамм, реализованного с помощью SQL-запросов. 1. Введение В статье рассматривается задача сравнения времени применения метода trie-деревьев и метода q-грамм для реализации системы нечеткого поиска для СУБД MySQL при помощи выполнения запросов нестрогого соединения таблиц. Целью данного сравнения является определение более эффективного и быстрого метода поиска. При организации поиска в распределенных базах данных возникают характерные проблемы, связанные с наличием в запросах орфографических и фонетических ошибок и ошибок ввода информации. Вследствие этого задача поиска не может быть в полной мере решена только методами проверки на точное соответствие. Становится актуальной задача разработки специальных методов и технологий текстового поиска с использованием нетривиальных решений, в том числе на основе операций нестрогого соответствия. Нечеткий поиск позволяет соединять достаточно близкие пары записей. В качестве меры лингвистической схожести записей используется расстояние Левенштейна - минимальное количество операций вставки одного символа, удаления одного символа и замены одного символа на другой, необходимых для превращения одной строки в другую. Поскольку опечатки имеют неодинаковую частоту для разных пар букв, следует задать функцию стоимости преобразования как : (S { }) 2 Z (1) Здесь ξ- «пустой» символ, так что ω(ξ , а) - стоимость вставки символа a, ω (β, ξ) - стоимость удаления β, ω (β, a) - стоимость замены β на а, ω (a, a) = 0 для любого а. Таким образом, расстояние Левенштейна целесообразно использовать для определения степени близости строковых значений и нахождения «похожих» значений ключевых атрибутов. Для поиска близких по Левенштейну записей используются такие методы поиска, как метод расширения выборки, сигнатурные алгоритмы, алгоритмы последовательного перебора, алгоритмы фонетической похожести. В [1] предложена операция нестрогого соединения таблиц методом сравнения попарных записей. Основной сложностью при этом является время выполнения операции нестрогого соединения. Предлагается использовать подход, основанный на применении метода q-грамм [2], и сравнить время операции нестрогого соединения с помощью метода q-грамм и метода trie-деревьев [3]. 2. Метод trie-деревьев Trie-деревья – это структура, поиск в которой основан на представлении термина последовательностью символов. В trie-дереве все строки, имеющие общее начало, располагаются в одном поддереве. Каждое ребро помечено некоторой строкой. Терминальным вершинам ("листьям") соответствуют слова списка. В случае неудачи поиск возвращает термин словаря, совпадающий с искомым образцом в наибольшем числе начальных символов. Обычно trie -деревья используются для поиска по подстроке, но их можно использовать, и весьма эффективно, для поиска по сходству. Метод trie-деревьев для поиска по сходству не включен в стандартные функции MySQL, а его реализация отдельным пользователем слишком трудоемка. Поэтому для метода trie-деревьев реализован программный proxy-уровень, работающий между СУБД MySQL и клиентскими приложениями, осуществляющий парсинг и оптимизацию запросов, содержащих операцию нестрогого равенства. Для этого создан программный proxyуровень, являющийся клиентом по отношению к серверу MySQL и сервером по отношению к клиентам, отправляющим запросы к базе данных [4]. Оператор нестрого равенства разработан как дополнение к уже существующим операторам сравнения SQL. Синтаксис оператора нестрогого равенства: имя _ таблицы _ А.имя _ поля _ а1 n имя _ таблицы _ В.имя _ поля _ b1, (2) где n – расстояние Левенштейна. Основной задачей парсера является выявление в запросах оператора нестрогого равенства и выявление в таких запросах лексем, необходимых для дальнейшего использования при построении и последующем соединении trie-деревьев. Если оператор нестрогого равенства не выявлен, то текст данного блока будет сохранен без изменений для последующей отправки к системе управления базами данных. Таким способом была сохранена возможность использования в системе стандартных SQL-запросов. Если оператор нестрогого равенства выявляется, то при помощи лексического анализа в тексте блока выявляется необходимая для операции нестрогого соединения информация: имена таблиц, полей, значение заданного пользователем расстояния Левенштейна. Далее эти данные передаются в оптимизатор, где принимается решение о наилучшем способе построения таблицы с похожими парами строк указанных полей. После построения такой таблицы текст блока необходимо изменить так, чтобы он соответствовал синтаксису SQL. Пусть парсер получает запрос: SELECT A.line1, B.line2 (3) from A, B where A.line1 1 B.line2 Запрос, который будет отослан СУБД, будет таким: SELECT A.line1, B.line2 FROM A, B, zzztrie _ A _ line1 _ B _ line2 _ 1 _ 2 _ 2 WHERE ( A.id zzztrie _ A _ line1 _ B _ line2 _ 1 _ 2 _ 2.id1 AND B.id zzztrie _ A _ line1 _ B _ line2 _ 1 _ 2.id 2) (4) 3. Метод q-грамм Пусть задана последовательность S s1 , s2 ,...,s S (5) из S элементов. q-граммой называется любая подпоследовательность последовательности S из q подряд идущих элементов: S si , si 1 ,...,si q (6). Т.е. если две последовательности похожи, то у них должны быть какие-либо общие подпоследовательности. Данный метод основан на предположении, что при малых искажениях последовательности, т.е. слова, должны обладать достаточным количеством общих q-грамм. Основной недостаток метода q-грамм – относительно большой объем дискового пространства, необходимый для хранения грамм. Однако данный недостаток компенсируется точностью поиска. Для реализация метода q-грамм в СУБД MySQL используются SQLзапросы. Реализация метода включает следующие этапы: 1. Создание специальной таблицы, в которой будут находиться qграммы для таблицы исходных данных. В виде запроса данная операция будет выглядеть следующим образом: create table (7) ra1q (a0 int, pos int, qgram var char (250)); Для второй таблицы: create table (8) ra 2q (a0 int, pos int, qgram var char (250)); 2. Заполнение созданной таблицы q-граммами. insert int o ra1q select d1.id , an, i, substr (concat (concat (9) (' # # ' , upper (d1.surname )),'%%'), an.i, 3) from d1, an where an.i char _ length (d1.surname ) 2; Для второй таблицы: insert int o ra 2q select d 2.id , an, i, substr (concat (concat (10) (' # # ' , upper (d 2.surname )),'%%'), an.i, 3) from d 2, an where an.i char _ length (d 2.surname ) 2; Функция upper преобразует все символы аргумента к верхнему регистру. Функции substr и concat присоединяют символы # и % к первым и последним q-граммам аргумента соответственно. Функция char_lenght подсчитывает символы и возвращает длину строки-аргумента. В таблице an.i содержатся числа от 1 до n, где n – максимальная длина записи в таблицах d1 и d2. 3. Выполнение нестрогого соединения таблиц. Из таблиц выбираются только те данные, у которых есть достаточное количество общих q-грамм. Для определения степени близости строковых значений используется расстояние Левенштейна. Запрос на нестрогое соединение таблиц d1 и d2 будет выглядеть следующим образом: select d1.id , d 2.id , d1. surname , d 2.surname from d1, ra1q, d 2, ra 2q where d1.id ra1q. a 0 and d 2.id ra1q. a 0 and ra1q. qgram ra 2q. qgram and ra1q. pos ra 2q. pos 1 and ra1q. pos ra 2q. pos 1 and char _ length (d1.surname ) char _ length (d 2.surname ) 1 and char _ length (d1.surname ) char _ length (d 2.surname ) 1 group by d1.id , d 2.id , d1. surname , d 2. surname having count (*) (11) char _ length (d1. surname ) 1 and count (*) char _ length (d 2. surname ) 1; 4. Сравнение методов Для сравнения работы метода q-грамм и trie-деревьев были выбраны таблицы с фамилиями из телефонного справочника 2008. Сравнение производилось сначала для таблиц с различающимися записями, а затем для таблиц и их копий. Тестирование проводилось на таблицах различного размера (100, 250, 500, 750, 1000 элементов) для расстояния Левенштейна, равного 1 и 2. В результате тестирования получены следующие данные: Для таблиц с различающимися записями Для расстояния Левенштейна = 1: Количество trieзаписей в деревья, с таблице 100 250 500 750 1000 0,38 0,78 3,32 8,08 12,79 Табл.1. Время выполнения запросов Мощность запроса (количеq-грамм, ство найденс ных совпадений) 0,61 3 2,27 18 14,28 91 36,49 184 75,12 261 Рис. 1. Сравнение времени выполнения запроса нестрогого соединения методом trie-деревьев и q-грамм для расстояния Левенштейна = 1: Для расстояния Левенштейна = 2: Количество записей в таблице trieдеревья, с 100 250 500 0,46 3,29 14,29 Табл.2. Время выполнения запросов Мощность запроса (количеq-грамм, ство найденс ных совпадений) 1,38 11 4,78 117 37 493 750 1000 29,55 46,25 84,16 195,34 1075 1634 Рис. 2. Сравнение времени выполнения запроса нестрогого соединения методом trie-деревьев и q-грамм для расстояния Левенштейна = 2: Для таблиц и их копий Для расстояния Левенштейна = 1: Табл.3. Время выполнения запросов Мощность заq-грамм, проса (количестс во найденных совпадений) Количество записей в таблице trieдеревья, с 100 2,78 0,42 107 250 6,93 2,2 273 500 15,34 14,24 579 750 26,8 36,03 931 1000 37,17 72,25 1329 Рис. 3. Сравнение времени выполнения запроса нестрогого соединения методом trie-деревьев и q-грамм для расстояния Левенштейна = 1: Для расстояния Левенштейна = 2: Табл.4. Время выполнения запросов Мощность заКоличество trieq-грамм, проса (количестзаписей в деревья, с с во найденных таблице совпадений) 100 2,24 0,48 111 250 8,89 3,15 347 500 26,46 24,56 959 750 48,36 79,15 1745 1000 77,83 133,8 2921 Рис. 4. Сравнение времени выполнения запроса нестрогого соединения методом trie-деревьев и q-грамм для расстояния Левенштейна = 2: 5. Результаты Среди полученных результатов необходимо выделить следующее: 1. Реализована операция нестрогого соединения таблиц в СУБД MySQL с помощью метода trie-деревьев и q-грамм. 2. В ходе проведенного тестирования и анализа результатов времени выполнения запросов можно сделать вывод о том, что метод trie-деревьев, встроенный в proxy-уровень, при работе с таблицами с различающимися данными, работает быстрее, чем метод q-грамм, особенно при тестировании таблиц с большим количеством записей. При работе с таблицами и их копиями в таблицах с небольшим количеством записей метод q-грамм работает быстрее, но по мере увеличения количества записей в таблицах он теряет свою эффективность как для соединения с расстоянием Левенштейна, равным 1, так и с расстоянием Левенштейна, равным 2. 3. Подтверждена эффективность применения метода trie-деревьев в алгоритме нестрогого соединения таблиц по сравнению с методом q-грамм, особенно при тестировании таблиц с большим количеством записей. Хотя метод q-грамм достаточно просто реализовать с нуля с помощью SQL-запросов, для метода trie-деревьев необходимо реализовать специализированное программное обеспечение, включающее архитектуру “клиент-сервер”. 1. 2. 3. 4. Список литературы Погодаев А.К., Федоркова Г.О. Нестрогое соединение реляционных таблиц: хеширование по сигнатуре // Системы управления и информационные технологии, 2005, №2(19), с. 93-95. L. Gravano, P. Ipeirotis, H. V. Jagadish, N. Koudas, S. Muthukrishnan, L. Pietarinen, D. Srivastava Using q-grams in a DBMS for Approximate String Processing// IEEE Data Engineering Bulletin, 2001, №4, p. 4-6. Погодаев А.К., Федоркова Г.О. Нестрогое соединение реляционных таблиц: использование trie-деревьев // Системы управления и информационные технологии, 2010, №3, с. 40-44. Грачев Е.Р., Федоркова Г.О. Нестрогое реляционное соединение таблиц при помощи trie-деревьев // ВНТИЦ, 2010, №50201150648, с. 3-5. Опубликовано: Системы управления и информационные технологии, 2012, №2.1(48). С. 150-153.