Технология построения многовариантных объектно-ориентированных структур текстов

Вид материалаДиссертация

Содержание


Постморфологический анализ
PClass Name = "TextChunk" Action = "! StartPos < EndPos" >
PClass Name = "Lexeme" >
Name = "TPartOfSpeech" Tokens
Name = "WordForm" BaseClasses
PClass Name = "NounWordForm" BaseClasses = "WordForm NounLexeme" >
Name = "Аналитическое будущее" PClass
Node Name = "быть" PClass = "VerbWordForm" />
Name = "Аналитическая сравнительная степень" PClass
Node Name = "superl" PClass = "AdjWordForm" MinCount = "1" MaxCount = "MaxInt" />
Name = "Уточнение категорий имени по предлогу" PClass
Node Name = "Prep" PClass = "Prep" IsContext = "True" />
Синтаксический анализ
Node Name = "Adj" PClass = "AdjWordForm" />
Node Name = "N" PClass = "NounWordForm" />
Node Name = "P" PClass = "PronounWordForm" />
Node Name = "V" PClass = "VerbWordForm" />
Подобный материал:
1   2   3   4   5   6   7   8   9
Построение системы классов и шаблонов

В данном разделе мы опишем основные принципы построения классов и шаблонов в технологии "ТОМАТ". Описание строится от простого к сложному: сначала рассматривается класс простых задач, в которых требуется лишь распознание текстовых конструкций; затем описывается класс задач, связанных с синтаксическим анализом, и наконец, раздел завершает описание подходов к построению системы классов и шаблонов для семантически-ориентированного анализа короткого текста (предложения) в ограниченной предметной области.
      1. ^ Постморфологический анализ

Известно множество компьютерных реализаций моделей морфологии русского языка, например, [Сегалович, Маслов 1998]. Задачей морфологического анализатора является (см. тж. [Егорушкин, Кузнецова 2002]):
  • лемматизация словоформ (то есть определение по словоформе, к какой лексеме она относится: так, для словоформы "зала" морфологический анализатор должен определить, что она может являться либо формой лексемы ЗАЛ, либо формой лексемы ЗАЛА);
  • морфологический анализ словоформ (то есть получение морфологического разбора — одного или нескольких — для произвольной словоформы: так для словоформы "стол" морфологический анализатор должен породить два разбора — "сущ., м.р., неодуш., им. п., ед. ч." и "сущ., м.р., неодуш., вин. п., ед. ч.").

Однако практически во всех компьютерных реализациях морфологии считается, что словоформа — это один сегмент текста, то есть множество символов между пробелами. Более подробно о терминах сегмент, словоформа, лексема можно узнать в работе [Зализняк 1971]. Но известно множество случаев, когда это не так: во многих языках, в том числе русском и других языках "европейского стандарта", существуют так называемые аналитические словоформы, то есть образования, состоящие более чем из одного сегмента и являющиеся формой какой-либо лексемы, например, рус. "буду читать" — форма будущего времени глагола ЧИТАТЬ, "самый большой" — форма превосходной степени прилагательного БОЛЬШОЙ, фр. "se taper" — возвратная форма глагола TAPER, англ. "most beautiful" — форма превосходной степени прилагательного BEAUTIFUL и т.п. Таким образом, чтобы получить качественный и полный морфологический анализ, необходимо иметь стадию постморфологического анализа, которая бы разбирала приведенные выше случаи, недоступные анализаторам, построенным по классическим принципам. Стадию постморфологического анализа можно реализовать с применением технологии "ТОМАТ". Очевидно, что классы, которые будут использоваться, должны соответствовать классам, используемым морфологическими анализаторами. Как правило, эти классы соответствуют частям речи языка, так, для русского языка будут классы Noun, Verb, Pronoun, Adjective, Adverb, Conjunction и другие (пример системы классов для русской морфологии в технологии "ТОМАТ" можно найти в главе, посвященной базовой реализации).

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

Релевантным для лингвистической теории является выделение трех типов объектов, упоминаемых выше: сегмент (текстовая часть), словоформа (употребление слова в языковом выражении) и лексема (элемент словаря языка). Все эти объекты имеют свои свойства, причем эти свойства различной природы — собственно поэтому появилась потребность выделения этих классов. Это различие можно выразить с помощью системы классов технологии "ТОМАТ" следующим образом:

<^ PClass Name = "TextChunk"

Action = "! StartPos < EndPos" >

<Field Name = "Text" DataType = "String" />

<Field Name = "StartPos" DataType = "Integer" />

<Field Name = "EndPos" DataType = "Integer" />

