SQL запросы для поиска слов в словарной базе данных

Одна из важнейших черт в дизайне грамматического словаря состоит в том, что парадигмы слов в нём полностью раскрыты и слова хранятся в естественном виде. Возьмём, к примеру, существительное словарь. Кроме начальной формы у него есть 11 грамматических форм, описывающих склонение существительного по падежам и числам: словаря, словарем, словарю, словаре и так далее. Все они находятся в словарной базе. Упомянутая естественность заключается в том, что хранятся не окончания, которые надо добавлять к стему (псевдокорню), а полные слова. Такой подход существенно облегчает поиск слов и позволяет использовать обычные SQL запросы, оставаясь в рамках реляционной модели. Так как большинство СУБД поддерживают оператор LIKE, то можно выполнять поиск по начальному фрагменту слова или по окончанию нужной длины. Более того, некоторые СУБД допускают использование регулярных выражений, что еще более расширяет возможности поиска.

Кроме быстрого и простого поиска слов в лексиконе, такой подход позволяет очень просто реализовать хранение парадигм для других языков, в которых словоизменение отличается от простой замены окончаний. Даже для русского языка можно столкнуться с такими явлениями, как беглые гласные и чередование согласных, то есть c изменениями в корнях слов. Для русских прилагательных иногда употребляются синтетические формы превосходной степени с приставкой наи-, к примеру хороший-лучший-наилучший. В английском языке есть некоторое количество неправильных глаголов и существительных, для которых также не представляется возможным описать их спряжение и склонение с помощью пар стем+окончания, не прибегая к замене стема пустой строкой или одной начальной буквой.

Единственный недостаток в хранении раскрытых парадигм по сравнению с моделью стем+набор флексий заключается в большом размере словарной базы. Но он полностью компенсируется перечисленными ранее плюсами. Если все-таки появляется необходимость перейти к модели стем+окончания, то им достаточно просто сгенерировать из имеющихся парадигм и сохранить в своих таблицах. К примеру, именно так создается база правил для лемматизатора.

Таблица нормализованных форм слов SG_LEXEM

Сначала рассмотрим способ поиска слов, который используется при морфологическом анализе.

В качестве отправной точки мы используем слово, приведенное к верхнему регистру. Для русского языка следует также заменить все вхождения буквы ё на е. Таким образом, искомое слово примеры становится ПРИМЕРЫ.

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

SELECT *
 FROM  sg_lexem
 WHERE name='ПРИМЕРЫ'

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

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

Таблица SG_FORM - формы слов с грамматическими атрибутами

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

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

Зная первичный ключ записи в sg_lexem, полученный на первом шаге, мы можем эффективно выбрать все записи в sg_form, связав их по полю sg_form.id_lexem:

SELECT F.*
 FROM  sg_lexem L, sg_form F
 WHERE L.name='ПРИМЕРЫ' AND F.id_lexem=L.id

Вы можете заметить, что столбец sg_form.name хранит слово в "естественном" регистре. Это позволяет реализовать альтернативный путь поиска слов, хотя он может быть значительно менее эффективен из-за необходимости приведения сравниваемых слов к одному регистру:

SELECT *
 FROM  sg_form
 WHERE Lower(name)='примеры'

Поиск по начальной форме слова в таблице SG_ENTRY

Если задача сформулирована как поиск по начальной форме слова, то можно воспользоваться столбцом uname в таблице sg_entry. Эта таблица хранит заголовки словарных статей. Столбец sg_entry.name в подавляющем числе случаев соответствует начальной форме слова, то есть инфинитиву для глагола, единственному числу именительного падежа для существительных, положительной степени для наречий и так далее. Таким образом, запрос:

SELECT *
 FROM  sg_entry
 WHERE uname='ПРИМЕР'

вернет информацию о словарной статье для существительного пример.

Можно заметить, что поле sg_entry.name хранит начальную форму в "естественном" регистре.

Объединение таблиц SG_LEXEM, SG_FORM и SG_ENTRY в одном запросе для поиска слова

Ранее уже было отмечено, что таблицы sg_lexem и sg_form связаны ограничением внешнего ключа sg_form.id_lexem=sg_lexem.id, что позволяет находить все формы слова.

Теперь можно пойти дальше, найдя для слова все возможные словарные статьи, формой которых оно является. Для этого следует использовать столбец sg_form.id_entry, соответствующий первичному ключу sg_entry.id. К примеру, слово уже может быть положительной степенью наречия уже́, сравнительной степенью наречия узко, сравнительной формой прилагательного узкий или формой предложного падежа существительного уж. В этом нетрудно убедиться с помощью запроса:

