Словарь в SQL базе данных

Приобретение SQL словаря

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

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

Экспорт словаря в виде SQL скрипта

Для получения SQL скрипта, который сформирует структуру таблиц и заполнит их данными, используется утилита decompiler. В качестве источника она использует скомпилированный бинарный словарь.

Выполнение созданного скрипта выполняется соответствующими утилитами для целевой базы данных. В составе SDK SQL словаря есть готовые командные файлы для заливки скрипта в MySQL, FireBird, Oracle, SQLite, MS SQL.

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

Создаваемые таблицы словаря

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

Другие элементы базы данных могут отсутствовать, их поддержка может быть в СУБД может быть неполной или нестандартным расширением. Например, внешние ключи в SQLite некоторых версий или при сборке с особыми опциями компилятора могут попросту игнорироваться при операциях с данными. MS Access позволяет прямо в БД хранить отчеты и формы редактирования данных. Поддержка триггеров и хранимых процедур - еще одна возможность, предоставляемая некоторыми СУБД, не отличающаяся стандартизацией.

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

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

a) используемыми абстрактными математическими концепциями - операции с множествами, троичная логика, и пр.;

б) особенностями моделируемого социального феномена - языка, со всеми его закономерностями и нерегулярностями;

в) техническими ограничениями инструментов, находящихся в распоряжении инженера - то есть архитектора базы данных, а именно возможность хранения Unicode-строк, скорость поиска по большим таблицам, эффективность работы СУБД с составными индексами и так далее.

В нашем случае необходимо корректно и эффективно описывать такие аспекты языка, как лексикология (слова, синонимы, антонимы, топонимы, жаргонизмы и пр.) и морфология (грамматические формы, падежная система, глагольные времена и так далее). Структура базы данных должна быть достаточно гибкой, чтобы органично отражать присутствующие в языке "неправильности", к примеру - отсутствие у некоторых слов определенных грамматических форм:

купить - я куплю, победить - я ?

кошка - кошки, ? - сани

или напротив - наличие у некоторых слов редких форм, обычно отсутствующих:

спеть - споёмте

или альтернативные грамматические формы:

пёс - псом, кошка - кошкой или кошкою

красивый - красивее или покрасивее или покрасивей

слепнуть - слеп или слепнул

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

альтернативные формы множественного числа английских существительных penny - pennies или pence

варианты написания слова иероглифами (кандзи) и слоговой азбукой (обычно хирагана) в японском языке.

разное представление местоимений, например в русском языке местоимение я в 1м лице единственном числе является "унисекс" я читал, я читала; в японском языке местоимения являются скорее существительными, так как могут атрибутироваться прилагательными, а также имеют отдельные формы употребления женского и мужского рода в 1м лице; во французском языке местоимение 3го лица множественного числа имеет отдельную форму женского рода elles (они для группы субъектов ж.р.).

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

Среди особенностей можно перечислить следующее.

беглые гласные: лоб - лба - лбом, пень - пнем

чередование букв: пустишь-пущу, глухой-глуше, простой-проще, бежать-бегу, печь-пеку

Если вернуться к английскому языку, то в нем регулярность нарушается из-за внутренней флексии - так называемые аблауты и умлауты: to sing-sang-sung, foot-feet.

Создание таблиц словаря

Если при генерации SQL скрипта в опции -sql не был указан параметр noscheme, то скрипт содержит готовые команды создания нижеперечисленных таблиц и индексов.

Алфавит

ABC_ALPHABET - алфавиты.

ABC_CLASS - классы символов, например - буквы, пунктуаторы.

ABC_COORD - справочник дополнительных признаков для букв, например - 'размер' (заглавная или прописная).

ABC_STATE - справочник значений признаков, например - заглавная или прописная для признака 'размер'.

ABC_PAIRS - справочник наборов признаков и их значений.

ABC_PAIR - пара из id признака и id значения этого признака, привязанная к записи в ABC_PAIRS.

ABC_ENTRY - буквостатьи.

ABC_FORM - буквоформы, то есть отдельные символы, принадлежащие к какой-либо буквостатье.

