Таблицы формообразования (парадигмы) в лексиконе грамматического словаря

Назначение

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

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

Рассмотрим простейший пример - парадигму английских глаголов, спрягающихся по типу ask-asks-asked-asking. Как нетрудно видеть, все формы получаются добавлением соответствующих окончаний к базовой форме ask. Парадигма выглядит так:

   paradigm Verb_1000 : ENG_VERB
  {
   VERB_FORM:UNDEF NUMBER:SINGLE PERSON { "" "" "%+S" } // ASK ASK ASKS
   VERB_FORM:UNDEF NUMBER:PLURAL { "" } // ASK
   VERB_FORM:ED NUMBER:* { "%+ED" } // ASKED
   VERB_FORM:PP { "%+ED" } // ASKED (for regular verbs same as -ed)
   VERB_FORM:ING { "%+ING" } // ASKING
   VERB_FORM:INF { "" } // ASK
  }

А словарная статья для глагола ask так:

  entry Ask : Eng_Verb { paradigm Verb_1000 }

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

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

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

Алгоритм выбора парадигмы для словарной статьи

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

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

  entry Ask : Eng_Verb { paradigm Verb_1000 }

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

   paradigm АнглГлаголНаY : ENG_VERB for "(.+)Y"
 {
  VERB_FORM:UNDEF NUMBER:SINGLE PERSON { "" "" "%-1%+IES" } // COPY COPY COPIES
  VERB_FORM:UNDEF NUMBER:PLURAL { "" } // COPY
  VERB_FORM:ED NUMBER:* { "%-1%+IED" } // COPIED
  VERB_FORM:PP { "%-1%+IED" } // COPIED
  VERB_FORM:ING { "%+ING" } // COPYING
  VERB_FORM:INF { "" } // COPY
 }
 

  paradigm АнглГлагол : ENG_VERB for "(.+)"
 {
  VERB_FORM:UNDEF NUMBER:SINGLE PERSON { "" "" "%+S" } // ASK ASK ASKS
  VERB_FORM:UNDEF NUMBER:PLURAL { "" } // ASK
  VERB_FORM:ED NUMBER:* { "%+ED" } // ASKED
  VERB_FORM:PP { "%+ED" } // ASKED (for regular verbs same as -ed)
  VERB_FORM:ING { "%+ING" } // ASKING
  VERB_FORM:INF { "" } // ASK
 }

После ключевого слова for идет регулярное выражение. Обратите внимание, что вторая парадигма фактически подходит к любому английскому глаголу - она будет применяться в случае, если не подошла первая парадигма. Так как парадигм с выбором по маске может быть произвольно много, то такой прием позволяет описать одну "стандартную" парадигму (как для глагола to ask) и набор исключений (как, к примеру для глагола to copy).

Парадигмы проверяются в порядке их описания в исходном тексте.

В описании лексикона можно написать так:

    entry ask : Eng_Verb { paradigm auto }
    entry copy : Eng_Verb { paradigm auto }
    entry answer : Eng_Verb { paradigm auto }

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

А если воспользоваться макропроцессором, то можно значительно упростить наполнение лексикона:

    #define Verb(x) entry x : Eng_Verb { paradigm auto }
  Verb(ask)
  Verb(copy)
  Verb(answer)

Название парадигмы

Для парадигмы можно задать удобное название. Это название играет двойную роль.

Во-первых, на название парадигмы ссылается директива paradigm в теле словарной статьи.

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

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

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

paradigm Сущ12Облачко : ...

Управление отдельными формами в парадигме

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

В этом случае можно воспользоваться флагами управления парадигмой. В парадигме для конкретной словоформы после ключевых слов :: flexer указывается маска применения:

  paradigm АнглСущ : ENG_NOUN for "(.+)"
 {
  NOUN_FORM:BASIC NUMBER { "" "%+S" }
  NOUN_FORM:POSSESSIVE NUMBER { "%+'S" "%+S'" } :: flexer "(p)"
 }
 

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

    entry Question : Eng_Noun
  {
   paradigm auto
  }

    entry Author : Eng_Noun
  {
   paradigm auto
   flag flexer "(p)"
  }

Таким образом, только для статьи Author будет сгенерирована притяжательная форма Author's. Как обычно, удобные макросы позволяют упростить объявления в реальной ситуации:

#define noun( Word, HasPossessiveForm=false ) \
 #begin
 entry Word : ENG_NOUN
 {
  paradigm auto

  #if HasPossessiveForm==true
   #begin
   flag flexer "(p)"
   #end
  #endif
 }
#end

    noun(Question)
    noun(Author,true)

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

NOUN_FORM:POSSESSIVE NUMBER { "%+'S" "%+S'" } :: for "(.+)Q"

Другими словами, после ключевых слов ::for идет маска, проверяемая на базовой форме.

Группы символов в маске

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

paradigm УдобноеИмя : aaaa for "(.+)[BCDFGKLMNPQRSTV][AEIOUY]"

Но явное выписывание групп символов не просто слишком рутинная операция, она может привести к труднообнаруживаемым ошибкам.

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

   language English
  {
   ParadigmSubst = { "\\@v" "[aeiou]" }
   ParadigmSubst = { "\\@c" "[bcdfgjklmnpqrstvz]" }
  }
 

Каждой группе символов ставится в соответствие некое условное имя - не встречающаяся в обычных ситуациях комбинация символов. В вышеприведенном примере группа гласных обозначена как \@v (мнемоника от vowels), согласных - \@c (мнемоника от consonants).

Компилятор словаря после чтения маски в парадигме выполняем подстановку объявленных групп символов - то есть фактически раскрывает нормальное регулярное выражение. После этого регулярное выражение приобретает свой обычный вид.

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

Команды образования словоформы

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

Каждая команда начинается с символа процента, после которого идет символ команды и, в некоторых случаях, аргументы.

%-N усекает на N символов справа, как например в делать-делает

%+AB...C справа добавляется строка символов AB...C (произвольной длины), как например в stop-stops

%cN из лексемы вырезается символ, отстоящий на N от правого края, как например в цветок-цветки

%D дублирует последний символ, как в stop-stopped

%aNR в позицию результатной лексемы, начиная с N, вписывается символ R, так что оригинальный символ из позиции N сдвигается в позицию N+1, и так далее; например в сжечь-сожгу

Особенности описания формообразования

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

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

Теперь посмотрим на спряжение глагола двигать. С одной стороны, он спрягается в полном соответствии с моделью делать. Но есть отклонение - ряд словоформ имеют альтернативное написание: двигаем-движем, двигаете-движете и др.

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

Очень похожие случаи есть для английского языка, и связаны они с двумя явлениями - неправильными глаголами и отличием британского и американского вариантов языка. Например, неправильный глагол to learn имеет два варианта образования past participle - как learnt и как learned.

В некоторых случаях отдельные грамматические формы имеют написание, не выводимое из базовой формы. В этом случае единственный вариант - буквально задать написание всех форм в такой словарной статье. Хорошие примеры таких статей существуют и для русского языка (идти-шёл), и для английского (to be-are-is...)

Еще один важный случай, когда невозможно или нерационально задавать правило вывода форм из базовой формы - составные формы. В русском языке такие случаи достаточно редки, в качестве примера можно привести существительное баба-яга. При склонении меняются обе части слова - бабу-ягу, бабой-ягой, ... Устойчивые обороты типа дать дёру-дал дёру-дадим дёру являются аналогом фразовых глаголов английского языка. Фразовые глаголы в английском - это сочетания глагола и послелога, семантика которых не выводится из базового глагола. Например, to go on - продолжать. Фразовые глаголы в английском словаре описываются как отдельные словарные статьи, причем формальное спряжение глагольной части в них полностью соответствует базовому глагола goes on, going on, ... Среди английских существительных также есть любопытные образцы - например, maid of honor-maids of honor, в этом случае каждая форма существительного состоит из 3х лексем.

Примеры в исходных текстах словаря

В исходных текстах словаря в каталоге dictionary.src посмотрите на объявление различных парадигм в нижеперечисленных файлах.

Для русского языка:

глаголы rus_verb_paradigmas.sol

прилагательные и причастия rus_adjectives_paradigmas.sol

существительные rus_nouns_paradigmas.sol

Для английского языка:

существительные eng_noun_paradigmas.sol

глаголы eng_verb_paradigmas.sol

прилагательные eng_adjective_paradigmas.sol

Для японского языка:

прилагательные jap_adj_paradigma.sol

глаголы jap_verb_paradigmas.sol

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

Словарные статьи

Языки

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

Лексикон

Словарь

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

Компилятор словаря

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

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

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

Склонение английских существительных

Описание английских глаголов

  © 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 Мб


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



изменено 16-Aug-11