Пометы-ограничения

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

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

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

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

Тип ключевого слова (помета kwtype)

Помета kwtype (тип ключевого слова, keyword type) указывает, что слово (или главное слово многословной сущности), которому соответствует данных (не)терминал, должно быть объектом заданного типа. Значение поля kwtype заполняется названием статьи словаря или ее названием типа статей словаря. Информация о статьях и их типах находится в одном из gzt-словарей.

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

Animal -> Noun<kwtype="животные_центральной_африки">;

У пометы kwtype также существует специальное значение none. Оно означает, что данный символ не может быть объектом соответствующим какой-либо статье. При проверке омонимов слова на соответствие помете kwtype=none, рассматриваются только те объекты, которые определены в правилах данной грамматики. Например, если некоторое слово — это название компании, но описывающая его статья «имя_компании» не упоминается в правилах данной грамматики, то это слово будет считаться простой единицей и удовлетворит ограничению kwtype=none.

Внимание.

Это ограничение работает по-разному для терминала Word и для всех остальных символов. Символ Word<kwtype=none> срабатывает только на словах, у которых для всех омонимов выполняется вышеуказанное условие. Для остальных символов эта помета срабатывает у слов, у которых есть хотя бы один омоним для которого выполняется это условие.

После срабатывания kwtype у символа остается только один из омонимов, для которого есть эта помета. Следовательно, выше в синтаксическом дереве применение к тому же символу еще одного ограничения kwtype с другим значением бессмысленно: ведь к данному символу приписан всего один омоним и правило, которое требует наличия другого омонима, просто не сработает. Этим помета kwtype отличается от пометы kwset.

Примечание.

Использовать помету kwtype у нетерминалов расположенных на высоких уровнях синтаксического дерева не рекомендуется, т.к. это может замедлить работу парсера.

Множество типов ключевых слов (помета kwset)

Ограничение kwset (множество типов ключевых слов, keyword set) выполняет ту же функцию, что и kwtype. Разница между этими ограничениями состоит в том, что kwset применяется ко всем омонимам слова. Во-первых, это означает, что полученный после применения kwset символ может содержать другие омонимы, если есть другие статьи словаря которые также описывают этот символ. Во-вторых в помете kwset можно перечислить сразу несколько названий статей или их типов.

Запись kwset=["статья_1","статья_2",…,"статья_n"] означает, что у слова должен существовать хотя бы один омоним, который описывается одной из перечисленных статей или типов. Запись с отрицанием kwset=~["статья_1","статья_2",…,"статья_n"] означает, что если хотя бы один омоним слова описывается одной из перечисленных статей или типов, то правило не сработает.

Использование символов косая черта / звездочка * в поле пометы kwset аналогично их использованию в поле пометы kwtype.

Грамматические характеристики (помета gram)

Помета gram ограничивает символ допустимыми значениями грамматических характеристик. Например, запись gram="nom,pl" означает, что у слова или у главного слова многословной сущности должны быть граммемы nom (nominative, именительный падеж) и pl (plural, множественное число). В списке граммем можно указывать любые граммемы, в том числе и часть речи, т.е. терминал NOUN можно записать как Word<gram="S">.Список используемых граммем и их значения перечислены в таблице Значения граммем.

Если у слова есть два омонима, то помета gram последовательно проверяет значения грамматических характеристик у каждого из них. Например, у слова «леса» есть омоним с граммемами nom и pl (именительный падеж, множественное число) и омоним с граммемами gen и sg (родительный падеж, единственное число). Это слово будет соответствовать правилу с пометой gram="gen,sg" или с пометой gram="pl", но не будет соответствовать правилу с пометой gram="gen,pl".

Отрицание граммемы в поле пометы gram применяется сразу ко всем омонимам. Например, слово «леса» не удовлетворяет помете gram="~sg" несмотря на то что у него есть омоним множественного числа. В одной помете gram можно указывать одновременно граммемы с отрицанием и без.

Объединение грамматических характеристик (помета GU)

Помета GU (grammar union) предоставляет более широкие возможности использования граммем в грамматиках. В своей самой простой форме GU=["nom,pl"] эта помета аналогична помете gram: она проверяет грамматические характеристики (в примере выше — «именительный падеж множественного числа») у каждого омонима и если находится омоним, удовлетворяющий этому условию, то правило срабатывает.

Граммемы записываются через запятую в квадратных скобках [ ]. Отрицание отдельных граммем в этой записи запрещено. Отрицание ~ перед квадратными скобками означает, что пересечение перечисленных граммем с граммемами каждого омонима пусто, т.е. если интерпретация хотя бы одного омонима подойдет по множество граммем в квадратных скобках, то правило с таким ограничением не сработает.

Пример без отрицания

S -> Noun<GU=[sg,acc], rt>;

Сработает следующим образом:

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

Пример с отрицанием

S -> Noun<GU=~[sg,acc], rt>;

Сработает следующим образом:

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

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

Пример с амперсандом

S -> Noun<GU=&[sg,acc,nom], rt>;

Сработает следующим образом:

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