ABC_CRITERION - управляющие параметры для работы подсистемы.

Подробнее об алфавитах ...

Лексикон и морфология

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

SG_STATE - состояния грамматических координат, например для русских падежей - это именительный, родительный и так далее.

SG_LANGUAGE - языки. Большинство грамматических классов, то есть частей речи, привязано к одному из языков, например - русское существительное или французский глагол.

SG_CLASS - грамматические классы, то есть части речи. Обратите мнимание, что функционально подобные части речи в разных языках, например - русское и английское существительное, объявлены как разные грамматические классы в данной таблице, так как возможные грамматические состояния и парадигмы для этих существительных различны.

SG_ENTRY - словарные статьи. В этой таблице храняться шапки статей - то есть имя словарной статьи, обычно совпадающее с базовой формой, признак части речи (id записи в SG_CLASS), и некоторые дополнительные данные. Формы слова хранятся в виде отдельных записей в таблице SG_FORM. Кроме обычных словарных статей в этой таблице также могут присутствовать специальные, нетерминальные статьи. Отличить их можно по ненулевому значению в поле flags.

SG_FORM - грамматические формы слов для словарных статей. Каждая словарная статья может иметь разное количество форм, от 1 (например, большинство предлогов), до сотни с лишним (для русских прилагательных, учитывая сравнительную и превосходную степени). Таким образом, одной записи в SG_ENTRY соответствует множество записей в SG_FORM. По поводу грамматических признаков отдельных форм смотрите также пояснения в отдельном разделе.

SG_LEXEM - лексемы, фактически это список форм слов без повторов.

SG_CLASS_COORD - типы грамматических признаков, разрешенных для частей речи. Поле coord_type может содержать 0 для атрибутов - постоянных признаков словарной статьи соответствующей части речи, 1 для измерений - словоизменительных признаков, 2 для тегов - необязательных постоянных признаков.

SG_ENTRY_COORD - атрибуты и тэги словарных статей. Например, каждое русское существительное имеет признак одушевленности (одушевленный или неодушевленный). Таким образом, каждой записи в SG_ENTRY, объявляющей русское существительное, будет корреспондировать одна запись в SG_ENTRY_COORD, в которой поле icoord указывает на запись для признака ОДУШ в таблице SG_COORD, а поле istate указывает на соответствующую запись в SG_STATE.

SG_FORM_COORD - измерения форм статей. Ситуация аналогична таблице SG_ENTRY_COORD, но в данном случае координатные пары привязаны не целиком к словарной статье, а к конкретной форме. Именно с помощью записей в этой таблице каждая форма русского существительного в SG_FORM знает о своем падеже и грамматическом числе - то есть для одной записи в SG_FORM будет 2 записи в SG_FORM_COORD. Для разных частей речи число записей в SG_FORM_COORD может варьироваться от 0 до десятка. Смотрите также пояснения в отдельном разделе.

LANG_ALPHABET - перечень алфавитов, которые использует язык.

LANG_LINK - перечень связей, отвечающих за переводы с языка.

LANG_PARAM - списки дополнительных параметров в описании языка.

AUX_FORM_TYPES - справочник типов дополнительных форм

AUX_FORM - дополнительные формы слов - ударение, ёфикация, транскрипция и так далее.

AUX_ENTRY_DATA - дополнительные данные для словарных статей - аналогично AUX_FORM, но относящиеся в целом к статье.

UNKNOWN_ENTRIES - служебный список кванторных статей.

PREDEF_ENTRIES - служебный список предопределенных нетерминальных статей

COORD_PAIRS - справочник кортежей грамматических признаков для грамматических форм слов

Тезаурус

SG_LINK - связи в тезаурусе. Каждая запись в этой таблице связывает 2 записи в SG_ENTRY, то есть словарных статьи, причем тип отношения - то есть тип связи - задается в поле istate. Возможные типы связей перечислены в таблице SG_STATE для icoord=0. То есть одна грамматическая координата с предопределенным именем "net" и SG_COORD.id=0 хранит типы связей.