PClass>


Данный фрагмент описывает класс, соответствующий понятию сегмента. Сегмент характеризуется множеством символов (поле Text), началом и концом в тексте (поля StartPos и EndPos). Кроме того, сегмент не может быть нулевой длины и его конец не может быть левее начала — это наблюдение зафиксировано в единственном ограничении класса.

<^ PClass Name = "Lexeme" >

<Field Name = "Text" DataType = "String" />

<Field Name = "PoS" DataType = "TPartOfSpeech" />

<Field Name = "Language" DataType = "TLanguage" />

...

PClass>


Данный класс задает понятие лексемы. Лексема — это элемент словаря некоторого языка (поле Language), принадлежащий некоторой части речи (поле PoS). Обратим внимание на тип поля PoS — название домена. Можно было бы сделать это поле типом строка, однако в таком случае не было бы гарантии, что в это поле не будет занесено неверное значение. Домен TPartOfSpeech можно описать, например, следующим образом:

<Domain ^ Name = "TPartOfSpeech" Tokens = "noun verb adj adv ..." />


Кроме указания на язык и часть речи, лексема, как правило, характеризуется набором словоклассифицирующих категорий [Зализняк 1971]. Однако для каждой части речи этот набор будет своим, так, категория рода входит в разряд словоклассифицирующих для существительного, но является словоизменительной для прилагательного. Чтобы представить наборы словоклассифицирующих частей речи для различных частей речи в технологии "ТОМАТ", нужно воспользоваться возможностью наследования классов. Таким образом, для каждой части речи необходимо создать свой класс, унаследованный от класса Lexeme, и перечислить в нем все словоклассифицирующие категории данной части речи как поля этого класса. Так в описании появятся классы NounLexeme, VerbLexeme и т.п.

Теперь необходимо описать понятие словоформы. Как уже упоминалось, словоформа — это конкретное употребление лексемы в тексте. Из этого определения следует, что словоформа обладает как свойствами сегмента (употребление в тексте), так и свойствами лексемы. Чтобы выразить это отношение, необходимо воспользоваться множественным наследованием, то есть унаследовать класс WordForm от классов TextChunk и Lexeme:

<PClass ^ Name = "WordForm" BaseClasses = "TextChunk Lexeme" >

...


Таким образом, объект данного класса будет содержать поля как класса, соответствующего сегменту, так и класса, соответствующего лексеме. Однако помимо унаследованных свойств, словоформы обладают рядом уникальных свойств — содержат словоизменительные характеристики слова (например, число, падеж — для имен, время, лица — для глагола и т.п.) [Зализняк 1971]. Это набор характеристик опять же зависит от части речи. Следовательно, в систему классов нужно ввести класс для каждой части речи, унаследованный от WordForm и соответствующего класса лексемы. Например, для словоформы существительного это будет класс:

<^ PClass Name = "NounWordForm" BaseClasses = "WordForm NounLexeme" >

<Field Name = "Case" DataType = "TCase" />

<Field Name = "Number" DataType = "TNumber" />

...

PClass>


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

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

Словоформа будущего времени состоит из двух частей: изменяемой формы глагола быть в будущем времени и инфинитива. Словоизменительные характеристики наследуются от глагола быть, а словоклассифицирующие — от инфинитива смыслового глагола. Таким образом, в классе VerbWordForm нужно добавить следующий шаблон:

<Pattern ^ Name = "Аналитическое будущее" PClass = "VerbWordForm"

Action = "

! быть.Text = "быть" and быть.Tense = fut and inf.Aspect = несовершенный;

PoS := verb; { порождаем словоформу глагола }

Aspect := inf.Aspect;

{ значения других словоклассифицирующих категорий наследуем от узла inf }

Tense := быть.Fut;

Number := быть.Number;

Person := быть.Person;

{ значения других словоизменительныъ категорий наследуем от узла быть }

" >


<^ Node Name = "быть" PClass = "VerbWordForm" />

<Node Name = "inf" PClass = "InfWordForm" />


Pattern>


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

Анализ форм превосходной степени сложнее предыдущего примера тем, что перед прилагательным может встречаться несколько модификаторов "самый", например "самый самый умный". Для такого рода случаев в технологии "ТОМАТ" есть понятие множественного узла шаблона. Множественный узел — это узел, задаваемый в шаблоне один раз, но соответствий в тексте которому может быть найдено несколько. Для множественного узла нужно задать минимальное и максимальное число вхождений. Кроме того, обе части, составляющие превосходную степень, должны согласовываться по словоизменительным категориям, то есть форма "самого большой" является неправильной. Таким образом, шаблон, анализирующий аналитические формы превосходной степени может быть задан следующим образом:

<Pattern ^ Name = "Аналитическая сравнительная степень" PClass = "AdjWordForm"

Action = "

! superl.Text = "самый" and superl.Case = adj.Case and superl.Number = adj.Number and

superl.Gender = adj.Gender;

PoS := adj; { порождаем словоформу прилагательного }

SuperL := True;

{ значения остальных категорий наследуем от узла adj }

Case := adj.Case;

...

" >

<^ Node Name = "superl" PClass = "AdjWordForm" MinCount = "1" MaxCount = "MaxInt" />

<Node Name = "adj" PClass = "AdjWordForm" />

Pattern>


И, наконец, третий тип аналитических форм — составные служебные слова, например, "так как", "несмотря на" и т.п. К этапу синтаксического анализа они должны быть представлены одним узлом. Это легко сделать, задав для каждого такого сочетания шаблон в соответствующем классе:

<Pattern Name = "Составные союзы" PClass = "Conj"

Action = "

! (Word1.Text = 'так' and Word.Text = 'как') or

(Word1.Text = 'потому' and Word.Text = 'что') or

... {другие сочетания, образующие сложные предлоги};

Text := Word1.Text + ' ' + Word2.Text;

" >

<Node Name = "Word1" PClass = "WordForm" />

<Node Name = "Word2" PClass = "WordForm" />

Pattern>


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

для кенгуру


ДЛЯ предл. КЕНГУРУ сущ., одуш., м.р., им.п. ед.ч.

ДЛИТЬ гл., нсв., дееприч. КЕНГУРУ сущ., одуш., м.р., вин.п. ед.ч.

КЕНГУРУ сущ., одуш., м.р., род.п. ед.ч.

...


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

для кенгуру


ДЛЯ предл. КЕНГУРУ сущ., одуш., м.р., род.п. ед.ч.


Приведенные разборы слова "кенгуру" иллюстрируют внутричастеречную омонимию, разборы же слова "для" демонстрируют межчастеречную омонимию — в этом случае морфологическим анализатором строятся объекты, принадлежащие разным классам. Желательно, чтобы локальная морфологическая неоднозначность (неоднозначность, которую можно разрешить на основе морфологического контекста) не попадала на этап синтаксического анализа, поскольку это приводит к понижению быстродействия благодаря необходимости строить множество неправильных деревьев. Данную неоднозначность можно разрешать на этапе постморфологического анализа (в некоторых системах этап, занимающийся разрешением локальной неоднозначности, называют предсинтаксическим). Задача разрешения локальной морфологической омонимии легко решаема в рамках технологии "ТОМАТ". Для этого нужно выделить множество шаблонов, соответствующих различным моделям разрешения омонимии. Для внутричастеречной омонимии такого рода шаблонами могут быть следующие

    сочетания существительного с предлогом (предлоги, как правило, управляют конкретными падежами, следовательно, по предлогу можно уточнить число и падеж существительного),

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

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

<Pattern ^ Name = "Уточнение категорий имени по предлогу" PClass = "NounWordForm"

Action = "

{ проверяем условия }

! Adj.Case = Noun.Case;

! Adj.Number = Noun.Number;

! Adj.Gender = Noun.Gender;

! Prep.GovCase = Noun.Case;


{ выполняем присваивания }

{1) все свойства имени наследуем от узла Noun }

Text := Noun.Text;

Gender := Noun.Gernder;

...

{2) уточняем падеж имени по падежу, которым может управлять предлог }

Case := Noun.Case & Prep.GovCase;

" >

<^ Node Name = "Prep" PClass = "Prep" IsContext = "True" />

<Node Name = "Adj" PClass = "AdjWordForm" MinCount = "0" MaxCount = "MaxInt" IsContext = "True" />

<Node Name = "Noun" PClass = "NounWordForm" />

Pattern>


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

Более интересными и более сложными будут шаблоны для разрешения межчастеречной омонимии. С полным списком такого рода омонимии в русском языке, а также перечнем моделей ее разрешения можно ознакомиться в работе [Кобзарева, Афанасьев 2002].
      1. ^ Синтаксический анализ

Рассмотрим задачу синтаксического анализа. Будем считать, что текст уже прошел этапы морфологической, постморфологической (аналитические словоформы) и предсинтаксической (разрешение локальной морфологической омонимии) обработки. Задачей синтаксического анализа в нашем примере будем считать построение синтаксической структуры в рамках ранних версий теории генеративного синтаксиса [Хомский 1962]. Рассмотрим правила порождения глагольных групп русского языка:

VP -> V NP

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

глагол является переходным


VP -> V

глагол является непереходным


NP -> Adj NP

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


NP -> N

NP -> Pron


Разработаем систему классов и шаблонов для построения синтаксических структур в рамках данного фрагмента описания. Прежде всего опишем объекты, используемые в синтаксическом описании. Это объекты, соответствующие понятиям Именная Группа и Глагольная Группа. Именная группа характеризуется категориями:
  • падеж,
  • число,
  • род,
  • лицо.

Глагольная группа характеризуется категориями:
  • лицо,
  • число,
  • род,
  • время,
  • транзитивность.

Видно, что все эти свойства сильно пересекаются с категориями Имени Существительного и Глагола соответственно. Возникает вопрос, как соотносятся свойства этих объектов. Первый вариант — это унаследовать класс NounPhrase от класса имени (NounWordForm), выразив тем самым обобщение, что именная группа является частным случаем имени. Правда в таком случае придется добавить в класс NounPhrase свойство Person. Чтобы избежать этого, можно также унаследовать класс NounPhrase также и от класса местоимения (PronounWordForm). Неприятным следствием наследования от двух классов является то, что класс NounPhrase будет содержать две копии полей Число и Падеж (поскольку эти поля введены в обоих наших классах NounWordForm и PronounWordForm и, следовательно, являются независимыми).

Следует отметить, что правила порождающей грамматики вида

NP -> N

NP -> Pron


гласят, что именная группа является не частным случаем соответственно имени или местоимения, а может состоять как из имени, так и из местоимения. Поэтому идея наследовать класс NounPhrase от классов, представляющих словоформы имени и местоимения, неадекватна в нашем случае. Итак, мы отказались от наследования синтаксических классов от морфологических классов. Однако все же как-то хочется отразить обобщение, что синтаксические свойства и морфологические свойства одной природы, то есть, что свойство Падеж именной группы и словоформы имени — это одно и то же свойство, а не два разных. Это обобщение можно выразить следующим образом: нужно ввести множество классов, содержащих базовые именные, местоименные, глагольные и другие свойства, а затем от этих классов унаследовать соответственно морфологические и синтаксические классы. Так класс Словоформа Имени будет унаследован только от класса Именные Свойства, тогда как класс Именная Группа будет унаследован от класса Местоименные Свойства и от класса Именные Свойства.

Теперь разработаем шаблоны, реализующие правила порождающей грамматики:

<Pattern Name = "NP__Adj_NP" PClass = "NounPhrase"

Action = "

{ проверяем условия }

! Adj.Case = NP.Case;

! Adj.Number = NP.Number;

! Adj.Gender = NP.Gender;


{ выполняем присваивания }

Text := Adj.Text + ' ' + NP.Text;

Gender := Adj.Gender & NP.Gernder;

Case := Adj.Case & NP.Case;

Number := Adj.Number & NP.Number;

Person := NP.Person;

...

" >


<^ Node Name = "Adj" PClass = "AdjWordForm" />

<Node Name = "NP" PClass = "NounPhrase" />

Pattern>


<Pattern Name = "NP__N" PClass = "NounPhrase"

Action = "

{ выполняем присваивания }

Text := N.Text;

Gender := N.Gender;

Case := N.Case;

Number := N.Number;

Person := pers3;

...

" >


<^ Node Name = "N" PClass = "NounWordForm" />

Pattern>


<Pattern Name = "NP__P" PClass = "NounPhrase"

Action = "

{ выполняем присваивания }

Text := P.Text;

Gender := TGender[*];

Case := P.Case;

Number := P.Number;

Person := P.Person;

...

" >


<^ Node Name = "P" PClass = "PronounWordForm" />

Pattern>


В шаблоне NP__P инструкция Gender := TGender[*] присваивает полю Род полностью недоопределенное значение. Действительно, местоимения могут соответствовать референту всех трех родов.

<Pattern Name = "NP__V_NP" PClass = "VerbPhrase"

Action = "

{ проверяем условия }

! NP.Case = acc;

! V.Transitive = True;


{ выполняем присваивания }

Text := V.Text + ' ' + NP.Text;

Person := V.Person;

Number := V.Number;

Gender := V.Gender;

Tense := V.Tense;

Transitive := True;

...

" >


<^ Node Name = "V" PClass = "VerbWordForm" />

<Node Name = "NP" PClass = "NounPhrase" />

Pattern>


<