Метод автоматической разметки предложения для этапа синтаксической сегментации

Метод автоматической разметки предложения для этапа синтаксической сегментации

Манушкин Е.С.

МИЭМ, каф. ИТАС

Введение

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

Довольно популярными в этой области являются теории американской школы, основанные в большинстве своем на порождающей теории Н. Хомского. Яркими примерами таких теорий являются расширенные сети переходов (ATN - Augmented Transition Networks [1]) и AGFL (Affix Grammar over Finite Lattices [2]). В таких системах большее число правил гарантирует лучший результат. Однако чем больше правил, тем меньше скорость разбора предложения.

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

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

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

классического подхода к синтаксическому анализу и может быть применен к расширенным сетям переходов (ATN) и к формализму Бэкуса-Наура.

Преобразование БНФ в расширенную сеть переходов

Для начала рассмотрим что представляют собой расширенные сети переходов. Данная нотация является потомком порождающей теории Н. Хомского. Расширенная сеть переходов представляет собой набор конечных автоматов, называемый рекурсивной сетью переходов (recursive transition network [1]). Если представить данные автоматы в виде графов, то в дугах этих графов содержатся терминальные и нетерминальные символы описываемой грамматики. Терминальные символы реализуют проверку текущего слова в тексте, а нетерминальные символы реализуют проверку текста с текущего слова при помощи соответствующего графа. В. Вудс предложил дополнить терминалы и нетерминалы произвольными вычислительными командами, необходимыми, например, для проверки согласования слов и сегментов или формирования дерева зависимостей. Для обхода сети автоматов используется некоторая виртуальная машина, у которой есть указатель на текущее слово предложения, стек и ячейки памяти, которые могут использовать команды и в которых хранится результат разбора предложения.

Для доказательства общности метода автоматической разметки текста был предложен алгоритм преобразования правил БНФ в расширенную сеть переходов. Формат терминалов и нетерминалов сохраняется одинаковым для обоих грамматик. При преобразовании правила БНФ в граф расширенной сети переходов выполняются следующие действия:

• создается стартовый узел графа

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

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

• Полученный граф упрощается за счет совмещения узлов и удаления дублирующихся дуг.

Рассмотрим алгоритм удаления дублирующих дуг для полученного графа. Совместим все конечные узлы таким образом, чтобы в результате граф превратился в транспортную сеть. Обозначим единственный конечный узел транспортной сети как е. Условно алгоритм можно разделить на две части. В первой части алгоритма на каждой итерации рассматриваются две дуги исходящие из одного узла к которым приписаны одинаковые символы. В случае, если обе дуги ведут в узел е, то любую из этих двух дуг следует удалить (рис. 1 а). Если в узел е ведет только одна из двух дуг, то ее нужно удалить, при этом пометить узел, в который ведет другая дуга как конечный (рис. 1 б). Во всех остальных случаях следует совместить узлы, в которые ведут обе дуги и при этом удалить одну из дуг (рис. 1 в). Если хотя бы один из узлов, в которые вели дуги, являлся конечным, то сделать полученный узел конечным.

Рис. 1. Преобразования графа в первой части алгоритма Рассмотрим вторую часть алгоритма. На каждой итерации второй части алгоритма берутся узлы, в которые ведут две и более дуг. Предположим, что п является одним из таких узлов. Рассмотрим пару узлов п1 и п2. Узлы п1 и п2 следует объединить с удалением дублирующихся дуг, если выполняются следующие условия (рис. 2):

• оба узла п1 и п2 либо являются, либо не являются конечными

• все дуги исходящие из узлов п1 и п2 ведут в п

• количество дуг, исходящих из п^ равно количеству дуг, исходящих из п2

• для каждой дуги с1, исходящей из п1, найдется дуга с2, исходящая из п2, такая что символы приписанные с1 и с2 являются одинаковыми.

Рис. 2. Преобразования графа во второй части алгоритма

- 193 -

Необходимые теоретические сведения

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

Далее мы будем говорить, что словоформа w имеет набор атрибутов Aw={a1,a2,...,ak}, где каждый атрибут a представляет собой пару a = <na, va>, в которой na— имя атрибута (например, часть речи, род, число, падеж и т.д.), а va - значение атрибута. Предполагается, что у любой словоформы не бывает двух атрибутов с одинаковыми именами.

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