SG_TAG - справочник тэгов для тезауруса. Каждый тег имеет имя, который объявляется в данной таблице, и допустимые значения, которые перечисляются в таблице SG_TAG_VALUE.

SG_TAG_VALUE - справочник значений тэгов для тезауруса.

SG_LINK_TAG - тэги для связей в тезаурусе. Объявленная в таблице SG_LINK связь двух словарных статей может быть дополнительно обременена условиями, например степенью близости для синонимов или тематикой для переводов. Каждое дополнительное условие на одну запись в SG_LINK описывается записью в SG_LINK_TAG.

SG_TENTRY - фразовые статьи (правые и левые части сложных связей тезауруса).

SG_TLINK - связи между парами записей в SG_TENTRY, фактически это сложные связи тезауруса. Данная по структуре полей аналогична таблице SG_LINK.

SG_TLINK_TAG - тэги записей в SG_TLINK, их функция аналогична описанной для таблицы SG_LINK_TAG.

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

Лемматизатор

LEMMAS - список лемм - базовые формы слов без повторов.

LEXEMES_1 - упрощенная лемматизация, для каждой словарной формы (поле lexeme) ставится в соответствие лемма (поле id_lemma, ссылается на таблицу LEMMAS) и дается число альтернативных лемматизаций; для работы с несколькими лемматизациями следует использовать таблицу LEXEMES_N. Для каждой словарной формы существует только одна запись в этой таблице, то есть индекс по полю lexeme уникальный.

LEXEMES_N - лемматизация с возможностью приведения к нескольким базовым формам; для словарной формы (поле lexeme) дается соответствующая лемма (поле id_lemma, внешний ключ на LEMMAS). Для некоторых словоформ может быть несколько записей, то есть индекс по полю lexeme не уникальный.

Первичные ключи в таблицах словаря

В реляционных базах данных первичный ключ - это некий признак, уникальный для записей в одной таблице. Уникальность данного приздака позволяет однозначно идентифицировать одну конкретную запись.

К примеру, название части речи - существительное, noun, глагол, verb - может служить таким первичным ключем для таблицы SG_CLASS, которая как раз хранит список частей речи. Разумеется, функционально близкие части речи в разных языках не должны называться одинаково, поэтому в списке есть прилагательное и adjective.

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

Можно почти дальше и предложить использовать в качестве первичного ключа комбинацию из имени словарной статьи и названия части речи, к которой она относится. Таким образом мы обеспечим различение noun:back и adjective:back.

В теории баз данных такие комбинации называют составными (композитными) первичными ключами.

Во многих случаях выделить набор элементарных признаков, обеспечивающих однозначную идентификацию записи в таблице, очень трудно. Посмотрим для примера на грамматические формы - записи в таблице SG_FORM. Многие словарные статьи с непустой парадигмой имеют множество грамматических форм, отражающих склонение существительных и прилагательных, спряжение глаголов, сравнительные формы наречий и так далее. Если Вы посмотрите на поля в упомянутой таблице, то увидите код словарной статьи SG_FORM.ID_ENTRY и номер формы в рамках одной словарной статьи SG_FORM.IFORM. Вместе эти два кода обеспечивают все качества первичного ключа. Такие первичные ключи называются суррогатными в противовес естественным. В случае грамматических форм получаем составной суррогатный ключ.

Большинство таблиц в схеме грамматического словаря имеет простой суррогатный ключ - некое число, обычно генерируемое утилитой экспорта при создании SQL скрипта. И даже в случае, когда можно использовать естественный первичный ключ - например поле SG_LEXEM.NAME - используется суррогатный числовой код SG_LEXEM.ID, так как с числовыми кодами горазно проще работать в прикладном коде, чем с текстовыми строками.

Внешние ключи в таблицах словаря

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

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

Чтобы оформить данное отношение, нужно задать соответствие столбцов в двух связываемых таблицах. В нашем примере используется поле SG_FORM.ID_ENTRY (код словарной статьи, к которой относится форма) и первичный ключ SG_ENTRY.ID. В скриптах SQL словаря объявление внешнего ключа выполняется операторами ALTER TABLE, синтаксис которых более-менее стандартен для всех поддерживаемых СУБД.

