Загрузка SQL словарей в СУБД

Получение скриптов для загрузки русской морфологии в SQL БД

Имея полный дистрибутив SDK, можно экспортировать словарь в формат SQL из бинарного представления с помощью утилиты decompiler. Но полный SDK предоставляется только по индивидуальным контрактам кастомизации словаря и не доступен для обычной покупки, поэтому следует воспользоваться вторым нижеописанным вариантом.

Другой способ получения скрипта для конкретной СУБД - приобрести его у разработчиков, вместе с дополнительными утилитами и технической поддержкой. На указанной странице можно также найти ознакомительные версии скриптов для нескольких СУБД с немного урезанными возможностями. Несмотря на ограничения в ознакомительной версии, Вы сможете попробовать выполнить все уроки по работе с русской морфологией в SQL.

Размеры базы данных словаря

Распакованные скрипты для загрузки полного русского словаря вместе со всеми необходимыми текстовыми файлами (см. далее описание BULK INSERT и LOAD DATA) имеют размер от 500 до 1500 Мб.

В запакованном виде архивы имеют размер примеро 30 Мб.

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

Демо-версии скриптов, которые можно скачать на странице загрузок, весят до 3 Мб.

Версии СУБД

Для настройки на целевую СУБД, в которую будет загружатся получаемый словарь, используется параметр в опции -sql для утилиты decompiler.

Благодаря явному указанию СУБД можно учесть мелкие отступления от стандарта SQL. Иногда это делает использование скрипта более удобным. Например, возьмем стадию создания таблиц - самое начало скрипта. Если ограничиться операторами CREATE TABLE, то повторная загрузка словаря в ту же базу данных потребует предварительного ручного удаления имеющихся таблиц. Удобно поручить данную операцию самому скрипту, но различные СУБД предлагают для этого совершенно разные инструменты, а некоторые, как Oracle или FireBird, - вообще не предоставляют. К примеру, MySQL реализует оператор

drop table if exists имя_таблицы

который удаляет указанную таблицу, если она существует. Если такой функциональности скриптовый язык СУБД не предоставляет, как например FireBird, то приходится использовать стандартный SQL оператор DROP TABLE. В случае FireBird данный оператор выдаст в консоль сообщение об ошибке, если удаляемой таблицы нет. Исполнение скрипта будет продолжено, но наличие таких ложных сообщений будет отвлекать от действительно полезной диагностики.

Такая же функциональность для MS SQL реализуется совсем другим способом. Скриптовый язык T-SQL предоставлят нам оператор if exists, и кроме того данная СУБД дает доступ к метаданным - в том числе к списку существующих таблиц. Совмещая все это, получаем такую команду

if exists(select table_name from solarix.information_schema.tables where table_name = 'sg_entry') drop table sg_entry;

Она выполнит DROP TABLE только если таблица уже существует.

Другой эффект от априорного задания версии СУБД - использование специфических средств, ускоряющих загрузку словаря. Даже для одноязычного русского словаря создаваемая база данных содержит полтора миллиона словарных форм и более десяти миллионов записей в таблице SG_FORM_COORD - грамматические признаки для каждой формы. Загрузка такого объема данных набором стандартных операторов INSERT может быть крайне длительной операцией - несколько часов в случае MS SQL и Oracle, даже при монопольном доступе к ресурсам сервера. Поэтому мы по возможности используем специальные возможности каждой СУБД для пакетной загрузки данных в таблицы, минуя стандартный конвейер клиент-сервер-парсер запросов-движок ресурсов БД. Для MS SQL оператор BULK INSERT позволяет сократить время загрузки в сотни раз. Для MySQL и Oracle есть похожие механизмы, также позволяющие быстро загрузить данные в таблицы из специальным образом форматированных файлов - команды LOAD DATA INFILE.

Все вышеперечисленные нюансы не влияют на результат загрузки - получаемый набор таблиц одинаков. А вот другой аспект настройки на конкретную версию СУБД приводит к различиям в реляционной схеме словаря. Дело в том, что предполагается несколько различное использование словаря на разных СУБД.

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

Другой пример - создаваемый в MS SQL словарь имеет намного более широкий, в сравнении с другими вариантыми, набор первичных и внешних ключей. Это позволяет работать средствам автоматического извлечения реляционной схемы, к примеру для поддержки Entity Framework и LINQ-to-SQL.

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

Загрузка словаря в СУБД

Каждая поддерживаемая СУБД предоставляет свой механизм выполнения скриптов для формирования базы. Самый удобный способ обычно заключается в вызове соответствующей консольной утилиты. Такие утилиты поддерживаются большинством СУБД, включая Oracle, MS SQL, SQLite, FireBird, MySQL. Следует отметить, что несмотря на общий подход - консольная утилита получает в качестве аргумента имя файла скрипта и параметры подключения к своему серверу - детали могут существенно отличаться.

MS SQL BULK INSERT

Загрузка словаря, представленного только в виде команд INSERT, для данной СУБД происходит очень медленно.

К примеру, чрезвычайно урезанный демо-словарь, содержащий около 6 тысяч словарных статей русского языка и связи для них, загружается в БД около полутора часов для небольшого "бюджетного" сервера. Загрузка полного словаря в таких условиях превращается в мучительный процесс, который надо ускорять по возможности в разы.