Любой символ грамматики содержит набор параметров, которые являются, по сути, шаблонами атрибутов описателя. Набор параметров некоторого символа s будем обозначать Ps={p1, p2,..., pk}, где каждый параметрp представляет собой четверку

р=<Пр, Tp, gp, Vp> в которой:

np - имя параметра (например, род, число, падеж и т.д.);

rp - отношение, которое может принимать значение «=», «! =» и «+»;

gp - номер (идентификатор) группы;

vp - значение параметра.

Каждое значение Tp имеет приоритет (в данном определении значения перечислены в порядке уменьшения приоритета). Предполагается, что во множестве Ps не может быть двух параметров с одинаковыми именами.

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

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

и т-ч __и

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

Проход по дуге будет выполнен, если описатель d удовлетворяет символу s. Пусть s - некоторый символ грамматики с набором параметров Ps, а d - некоторый описатель с набором атрибутов Ad. Описатель d удовлетворяет символу s (d~s), если для любого параметра p = <np, Tp, gp, vp> символа s найдется атрибут a = <na, va> описателя d с таким же именем (na = np), и при том:

• если rp= '= ', то Va=Vp;

• если rp= '!= ', то va ф Vp;

• если rp = '+ ', то для каждой пары d'~ s' из стека графа, в которой у символа s' есть параметр p' с тем же именем и номером группы что и у p (то есть p'=<np,rp',gp,vp'>), должно выполняться равенство: va=va', где a'=<np, va> является атрибутом описателя d'.

Как уже говорилось выше, результатом обхода конечного автомата является описатель. Для вычисления атрибутов описателя каждый автомат содержит набор пар вида <g, n>, где g - идентификатор группы, а n - имя атрибута. Набор атрибутов Ad нового описателя d формируется следующим образом. Пусть d'~s пара из стека автомата. Тогда для каждой пары <g, n> данного автомата в Ad попадают такие атрибуты a = <na, va>e Ad , для которых выполняются следующие условия:

1) na = n;

2) найдется такой параметрp = <np,rp,gp,vp> е Ps, что np = na = n и gp= g. Метод автоматической разметки предложения

Для автоматической разметки текстов необходимо вычислять множества FIRST, LAST, FIRST2 и LAST2. В теории компиляторов данные множества определяются для цепочек терминальных и нетерминальных символов в правилах, описывающих грамматику. Элементами этих множеств являлись терминальные символы (в случае FIRST и LAST) либо упорядоченные пары терминальных символов (в случае FIRST2 и LAST2), с которых могут начинаться (FIRST, FIRST2) либо заканчиваться (LAST, LAST2) терминальные цепочки символов, выводимые из правил грамматики.

Расширенная сеть переходов не является КС-грамматикой в чистом виде. В частности символы грамматики, в которых присутствуют параметры с отношением типа «+», являются зависимыми от других символов графа, внутри которого они записаны. Поэтому нам придется переопределить данные множества для используемой грамматики (новые множества будут помечены штрихами). Рассмотрим алгоритм вычисления множества FIRST'(G) графа G на примере.

Предположим парсер приступил к разбору графа G и курсор парсера установлен на стартовом узле графа. В множество FIRST'(G) помещаются те терминальные символы, которым удовлетворяют всевозможные описатели, с которых парсер может начать разбор графа G, находясь в его стартовом узле. Это значит, что мы можем поместить в данное множество все терминальные символы, которые находятся в дугах, исходящих из стартового узла, без каких-либо изменений.

Предположим теперь, что в одной из таких дуг содержится нетерминал и, который ссылается на граф G', для которого множество FIRST'(G') уже вычислено. В этом случае в FIRST'(G) мы должны поместить терминалы из FIRST'(G') сделав их зависимыми только от символов графа G. Для этого сначала рассмотрим все параметры у каждого терминала из FIRST'(G'), которые не участвуют в формировании разобранного фрагмента текста: те, у которых отношение равно «+», мы отсеем, а остальным (у которых отношение равно «=» либо «!=») присвоим фиктивный номер группы, например 0. Обозначим эту операцию функцией sieve(G', t'), которая возвращает терминал, полученный описанным выше способом, и принимает в качестве аргументов некоторый граф G' и терминал t' графа G'.