Таким образом, внешние ключи в реляционной базе данных играют две роли.

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

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

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

Схема создаваемой базы без тезауруса:

таблицы SQL словаря

Тезаурус - связи между словарными и фразовыми статьями:

тезаурус


Грамматические атрибуты форм словарных статей

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

Таким образом, каждая форма в словарной статье имеет набор грамматических атрибутов, отличающих её от других форм этой статьи. Следует обратить внимание, что допустима ситуация, когда две и более форм статьи имеют одинаковый набор грамматических атрибутов при различном текстовом представлении. К примеру, для наречия быстро сравнительная форма имеет 2 альтернативны быстрее и побыстрее. Таким образом, у двух форм данной статьи будет один и тот же признак - сравнительная степень.

Количество грамматических атрибутов у форм для одной статьи может варьироваться от формы к форме. Это характерно для форм прилагательных и глаголов русского языка. Например, для прилагательного белый сравнительная степень имеет единственный признак (степень=сравнительная), тогда как для обычной степени набор может быть род, число, падеж, одушевленность.

Чтобы дать возможность представлять базовыми средствами языка SQL все разнообразие вариантов описания словарных форм, имеется два подхода.

Первый подход - чисто реляционный.

Он основан на записях в таблице SG_FORM_COORD. Одной форме слова в таблице SG_FORM может соответствовать произвольное множество записей в SG_FORM_COORD, например для форм русского существительного будет по 2 записи - одна для грамматического числа, другая для падежа:

формы слова

Данный подход максимально гибок и требует для использования только реляционных средств БД.

Его недостаток - очень большое количество записей в SG_FORM_COORD для объемных словарей, порой это число достигает нескольких миллионов. Как показывает практика, не все СУБД хорошо справляются с запросами в таких условиях, даже при наличии всех нужных индексов.

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

Он основан на стандартном операторе LIKE и метасимволах % в строковом шаблоне.

При экспорте словаря утилита decompiler для каждой формы формирует строку, состоящей из пар чисел. Строки регистрируются в справочнике COORD_PAIRS без повторов. Каждый грамматический атрибут формы в данной строке представляется как пара из двух чисел - индекса грамматической координаты и индекса состояния. Кроме того, список пар отсортирован в порядке возрастания целочисленного индекса координаты. ID записи в справочнике COORD_PAIRS запоминается в поле SG_FORM.ID_DIMS.

К примеру, падеж имеет в таблице SG_COORD свое объявление с ID=23 (значение может меняться в разных версиях). Именительный падеж - это запись в таблице SG_STATE с id_coord=23 и индексом состояния id=0. Таким образом пара чисел 23:0 однозначно соответствует именительному падежу. Аналогично, единственное число представляется как пара чисел 10:0. Вместе эти две пары дают грамматические атрибуты для формы русского существительного, причем записанная в COORD_PAIRS строка имеет вид ' 10:0 23:0 ', то есть на концах дополнена пробелами. Чтобы отыскать все формы нужного слова в единственном числе, надо указать в условии WHERE ключ словарной статьи id_entry и использовать фильтрацию по маске COORD_PAIRS.dims like '%10:0%'.

Учитывая особенности каждого из подходов, можно дать такие рекомендации.

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

Если форма уже найдена, то есть известен ее первичный ключ, то связанные с ней записи в SG_FORM_COORD помогут определить её грамматические признаки реляционными средствами, без разбора строки в COORD_PAIRS.DIMS.

Поле COORD_PAIRS.STR_DIMS аналогично по своему назначению полю dims, но вместо числовых значений хранит имена координат и состояний, например 'ПАДЕЖ:ТВОР ЧИСЛО:ИМ'. Назначение этого поля - ускорить экспорт словаря из БД в текстовую форму утилитой sql2sol. Если в SG_FORM.ID_DIMS хранится null, то sql2sol будет собирать строку по связанным записям в SG_FORM_COORD. Инициализация данного поля для каждой грамматической формы ложится на Редактор Словаря при записи новой словарной статьи и на decompiler при первоначальном экспорте словаря из бинарного формата в SQL скрипт.