Как показала практика, самый удобный способ ускорить загрузку словаря в MS SQL сервер в сотню-другую раз - использовать оператор BULK INSERT языка T-SQL.

Реализация выглядит таким образом. Несколько таблиц, содержащих основную массу данных, выгружаются в отдельные текстовые файлы в кодировке utf16 в формате csv. В качестве разделителей полей используется символ диез #.

Формирующий словарь SQL скрипт содержит команды массовой загрузки данных из этих файлов, для каждого внешнего файла:

BULK INSERT sg_entry FROM 'E:\MVoice\lem\tmp\sg_entry.txt' WITHFIELDTERMINATOR='#', DATAFILETYPE='widechar' )

GO

Загрузка полного русского словаря с помощью команд BULK INSERT занимает всего несколько минут на вышеупомянутом сервере.

MySQL LOAD DATA INFILE

СУБД MySQL достаточно хорошо справляется с загрузкой словаря с помощью стандартных команд INSERT, но есть способ значительно, в несколько раз, ускорить процесс. Соответствующие возможности опираются за команду LOAD DATA:

LOAD DATA INFILE 'E:\\MVoice\\lem\\tmp\\lemmas.txt'
     INTO TABLE lemmas
     CHARACTER SET utf8
     FIELDS TERMINATED BY '#'
     LINES TERMINATED BY '\r\n' (id,lemma);

Как и в ранее рассмотренной команде BULK INSERT для сервера MS SQL, загружаемые в таблицы данные располагаются во внешних текстовых файлах в формате csv с кодировкой utf-8.Данные каждой таблицы находятся в отдельном файле.

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

FireBird BULK INSERT

СУБД FireBird достаточно хорошо справляется с загрузкой словаря командами INSERT. К примеру, русский словарь, включающий примерно 120 тысяч словарных статей, полтора миллиона словарных форм и полмиллиона связей в тезаурусе, загружается на маломощном сервере примерно за 2 часа. На этом же сервере СУБД MS SQL без использования BULK INSERT, за эти же два часа успевает загрузить только демо-словарь с 6 тысячами словарных статей.

Единственный прием, ускоряющий загрузку операторами INSERT, заключается в группировке вставок пачками, примерно по 60 записей. Данный механизм тоже называется BULK INSERT, но в отличие от ранее рассмотренных аналогов представляет из себя не загрузку данных из внешних файлов, а только синтаксическое объединение нескольких независимых команд INSERT в одну команду. Такое объединение улучшает скорость выполнения скрипта за счет уменьшения накладных расходов на пересылку команд по сети от клиента к серверу и затрат времени на синтаксический анализ каждого отдельного оператора.

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

INSERT INTO sg_lexem( id, name )
    SELECT 118387248, 'КОШКА' FROM RDB$DATABASE
    UNION ALL
    SELECT 118387310, 'КОШКИ' FROM RDB$DATABASE
    UNION ALL
    SELECT 118387372, 'КОШКОЙ' FROM RDB$DATABASE
    UNION ALL
    SELECT 118387434, 'КОШКАМИ' FROM RDB$DATABASE
    UNION ALL
    SELECT 118387496, 'КОШКОЮ' FROM RDB$DATABASE
    UNION ALL
    SELECT 118387558, 'КОШКУ' FROM RDB$DATABASE
    UNION ALL
    SELECT 118387620, 'КОШЕК' FROM RDB$DATABASE
    UNION ALL
    SELECT 118387682, 'КОШКЕ' FROM RDB$DATABASE
    UNION ALL
    SELECT 118387744, 'КОШКАХ' FROM RDB$DATABASE;

Как видно из этого примера, используется специфичный для СУБД FireBird механизм конструирования добавляемой записи - системная таблица с интересным именем RDB$DATABASE. Данная таблица имеет единственную запись, причем содержимое полей этой записи нас даже не интересует. Оператор

SELECT 118387248, 'ГАЛАКТИКА' FROM RDB$DATABASE

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

Набор из нескольких записей можно получить с помощью оператора UNION ALL. Данный оператор объединяет результаты испольнения двух команд SELECT, причем ключевое слово ALL не позволяет серверу отбрасывать повторяющиеся строки.

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

Oracle LOAD DATA

Загрузка грамматического словаря в БД Oracle может занять недопустимо много времени, если не использовать специальный механизм массовой загрузки данных, предоставляемый утилитой sqlldr. В целом механизм загрузки похож на тот, который используется в MS SQL и MySQL. То есть, данные построчно записаны в отдельные текстовые файлы. Каждый такой файл имеет следующий формат:

        LOAD DATA
        INFILE *
        TRUNCATE
        INTO TABLE table1
        FIELDS TERMINATED BY '#' OPTIONALLY ENCLOSED BY '"' ( fld1, fld2 )
        BEGINDATA
        1,aaa
        2,bbb
        3,ccc

Для загрузки файла используется утилита sqlldr. Ей в командной строке задаются параметры подключения к БД и имя файла для загрузки:

sqlldr user/password@db control=load.ctl log=load.log bad=load.bad discard=load.dis

Дополнительные материалы

Описание SQL словаря

Дистрибутив SQL словаря

Экспорт словаря в SQL формат

ORM библиотека для доступа к словарю из C#

Первичные ключи и константы id

Генерация первичных ключей

Кэширование

  © 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