Кроме того помета GU позволяет записывать дизъюнкцию нескольких таких условий. Через вертикальную черту | («или») можно записать несколько разных списков граммем и правило сработает в том случае, если слово удовлетворяет хотя бы одному из перечисленных условий.

GU=[sg,ins]|&[nom,acc,gen,dat,ins]

В этой записи требуется выполнение одного из следующих условий

  • у нетерминала есть омоним в творительном падеже единственного числа

  • объединение всех граммем нетерминала включает все падежные граммемы (слово не изменяется по падежам)

- стол
+ столом
+ пальто

Согласование в грамматиках

Для проверки совпадения значений одного или нескольких признаков одновременно у двух символов в Томите реализован механизм согласования. Например, согласование по падежу (помета c-agr) в следующем примере сработает на словосочетании «человек и кошка» и не сработает на словосочетании «человеку и кошка»:

A -> Noun<c-agr[1]> 'и' Noun<c-agr[1]>

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

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

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

S -> Adj<gnc-agr[1]> Noun<gnc-agr[1], gram=’им’, sp-agr[2]> Adv Verb<rt, sp-agr[2]>;

+ наша Маша громко плачет
- нашей Маша громко плачет
- наша Маша громко плачут

S -> Adj<gnc-agr[1]> Adj<gnc-agr[2]> Noun<rt,gnc-agr[1],gnc-agr[2] >;

+ новый эстонский премьер-министр
- новые эстонский премьер-министр
- новый эстонская премьер-министр

S -> Participle<gnc-agr[2]> Adj<gnc-agr[1]> Noun<gnc-agr[1], gram=’тв’> Noun<gnc-agr[2], gram=’им’, rt>;

+ обожаемый местным населением напиток
- обожаемая местным населением напиток
- обожаемый местными населением напиток

S -> Noun<~gnc-agr[1], rt> Adj<~gnc-agr[1]>;

+ платформа Северный
- платформа Северная

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

Согласование fem-c-agr

Согласование fem-c-agr — это расширенное согласование gnc-agr, которое допускает рассогласование по роду, если у одного из членов согласования есть граммемы fem и surn. Это согласование введено для женских имен и фамилий, так как они могут употребляться вместе с существительными мужского рода, например поэт Ахматова. Но цепочка поэтесса Маяковский не возьмется.

Согласование after-num-agr

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

S -> Adj<after-num-agr[1]> Noun<after-num-agr[1], rt>;

пять американских президентов
два американских президента

Согласование fio-agr

Согласование fio-agr устанавливается между двумя объектами типа fio. Это согласование создано чтобы уточнить что в одном предложении участвуют ФИО записанные в одном формате. Согласование fio-agr осуществляется по следующим правилам:

  1. Если одно из ФИО состоит только из фамилии, а другое содержит имя или инициал, то проверка неуспешна.

  2. Если оба ФИО содержат инициалы или полные имена, но они по-разному расположены относительно фамилии (слева или справа), то проверка неуспешна.

  3. Во всех остальных случаях согласование успешно.

Регулярные выражения (пометы wfm, wff, wfl)

Символ проверяется на соответствие регулярному выражению, указанному в поле помет wfm, wff и wfl. Помета wfm применяет регулярное выражение к вершине синтаксической группы, соответствующей данному нетерминалу. Пометы wff и wfl, соответственно к первому и последнему слову цепочки. Если символу соответствует одно слово в тексте, то результаты применения к нему этих трех помет эквивалентны.

Разбор регулярного выражения происходит с помощью свободно распространяемой библиотеки Perl Compatible Regular Expressions. Синтаксис регулярных выражений языка Perl описан в документации: perlre. Небольшое, но важное отличие от описанного синтаксиса регулярных выражений состоит в том, препроцессор дополнительно приписывает ко всем выражениям из поля помет wfm, wff и wfl символы начала и конца цепочки ^ и $. На практике это чаще удобно, чем не удобно. В последнем случае, чтобы скорректировать эту особенность достаточно прибавить к регулярному выражению с обеих сторон последовательность «точка-звездочка» .*.

Запись регулярного выражения в кавычках требует дополнительных escape символов по сравнению со стандартным синтаксисом регулярных выражений Perl. Так как обратная косая черта \ уже является escape символом для строк, он должен быть повторен два раза для того чтобы в регулярном выражении возникла одна косая черта. Таким образом, чтобы распознать регулярным выражением сам знак \, в поле wfm необходимо использовать запись «\\\\» (сравните с /\\/ в Perl).

Также можно использовать традиционный формат описания регулярных выражений с двумя косыми чертами / / вместо кавычек " ". Эта форма записи интерпретирует escape символы обычным для Perl образом.

S -> Word<wfm=/[A-Я-]{3,10}>; // только заглавные буквы и дефис длиной от 3 до 10 символов

Помета no_hom

Помета no_hom требует чтобы символ состоял из омонимов с одной частью речи. Например, правило S->Word<no_hom>; сработает на слове стол, но не сработает на слове столовая, т.к. последнее в словаре описано как прилагательное и как существительное.

В случае если символу присвоен «географический» kwtype (т.е. любой kwtype, тип которого начинается с префикса geo_ то помета no_hom проверяет, что все омонимы принадлежат географическим словарям.