Особое внимание следует уделять правильному обновлению информации в редакторах словаря - редактор должен корректно создавать как записи в SG_FORM_COORD, так и собирать строку для COORD_PAIRS.DIMS и COORD_PAIRS.STR_DIMS. Именно так работает программа SQLex.

Примеры запросов к словарю

Грамматические формы слов

Получение словоформ с отметками о падеже и числе для нескольких словарных статей:

SELECT sg_form.iform, sg_lexem.name, c_case.name, s_case.name, c_number.name, s_number.name
FROM sg_entry, sg_form, SG_LEXEM, sg_coord as c_case, sg_state s_case, sg_coord as c_number, sg_state s_number, sg_form_coord c1, sg_form_coord c2
WHERE sg_entry.name in ( 'ЯБЛОКО', 'ЯГНЕНОК', 'ЯРМАРКА' ) AND sg_form.id_entry=sg_entry.id AND sg_lexem.id=sg_form.id_lexem
AND c_case.name='ПАДЕЖ' and c1.id_entry=sg_entry.id AND c1.iform=sg_form.iform and c1.icoord=c_case.id and
s_case.id_coord=c_case.id AND s_case.id=c1.istate
AND c_number.name='ЧИСЛО' and c2.id_entry=sg_entry.id AND c2.iform=sg_form.iform and c2.icoord=c_number.id and
s_number.id_coord=c_number.id AND s_number.id=c2.istate

В результате будет получено примерна такая выборка:

SQL лексикон

В настольной программе Грамматический Словарь Русского Языка вы можете увидеть вывод всех грамматических форм каждого слова для всех изменяемых частей речи в форме таблицы склонения и спряжения. С помощью SQL словаря такие же таблицы можно получить набором соответствующих запросов к словарной базе. Например, получение форм творительного и винительного падежа единственного и множественного числа соответственно для существительного кошка выполняется таким запросом:

-- оба варианта творительного падежа единственного числа
select E.name AS "начальная форма", F.name AS "падежная форма", P.str_pairs
 FROM  sg_class C, sg_entry E, sg_form F, sg_coord CaseAttr, sg_state CaseState, sg_form_coord FC_Case, sg_coord NumberAttr, sg_state NumberState, sg_form_coord FC_Number, coord_pairs P
 WHERE E.name='кошка' AND C.name='СУЩЕСТВИТЕЛЬНОЕ' AND E.id_class=C.id AND F.id_entry=E.id AND
       CaseAttr.name='ПАДЕЖ' AND CaseState.id_coord=CaseAttr.id AND CaseState.name='ТВОР' AND
       FC_Case.id_entry=E.id AND FC_Case.iform=F.iform AND FC_Case.icoord=CaseAttr.id AND FC_Case.istate=CaseState.id AND
       NumberAttr.name='ЧИСЛО' AND NumberState.id_coord=NumberAttr.id AND NumberState.name='ЕД' AND
       FC_Number.id_entry=E.id AND FC_Number.iform=F.iform AND FC_Number.icoord=NumberAttr.id AND FC_Number.istate=NumberState.id AND
       F.id_dims=P.id
union
-- винительный падеж множественного числа
select E.name AS "начальная форма", F.name AS "падежная форма", P.str_pairs
 FROM sg_class C, sg_entry E, sg_form F, sg_coord CaseAttr, sg_state CaseState, sg_form_coord FC_Case, sg_coord NumberAttr, sg_state NumberState, sg_form_coord FC_Number, coord_pairs P
 WHERE E.name='кошка' AND C.name='СУЩЕСТВИТЕЛЬНОЕ' AND E.id_class=C.id AND F.id_entry=E.id AND
       CaseAttr.name='ПАДЕЖ' AND CaseState.id_coord=CaseAttr.id AND CaseState.name='ВИН' AND
       FC_Case.id_entry=E.id AND FC_Case.iform=F.iform AND FC_Case.icoord=CaseAttr.id AND FC_Case.istate=CaseState.id AND
       NumberAttr.name='ЧИСЛО' AND NumberState.id_coord=NumberAttr.id AND NumberState.name='МН' AND
       FC_Number.id_entry=E.id AND FC_Number.iform=F.iform AND FC_Number.icoord=NumberAttr.id AND FC_Number.istate=NumberState.id AND
       F.id_dims=P.id