Теперь рассмотрим терминал t = sieve(G', t), где t'eFIRST'(G'). Чтобы поместить терминал t в FIRST'(G) необходимо:

1. убрать из t такие параметры p=<np, rp, gp, vp> у которых gp=0, если у нетерминала u найдется параметр p'=<np', rp, gp, vp> с таким же именем, как у p (np=np);

2. для тех параметров p=<np, rp, gp, vp> у которых gp^0 и у нетерминала u нет параметра с именем np, присвоить gp= 0 если rp=«=» либо rp=«!=»; если rp=« + », то параметр p необходимо убрать из терминала t;

3. у оставшихся параметров p=<np, rp, gp, vp> для которых найдется параметр

p'=<np, rp, gp, vp>> нетерминала u положить gp=gp' и, если отношение rp' имеет

больший приоритет чем rp, то rp=rp' и vp=vp' .

Обозначим эту операцию функцией trail(t, u), которая возвращает терминал, полученный описанным выше способом, и принимает в качестве аргументов некоторый нетерминал u и терминал t. Будем говорить, что для пары t и u функция trail(t, u) неопределенна, если найдутся такие параметрыp=<np, rp, gp, vp> и p'=<np, rp', gp', vp'> соответственно из t и u, которые противоречат друг другу, то есть np= np, rp Ф «+», rp'Ф«+» и

1. rp= rp' и vp Ф vp' , либо

2. rpФ rp' и vp = vp'.

В случае, если для пары t и u функция trail неопределена, мы не можем поместить терминал trail(t, u) в множество FIRST'(G).

Теперь, когда мы описали функции sieve и trail, мы наконец можем дать формальное определение множеству FIRST'(G). Рассмотрим все дуги графа G, исходящие из его начальной вершины. Пусть а - символ, приписанный одной из таких дуг. Тогда:

3. если а является терминалом, то а входит в FIRST'(G);

4. если а является нетерминалом и ссылается на граф G', тогда для каждого терминала t' из FIRST'

Далее определим еще два множества терминальных символов LAST'(G) и ONLY(G), которые необходимы для вычисления множеств FIRST2'(G) и LAST2'(G).

Множество LAST'(G) для графа G определяется аналогично FIRST'(G), только в отличие от FIRST'(G) рассматриваются дуги, ведущие в конечные узлы графа. То есть в множество LAST'(G) помещаются те терминальные символы, которым удовлетворяют всевозможные описатели, на которых парсер мог бы закончить разбор графа G. В множество ONLY(G) помещаются терминалы, которым удовлетворяют всевозможные описатели, с которых парсер может начать и одновременно закончить разбор графа G. В определении ONLY(G) рассматриваются дуги графа G ведущие из стартового узла в любой конечный узел.

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

Теперь определим множество пар терминальных символов FIRST2 '(G), которым удовлетворяют всевозможные пары описателей, с которых парсер может начать разбор некоторого графа G. Рассмотрим все пары дуг c1 и c2 такие, что c1 исходит из начальной вершины, а c2 исходит из вершины, в которую ведет первая дуга. Пусть а1 и а2 - символы, приписанные соответственно дугам c1 и c2. Пусть x'eONLY(а) и x"eFIRST'(a) Положим t' = x', если а1 - терминал и t' = trail(sieve(G', x'), а1), если а1

— нетерминал и G' - граф, на который ссылается aj. Аналогично t" = x", если а2 терминал и

t'' = trail(sieve(G'', x''), a2) , если a2 — нетерминал. Тогда в FIRST2'(G) входят такие пары терминалов ab, что

1. в множество параметров a и b входят соответственно все параметры терминалов t' и t'', у которых номер группы равен 0;

2. в множество параметров a входят такие параметры p'=<np>, rp', gp40, vp>> терминала t', для которых в t" найдется параметр p"=<np«, rp«, gp", vp> у которого np=np' и gp' = gp"; если такой параметр не нашелся и rp> ф« + », то в a входят араметры

3. p=<np', rp', 0, vp'> (аналогично для параметров b);

3. Ни один параметр терминала a с группой отличной от нуля не противоречит ни одному параметру b, имеющему ту же группу, и наоборот (см. II).

Аналогично определяется множество LAST2'(G), с той разницей, что cj будет обозначать дугу, ведущую в один из конечных узлов графа G, а c2 - дугу, ведущую в вершину, из которой исходит cj. Символы x' и x" будут браться соответственно из множеств ONLY(aj) и LAST'(a2).