SELECT DISTINCT E.*
 FROM  sg_lexem L, sg_form F, sg_entry E
 WHERE L.name='УЖЕ' AND F.id_lexem=L.id AND E.id=F.id_entry

Поиск слова в lexemes_1 и lexemes_n при лемматизации

Иногда возникает задача получения нормальной формы слова. Кроме описанной связки из таблиц (sg_lexem, sg_form, sg_entry), словарная база реализует альтернативное решение, заточенное под задачу лемматизации.

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

В качестве пояснения рассмотрим поиск слова уже в обеих таблицах.

В первом случае для таблицы lexemes_n запрос:

SELECT *
 FROM  lexemes_n
 WHERE lexeme='УЖЕ'

вернет 4 записи, соответствующие двум случаям для наречия, прилагательному и существительному.

В случае использования таблицы lexemes_1 запрос:

SELECT *
 FROM  lexemes_1
 WHERE lexeme='УЖЕ'

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

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

SELECT L.*
 FROM  lexemes_n W, lemmas L
 WHERE W.lexeme='УЖЕ' AND L.id=W.id_lemma

Поиск слов по маске

В большинстве случаев СУБД позволяет использовать оператор LIKE для поиска слов по заданной маске. Важными частными случаями являются поиск по начальному фрагменту слова и поиск по заданному окончанию. Простейший запрос для поиска по префиксу 'словар-' может выглядеть так:

SELECT *
 FROM  sg_form
 WHERE name LIKE 'словар%'

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

Этот запрос можно переписать на использование таблицы sg_lexem, чтобы устранить влияние регистра символов в поле sg_form.name. Впрочем, для некоторых СУБД правильная конфигурация языковой локали для таблиц включает механизм регистронезависомого сопоставления для оператора LIKE не только для английского языка.

Следующие уроки

Определение части речи

Ёфикация - учет буквы ё, поиск и восстановление

Получение списка грамматических форм слова по начальной форме

Справочники грамматических атрибутов

Определение грамматического рода существительных

Дополнительные материалы по работе со словарной базой

Купить словарную базу русской морфологии

Реляционная схема словарной базы

  © Elijah Koziev 2010
прикладные проекты на основе грамматического словаря API грамматической машины компоненты для доступа к грамматическому словарю условия получения SDK токенизатор и сегментатор морфологический анализ и синтез лемматизатор база N-грамм синтаксический анализатор словоформы морфология и синтаксис русского языка падеж число род совершенный и несовершенный вид экспорт в SQL формат экспорт в XML формат скрипт SQL словаря структура SQL словаря структура XML словаря компоненты для доступа к грамматическому словарю ORM Persistent Dictionary Library лемматизация стемминг примеры использования грамматического словаря склонение существительных в русском языке склонение русских прилагательных спряжение глаголов в русском языке поиск текста с учетом морфологии OCR подсистема расширенные регулярные выражения генератор текста генератор случайного текста и имитатор рандомизатор синонимизатор перефразировщик Статистика буквенных паттернов

Грамматический словарь русского языка



Грамматический словарь
склонение и спряжение глаголов, существительных, прилагательных

В состав входит русский и английский словарь.

платформа:  Windows 2000 ... Windows 7
требования: 512 Mb свободной памяти, 300 Мб на диске
размер:         34 Мб

  скачать грамматический словарь купить грамматический словарь SDK грамматического словаря
грамматический словарь русского языка



SDK Грамматического словаря



SDK Грамматического Словаря
склонение и спряжение глаголов, существительных, прилагательных

В состав входит русский и английский словарь.

платформа:  Windows 2000 ... Windows 7
размер:         13 Мб

SQL словарь (демо):
sqlite mysql oracle firebird mssql

скачать демо-версию SDK купить SDK API грамматического словаря



Поисковая система



Integra
настольная и сетевая поисковая система 

платформа:  Windows XP ... Windows 7
требования: 512 Mb свободной памяти
размер:         21 Мб

Дополнительные компоненты:
MySQL поисковый сервер 13.5 Мб
Integra.Premium MySQL 3.9 Мб

скачать поисковую систему SDK поисковой системыописание поисковой системы



SDK Поисковой системы



SDK Поискового движка
API для настольной и сетевой поисковая система 

платформа:  Windows XP ... Windows 7
размер:         17 Мб

Дополнительные компоненты:

MySQL поисковый сервер 13.5 Мб
Integra.Premium MySQL 3.9 Мб

скачать SDK SDK поисковой системы



Экранный переводчик



Translator
экранный переводчик

платформа:  Windows XP ... Windows 7
требования: 256 Mb свободной памяти
размер:         4.4 Мб

Дополнительные компоненты:
расширенный англо-русский словарь 6.4 Мб


скачать экранный переводчикописание экранного переводчика



изменено 04-May-12