Результат выполнения этого составного запроса такой:

склонение существительного

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

Спряжение глагола в русском языке также выполняется набором простых запросов, к примеру:

select E.name AS "начальная форма", F.name AS "форма", P.str_pairs
 FROM  sg_class C, sg_entry E, sg_form F, sg_coord CaseAttr, sg_state CaseState, sg_form_coord FC_Case, sg_coord NumberAttr, sg_state NumberState, sg_form_coord FC_Number, coord_pairs P
 WHERE E.name='кошка' AND C.name='СУЩЕСТВИТЕЛЬНОЕ' AND E.id_class=C.id AND F.id_entry=E.id AND
       CaseAttr.name='ПАДЕЖ' AND CaseState.id_coord=CaseAttr.id AND CaseState.name='ТВОР' AND
       FC_Case.id_entry=E.id AND FC_Case.iform=F.iform AND FC_Case.icoord=CaseAttr.id AND FC_Case.istate=CaseState.id AND
       NumberAttr.name='ЧИСЛО' AND NumberState.id_coord=NumberAttr.id AND NumberState.name='ЕД' AND
       FC_Number.id_entry=E.id AND FC_Number.iform=F.iform AND FC_Number.icoord=NumberAttr.id AND FC_Number.istate=NumberState.id AND
       F.id_dims=P.id
union
select E.name AS "инфинитив", F.name AS "форма", P.str_pairs
 FROM sg_class C, sg_entry E, sg_form F, coord_pairs P, sg_entry_coord EC_Aspect, sg_coord AspectAttr, sg_state AspectState
 WHERE C.name='ГЛАГОЛ' AND E.id_class=C.id AND E.name='делать' AND F.id_entry=E.id AND
       F.id_dims=P.id AND
       P.str_pairs LIKE '%ВРЕМЯ:НАСТ%' AND P.str_pairs LIKE '%ЛИЦО:2%' AND P.str_pairs LIKE '%ЧИСЛО:ЕД%' AND
       AspectAttr.name='ВИД' AND AspectState.id_coord=AspectAttr.id AND EC_Aspect.id_entry=E.id AND AspectState.id=EC_Aspect.istate AND EC_Aspect.icoord=AspectAttr.id
union  
select E.name AS "инфинитив", F.name AS "форма", P.str_pairs
 FROM sg_class C, sg_entry E, sg_form F, coord_pairs P, sg_entry_coord EC_Aspect, sg_coord AspectAttr, sg_state AspectState
 WHERE C.name='ГЛАГОЛ' AND E.id_class=C.id AND E.name='делать' AND F.id_entry=E.id AND
       F.id_dims=P.id AND
       P.str_pairs LIKE '%ВРЕМЯ:ПРОШ%' AND P.str_pairs LIKE '%РОД:ЖЕН%' AND P.str_pairs LIKE '%ЧИСЛО:ЕД%' AND
       AspectAttr.name='ВИД' AND AspectState.id_coord=AspectAttr.id AND EC_Aspect.id_entry=E.id AND AspectState.id=EC_Aspect.istate AND EC_Aspect.icoord=AspectAttr.id
union  
select E.name AS "инфинитив", F.name AS "форма", P.str_pairs
 FROM sg_class C, sg_entry E, sg_form F, coord_pairs P, sg_entry_coord EC_Aspect, sg_coord AspectAttr, sg_state AspectState
 WHERE C.name='ГЛАГОЛ' AND E.id_class=C.id AND E.name='делать' AND F.id_entry=E.id AND
       F.id_dims=P.id AND
       P.str_pairs LIKE '%НАКЛОНЕНИЕ:ПОБУД%' AND P.str_pairs LIKE '%ЧИСЛО:ЕД%' AND
       AspectAttr.name='ВИД' AND AspectState.id_coord=AspectAttr.id AND EC_Aspect.id_entry=E.id AND AspectState.id=EC_Aspect.istate AND EC_Aspect.icoord=AspectAttr.id