Для выполнения автоматической разметки текста определим множество пар терминальных символов MIDDLE(G), которым удовлетворяют всевозможные пары описателей, которые могут встретиться в середине разбора графа G. Данное множество определяется аналогично множеству FIRST2'(G) со следующими изменениями:

• дуга cj исходит из произвольной вершины графа G;

• положим x'eLAST"(aj) ф0 и x"e FIRST" (a) ф0, где LAST''(aj) и FIRST'' (a2) определяются следующим образом. Если a приписан дуге, которая ведет в узел, из которого исходит хотя бы одна дуга, то FIRST"(a)=FIRST'(a); если a приписан дуге, которая исходит из узла, в который ведет хотя бы одна дуга, то LAST"(a)=LAST'(a). В противном случае множества FIRST"(a) и LAST"(a) определяются аналогично множествам соответственно FIRST'(a) и LAST'(a), с той разницей, что для FIRST''(G) рассматриваются дуги, которые ведут в вершины из которых исходит хотя бы одна дуга, а для LAST"(G) рассматриваются дуги, которые исходят из вершин в каждую из которых ведет хотя бы одна дуга.

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

Рассмотрим соседнее справа слово wi+j. Рассмотрим всевозможные пары описателей d'd", где d' - один из описателей wi, а d'' - один из описателей wi+j. Если пара описателей d'd" удовлетворяет хотя бы одной из пар терминалов из MIDDLE(G) для любого графа G, то набор Nj пуст. В противном случае в Nj помещаются такие графы G, для которых выполняется условие d'~t', d"~t"и t't"eFIRST2'(G).

Для вычисления N2 слова wi рассмотрим соседнее слева слово wi-j. Рассмотрим всевозможные пары описателей d'd", где d' - один из описателей wi, а d" - один из описателей wi-j. Если для любого графа G грамматики выполняется условие d"~t", d'~t' и t"t'eMIDDLE(G), то набор N2 пуст. В противном случае в N2 помещаются такие графы G, для которых выполняется условие d"~t", d'~t' и t''t'eLAST2'(G).

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

• провести расчет множеств FIRST2' LAST2' и MIDDLE для используемой грамматики;

• Во входном предложении для каждого слова вычисляются наборы N1 и N2;

• Каждое слово помечается как начинающее разбор по всем синтаксическим правилам из N1 данного слова и заканчивающее разбор правил по всем правилам из N2.

Заключение

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

В ходе разработки было проведено тестирование метода на грамматиках русского и английского языков, состоящих соответственно из 130 и 550 правил. Грамматики тестировались на русскоязычных и англоязычных корпусах различной длинны (от нескольких сотен до 3200 предложений). Совместно с проведением синтаксической сегментации использовались такие методы ускорения синтаксического анализа, как методы LL(1) грамматик, кэширование, а так же частичное снятие омонимии. Критерием оценки являлась разность количества итераций синтаксического анализатора при анализе предложения без использования и с использованием синтаксической сегментации. За одну итерацию считалось:

• сравнение описателя с терминальным символов;

• спуск по нетерминальному символу;

• окончание разбора правила;

• применение кэша для нетерминала.

В результате тестирования установлено, что среднее ускорение анализа каждого отдельного корпуса составляет порядка 10%, тогда как максимальное ускорение анализа для отдельных предложений превысило 90%. Дальнейшей перспективой развития предложенного метода может стать адаптация разработанного метода для системы AGFL (Affix Grammar over Finite Lattices - грамматика аффиксов).

Литература

1. W. A. Woods. Transition Network Grammars for Natural Language Analysis // Ed. By D.G. Bobrow, Harvard University, Cambridge, Massachusetts, 1970.

2. Cornelis H.A. Koster, Stefan Gradmann. The language belongs to the People! // Proceedings LREC 2004, Lisbon, May 26-28 2004

3. И. М. Ножов. Морфологическая и синтаксическая обработка текста (модели и программы) // internet- публикация диссертации И.М. Ножова «Реализация автоматической синтаксической сегментации русского предложения».

4. Ахо А.В., Сети Р., Ульман Д.Д. Компиляторы: принципы, технологии и инструменты // М.: Вильямс, 2003.