Этот запрос даст фрагмент парадигмы глагола делать:

спряжение глагола

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

SELECT E.name AS "начальная форма", F.name AS "форма ед.числа муж.рода твор.падежа", P.str_pairs
 FROM  sg_class C, sg_entry E, sg_form F, coord_pairs P
 WHERE C.name='ПРИЛАГАТЕЛЬНОЕ' AND E.id_class=C.id AND E.name='круглый' AND F.id_entry=E.id AND
       F.id_dims=P.id AND
       P.str_pairs LIKE '%СТЕПЕНЬ:АТРИБ%' AND P.str_pairs LIKE '%РОД:МУЖ%' AND P.str_pairs LIKE '%ЧИСЛО:ЕД%' AND P.str_pairs LIKE '%ПАДЕЖ:ТВОР%'
union
select E.name AS "начальная форма", F.name AS "форма ед.числа жен.рода твор.падежа", P.str_pairs
 FROM sg_class C, sg_entry E, sg_form F, coord_pairs P
 WHERE C.name='ПРИЛАГАТЕЛЬНОЕ' AND E.id_class=C.id AND E.name='круглый' AND F.id_entry=E.id AND
       F.id_dims=P.id AND
       P.str_pairs LIKE '%СТЕПЕНЬ:АТРИБ%' AND P.str_pairs LIKE '%РОД:ЖЕН%' AND P.str_pairs LIKE '%ЧИСЛО:ЕД%' AND P.str_pairs LIKE '%ПАДЕЖ:ТВОР%'
union
select E.name AS "начальная форма", F.name AS "форма ед.числа ср.рода твор.падежа", P.str_pairs
 FROM sg_class C, sg_entry E, sg_form F, coord_pairs P
 WHERE C.name='ПРИЛАГАТЕЛЬНОЕ' AND E.id_class=C.id AND E.name='круглый' AND F.id_entry=E.id AND
       F.id_dims=P.id AND
       P.str_pairs LIKE '%СТЕПЕНЬ:АТРИБ%' AND P.str_pairs LIKE '%РОД:СР%' AND P.str_pairs LIKE '%ЧИСЛО:ЕД%' AND P.str_pairs LIKE '%ПАДЕЖ:ТВОР%'
union
select E.name AS "начальная форма", F.name AS "форма мн.числа твор.падежа", P.str_pairs
 FROM sg_class C, sg_entry E, sg_form F, coord_pairs P
 WHERE C.name='ПРИЛАГАТЕЛЬНОЕ' AND E.id_class=C.id AND E.name='круглый' AND F.id_entry=E.id AND
       F.id_dims=P.id AND
       P.str_pairs LIKE '%СТЕПЕНЬ:АТРИБ%' AND P.str_pairs LIKE '%ЧИСЛО:МН%' AND P.str_pairs LIKE '%ПАДЕЖ:ТВОР%'

Этот запрос дает такие результаты:

склонение прилагательного

Тезаурус

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

SELECT e1.name, lc.name, l.name, e2.name
FROM sg_entry e1, sg_entry e2, sg_coord lc, sg_state l, sg_link
WHERE e1.name in ( 'ЯГНЕНОК', 'ЯБЛОКО', 'ЯБЛОНЯ', 'ЯРМАРКА' )
and sg_link.id_entry1=e1.id and e2.id=sg_link.id_entry2 and lc.id=sg_link.icoord and l.id_coord=sg_link.icoord and l.id=sg_link.istate

и получить в результате нечто вроде:

SQL тезаурус

Несовпадающая модальность глаголов в видовых парах

Глаголы в русском языке могут иметь признак модальности - способность присоединять инфинитив, например:

Дракон отправился ломать и крушить.

Общее количество модальных глаголов невелико. Нижеследующий запрос выдаст примерно 210 модальных инфинитивов:

модальные глаголы

Особенность русских глаголов - наличие вида. Для подавляющего большинства глаголов формы совершенного и несовершенного вида образует пары: делать - сделать.

Практически всегда модальность совершенного глагола совпадает с модальностью несовершенного, например глаголы хотеть и захотеть оба модальные и образуют видовую пару. Лишь в единичных случаях это правило нарушается, например:

сговариваться - сговориться (мод)

рисковать - рискнуть (мод)

лежать - лечь (мод)

благоволить - соблаговолить (мод)

Чтобы получить полный список таких пар, необходимо учесть, что:

1. модальность - атрибут словарной статьи, код координаты для него 28 (может изменится в новых версиях). Грамматические атрибуты для словарных статей храняться как записи в SG_ENTRY_COORD.

2. совершенный и несовершенный инфинитивы в парах связаны в тезаурусе, код связи из несовершенного в совершенный вид 37. Связи между словарными статьями описываются как записи в таблице SG_LINK.

3. грамматический класс инфинитива в русском языке имеет код 12 (может измениться в новых версиях).

Вот такой запрос выдаст искомый список:

видовые пары с несовпадающей модальностью

Модальные существительные

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

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

модальные существительные

Всего таких существительных меньше двух десятков:

статья гр. род
шанс МУЖ
умение СР
способность ЖЕН
решение СР
разрешение СР
причина ЖЕН
попытка ЖЕН
повод МУЖ
отказ МУЖ
неумение СР
неспособность ЖЕН
нежелание СР
намерение СР
желание СР
готовность ЖЕН
время СР
возможность ЖЕН
вероятность ЖЕН

Русские одушевленные существительные среднего рода

В русском языке в силу достаточно сложной морфологии есть немало забавных "смысловых аномалий". Среди таких аномалий - одушевленные существительные среднего рода.

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

Вижу большой камень.

Вижу большого кота.

Можно предположить, что все существительные среднего рода являются неодушевленными. Это почти так с несколькими исключениями, которые можно найти с помощью такого запроса:

одушевленные существительные среднего рода

Он выдаст список с дюжиной существительных:

чучело дитя детище трепло дитятко чудовище чудище быдло дите высочество превосходительство сиятельство

Разная статистика для словаря

Рассмотрим пример запроса, выдающий среднюю длину названий словарных статей в зависимости от языка и части речи. В базу данных MS SQL загружен русско-английский словарь. Сам запрос такой:

groupping with rollup

Присмотритесь к последней строке данного запроса. Ключевые слова with rollup заставят сервер расширить выдаваемую статистику, что позволит нам с помощью одного запроса увидеть не только среднюю длину для каждой части речи, но и среднюю длину для всех статей русского и английского языка, а также для обоих языков. Так как части речи (грамматические классы) в Грамматическом Словаре привязаны к языку, то мы используем именно with rollup, так как выполнение with cube ничего нового не даст.

Итак, вот результаты:

средняя длина названия словарной статьи

Как видно, сервер сам выполнил работу, которую в других версиях СУБД нам пришлось бы делать вручную - он вычислил значение агрегатных функций avg и count для некоторых сочетаний сгруппированных столбцов и NULL. В контексте данного типа запросов (с with cube и with rollup) значение NULL имеет необычную семантику - любой.

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

Решение других задач при работе с SQL словарем

Поиск слов

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

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

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

Получение гистограммы распределения слов по частям речи

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

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

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

Лемматизация

Склонение русских существительных

Склонение русских прилагательных и причастий

Спряжение русских глаголов

Работа с тезаурусом

Online демонстрация склонения русских существительных

Результаты склонения:

...

Online демонстрация склонения русских прилагательных

Результаты склонения:

...

Online демонстрация спряжения русских глаголов

Результаты спряжения:

...

Параметры подключения к серверу БД

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

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

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

Работа с SQL словарем

Экспорт словаря из бинарного формата в SQL

Редактор Словаря SQLex

Экспорт словаря из SQL БД в текстовый формат

ORM Persistent Dictionary Library

Работа со словарем с помощью LINQ

Первичные ключи и константы 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 Мб


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



изменено 14-Jul-12