Автоматическая генерация правил для системы, использующей
грамматический подход к синтаксическому анализу
Дроздов В.В., Москва, Россия Московский Государственный Институт Электроники и Математики
Синтаксический анализ
Синтаксический анализ текста и его правильность играют непоследнюю роль в задаче моделирования и понимания естественных языков. Современные системы, проводящие синтаксический анализ, можно разделить на два класса: статистические и грамматические. В основу статистических систем положены вероятностные
характеристики встречаемости и сочетаемости различных частей речи, собранные в специальных хранилищах. Грамматическая технология основана на применении правил (алгоритмов), когда программа анализирует текст и на основе проведенного анализа синтезирует вариант перевода. Работа такой системы сходна с процессом мышления человека: система анализирует текст, используя множество алгоритмов. Обе технологии имеют свои плюсы и минусы. Грамматические модели, в отличие от вероятностных, требуют большего внимания при построении, и их автоматическое обучение представляется невозможным (за редким исключением). Однако, даже
экспериментальные модели, состоящие из заведомо неполного свода правил,
показывают результаты, сравнимые с самыми современными стохастическими подходами.[1] В этом можно убедиться на примере сравнения перевода предложений с английского на русский сервисом Google Translate (стохастический подход к синтаксическому анализу) и Systran с PROMPT (грамматический подход).
[2] При этом одной из основных причин, сдерживающих развитие систем, использующих грамматический синтаксический анализ, является сложность в сопровождении грамматики, в частности, добавление новых правил. В этих условиях задача создания системы автоматической генерации правил для грамматических моделей приобретает особую актуальность.
Алгоритм грамматического разбора и формат правил в системе машинного перевода «Кросслейтор»
Система машинного перевода «Кросслейтор» является представителем
и т-ч и
грамматической технологии синтаксического анализа. В этой системе правила
синтаксического анализа и синтеза записываются в модифицированных Бэкусовских нормальных формах. На вход алгоритма разбора системы поступает цепочка структур. Каждая структура хранит набор морфологических омонимов слов предложения. Разбор осуществляется слева направо по правилам рекурсивного спуска.
Правила разбора хранятся в отдельной базе. Для базы определяется набор правил, являющихся входными (те правила, с которых начинается рекурсивный спуск). Правила записываются в виде модифицированной Бэкусовской нормальной формы.
Формат правил следующий.
<имя правила>::= <случай> | <случай>”|”<имя правила>
<случай>::= <символ>|<символ><случай>
<символ>::= “[“<id>”:” <id_parent>”;” <part>”;” <params>”]”
+”<node_name>“+” | “{“<id>”:” <id_parent>”;” “ ‘ ” <inf> “ ‘: ” <part>”;”<params>”} +”<node_name>“+” | “<” <id>”:” <id_parent> ”;” <name_rule> ”;” <params>”>” <params>::= <param> | <param><params>
<param>::= <name_param> <id> <vl>
<vl>::= “+” | “#” <value> | “-“ <value> | <value>
Здесь part - название части речи, inf - нормальная форма слова, name_rule -имя правила, node_name - роль слова в предложении для образуемой вершины, id -идентификатор вершины, id_parent - идентификатор вершины-родителя (при отсутствии принимает пустое значение), name_param - название параметра, value -значение параметра.
• Если параметр включает символ “+”, то его значение должно совпадать с уже имеющимся запомненным параметром, имеющим то же название и идентификатор.
• Если параметр включает символ “-”, то его значение не должно совпадать с уже имеющимся запомненным параметром, имеющим то же название и идентификатор.
• Если параметр включает символ “#”, то данный параметр должен быть создан заново, при этом его значение должно совпадать с уже имеющимся запомненным параметром, имеющим то же название и идентификатор (если такой присутствует).
• Если значение параметра дается сразу после его идентификатора, то это означает, что значение данного параметра у слова должно совпадать с указанным, а также с уже сохраненным.
Каждое правило может включать в себя несколько случаев. Случаи включают в себя терминальные и нетерминальные символы. Нетерминальные символы порождают переход к новому правилу. Терминальные символы делятся на символ проверки нормальной формы и символ проверки части речи.
Символы, ограниченные знаками <> означают нетерминальные символы, ограниченные знаками {} - терминальные символы проверки нормальной формы, ограниченные [] - символы проверки части речи.
Результатом разбора правила является успех или неуспех. Неуспех означает, что применить данное правило не удалось. В случае успеха также возвращается набор деревьев и наборы выходных параметров, соответствующих каждому дереву. Количество параметров и их имена для разных наборов должно совпадать.
Рекурсивный спуск осуществляется по следующему алгоритму. Вначале текущая позиция устанавливается на первом (левом) слове предложения. Количество выходных вариантов N приравнивается одному. Далее берется первое входное правило. Из правила выделяется первый случай. Множество запомненных символов обнуляется. Для случая последовательно берутся символы и производится проверка для каждого варианта.
В случае исполнения всех условий символ считается успешно разобранным. В противном случае символ и данный случай считаются не разобранными, и производится переход к следующему случаю.
Если все символы случая разобраны успешно, то из сформированных вершин строится дерево. Разбор правила считается неуспешным, если неуспехом окончился разбор всех случаев. В противном случае правило считается успешно разобранным. Результатом разбора правила является объединение результатов разбора случаев.
После разбора правила осуществляется выход из рекурсивного спуска. При выходе из входного правила его результаты запоминаются и осуществляется разбор для следующего входного правила.
В качестве выходных результатов для алгоритма берется объединение результатов разбора входных правил.
Если предложение разобрать удалось, то и создавать новые правила необходимости нет. Нас будет интересовать случай, когда предложение разобрать, используя имеющиеся в базе правила, не удалось.
Деревья подчинения и деревья разбора, используемые в методе генерации правил 1
Введем некоторые формальные определения. Пусть V - непустое конечное множество, которое мы будем называть словарем (часто употребляется также термин алфавит), а его элементы - элементарными символами. Будем называть цепочкой в словаре V конечную последовательность элементарных символов, т.е. отображение в V некоторого непустого начального отрезка натурального ряда (1,...,п}(п>=1). В математической лингвистике цепочки используются в качестве простейших моделей языковых объектов разных уровней: морф, слов или предложений. Элементарные символы интерпретируются в первом случае как фонемы, во втором - либо как фонемы, либо как морфы, в третьем - чаще всего как слова. Нас будет интересовать только третья интерпретация, так что словарь мы будем понимать как множество всевозможных слов некоторого языка (например, русского). Итак, пусть П (от слова предложение) - непустое конечное множество, на котором определено отношение линейного порядка < (отношение предшествования одного слова другому). Элементы множества П будут называться точками. Если П - конечное линейное упорядоченное множество . То всякое дерево Б, для которого П служит множеством узлов, называется деревом синтаксического подчинения (или просто деревом подчинения) на П. Если П - множество точек некоторой цепочки X, говорят, что Б - дерево (синтаксического) подчинения для X. Рассматривая предложение как цепочку слов, мы можем представить информацию о его синтаксическом строении как набор сведений о «главенствовании» одних точек цепочки над другими. Задать такой набор - значит задать некоторый граф на множестве точек цепочки. То, что этот граф является деревом, есть эмпирический факт: практически всегда, когда изображение структуры предложения в виде набора сведений о главенствовании одних вхождений слова над другими достаточно адекватно, соответствующий граф оказывается деревом. [3]
Приведем пример дерева подчинения.
белое и черное
1 Данный материал излагается на основе [3].
- 86 -
Построение деревьев подчинения для конкретных предложений естественного языка опирается на языковую интуицию, которую, впрочем, трудно ограничить от навыков, усвоенных при изучении грамматики. В сложившейся практике стрелки проводят в соответствии с традиционным, «школьным» представлением о
подчинении одних слов другими, когда это представление достаточно определенно.
[3]
Но структура дерева подчинения, используемого для генерации новых правил, несколько отличается от структуры, предложенной А.В.Гладким. Более детально отличия и причины их появления будут рассмотрены ниже.
Узел D нашего дерева подчинения - это пятерка вида ^,р,г,п,т>, где w - слово в предложении, р - часть речи слова, г - роль слова в предложении, п - порядковый номер слова, от которого зависит текущее (если зависит от вышестоящего по дереву подчинения, то параметр пуст), т - порядковый номер предлога, который относится к текущему слову (используется при согласовании). Информация, хранящаяся в узле дерева D, будет использована нами для построения правила.
После выполнения синтаксического разбора системой «Кросслейтор» нам доступен полный лог разбора, проводившегося системой по правилам для предложения. Лог представляет собою лес, содержащий деревья разбора для каждой из начальных вершин, при этом для каждого начального символа разбора есть дерево с учетом согласования параметров и без учета. Лист дерева разбора Ь - это пара вида <М>, где 1 - номер терминала в П, с которым проходило сравнение, а 8 - результат этого сравнения. Нелистовые узлы дерева разбора могут быть двух типов. Первый тип Н - это четверка <г,р,п,8>, где г - правило, по которому проходил разбор, р -позиция, с которой проходил разбор, п - количество продукций, 8 - успешность разбора по этому правилу. Второй тип нелистового узла Р - это тройка вида <п1,р,8>, где п1-номер продукции в правиле, по которому идет разбор, р - позиция, с которой проходил разбор, 8 - успешность разбора по этой продукции.
Однако при построении дерева подчинения по предложению не всегда возможно указать главное и зависимое слово. Например, для случая предлога и относящегося к нему слова. Как и в книге А.В. Гладкого «Синтаксические структуры естественного языка» в этом случае мы будем считать, что в дереве подчинения предлог должен быть родителем того слова, к которому он относится. Например, построим дерево подчинения для предложения «Мама подошла к открытому окну».
мама
х
подошла
открытому
Введем еще ряд важных особенностей используемого нами дерева.
• Братьями в дереве подчинения могут на данный момент быть только однородные члены предложения, а также союзы и знаки препинания, разделяющие их.
• Если к слову относится частица, то она в дереве подчинения должна быть родителем этого слова.
• Порядок следования потомков одной вершины соответствует порядку слов в предложении.
Например, дерево подчинения для предложения «Человек подошел к синему, а не к красному самолету».
человек
подошел
\
к
самолету
7!\
синему
а
не
Ч
к
красному
Генерация новых правил
Итак, после неудачного разбора предложения у нас есть лес деревьев разбора и дерево подчинения, построенное пользователем для неразобранного предложения П. Требуется найти такое предложение П', все точки которого принадлежат П, которое мы можем разобрать имеющимися у нас в базе правилами. Для этого воспользуемся рекурсивным проходом по дереву подчинения. Проход по дереву и составление потенциального предложения П' начинается с корня дерева и идет в глубину по крайним левым потомкам. Разбор в глубину прекращается при нахождении такого потомка, добавление которого к предложению П' не позволяет разобрать его имеющимися в базе правилами. При проходе в глубину по ветви устанавливаются признаки, что по этим вершинам был осуществлен проход вглубь. Далее осуществляется подъем по дереву до самой верхней вершины, которая еще не участвовала в разборе в ширину (в первом случае - это корень дерева), и отмечаем ее как участвовавшую в проходе в ширину. И начиная с нее, пытаемся собрать предложение с братьями, то есть однородными членами. При этом если вершина не отмечена, как участвовавшая в проходе вглубь, то по ней идет проход в глубину. После прохода в глубину опять возвращаемся наверх, к самой верхней вершине, которая участвовала только в проходе в глубину, и повторяем процедуру до тех пор, пока таким образом не проанализировали все дерево.
Например, для дерева подчинения (см. выше) выбор предложения П' будет проходить так. Предположим, что это предложение разобрать не удалось. Сначала будет выбран корень дерева «человек», разбор этого предложения прошел успешно. Берем потомка для разобранной вершины и получившееся предложение пытаемся разобрать. «Человек подошел» разбирается правилами из нашей базы. Снова берем потомка для последней разобранной вершины. Это предлог «к». Так как предлог относится к какому-то слову всегда, то необходимо взять и потомка для предлога -слово «самолету». При формировании предложения для разбора стараемся учитывать особенности русского языка. Пытаемся разобрать предложение «человек подошел к самолету». Разбор успешен. Берем следующего потомка «синему». Формируем предложение «человек подошел к синему самолету». Порядок слов в формируемом предложении не должен нарушать порядка слов в исходном предложении. То есть, если а,Ь є П и а<Ь, то в П' ^ П соотношение а<Ь должно соблюдаться. Разбор в глубину по первой ветви закончен. Мы должны вернуться наверх к вершине и, найдя
первого брата сверху, выполнить рекурсивно для него операции по формированию предложения. Таким образом, следующим сформированным предложением по этим принципам будет «человек подошел к синему, а не к красному самолету». Это предложение имеющимися у нас в базе правилами разобрать не удастся. В итоге мы нашли искомое П' «Человек подошел к синему самолету».
Помимо того, что у нас есть предложение, которое удается разобрать имеющимися у нас правилами, мы также нашли неразобранные части дерева. Выполнив синтаксический анализ для П', деревом подчинения которого является D', можно получить успешный лес деревьев разбора F‘. Теперь надо выбрать из неразобранных частей дерева ту, для которой мы будем строить правило в первую очередь. Выбор осуществляется на этапе рекурсивного формировании предложения. Приоритет для построения нового правила отдается первой встреченной при рекурсивном проходе в глубину или последней встреченной при рекурсивном проходе в ширину неразобранной ветви, с учетом специфики используемого способа рекурсивного прохода.
Пусть Dм з D - найденное неразобранное поддерево. В дереве подчинения D у нас есть ^' - вершина поддерева D” и R, - успешно разобранная вершина, потомком или братом которой является R”. Для случай однородных может понадобиться создание фиктивной вершины. Например,
человек
подошел
\
В этом случае для узлов «,» , «а», «не» создадим фиктивную вершину, которая и будет R”. В случае на рисунке R” - брат R,.
Следующим шагом для создания правила будет поиск в лесе деревьев разбора предложения П’ листьев, по которым был успешно разобран узел R,, т.е.
L=(t,s)-лист е Б’, такой что t = порядковому номеру R’ в X’ и в s’ установлен флаг успешности разбора.
Найдя эти вершины, мы получаем непустое конечное множество. М={^1,Р1,И1},....,^,РЩ},...., ^п,Рп,Ип}}, где п>=1,
Li - лист дерева разбора е Б’
Р1 - вершина второго типа дерева разбора е Б’
№ - вершина первого типа дерева разбора е Б’
Из этого множества мы можем получить информацию, по какому правилу, по какому номеру продукции, и с какой позиции был успешно разобран узел R’. Правило, по которому был разбор вершины R’, хранится в параметре г вершины типа первого И. Номер продукции в правиле находится в параметре п1 вершины второго типа Р. С помощью этих данных мы однозначно можем найти во множестве правил разбора нашей базы то правило, по которому прошел успешный разбор вершины R’.
Создаваемое нами новое правило будет иметь своим родительским правилом именно его. Имея номер продукции в правиле, возьмем саму продукцию. Она послужит частью нового создаваемого правила, так как вершина, разобранная с помощью этой продукции, является родителем или братом для неразобранной вершины. Если неразобранная вершина R” является потомком для вершины R,, то будут сгенерированы два новых правила. Первое правило будет содержать продукцию, по которой был проведен успешный разбор вершины. Второе правило будет содержать новую сгенерированную продукцию. Так как мы имеем дерево D, в котором заданы такие параметры как часть речи, роль слова, то для генерации большей части продукции информация у нас есть. Но для формирования части продукции, содержащей информацию о параметрах согласования в большинстве случаев, на данный момент, понадобится помощь пользователя. При формировании параметров согласования главного и зависимого слова ему необходимо будет отметить, какие из параметров согласуются, а какие создаются заново. По информации из базы правил пользователю можно предоставить предполагаемый выбор, но окончательное решение этого вопроса пока оставлено за пользователем. Также при создании нового правила следует учесть наличие между главным и зависимым словом предлогов, частиц, знаков препинания, которые не имеют согласования. А, значит, их надо вносить в создаваемое правило, но согласовывать слова по дереву подчинения придется не просто, беря первого потомка, а выбирать потомка для согласования, учитывать его роль в предложении и часть речи. После создания двух новых правил, надо создать и новую продукцию в правиле, по которому была разобрана вершина R,. Возможно возникновение ситуации, когда созданное нами правило уже есть в базе правил разбора, просто не была описана продукция, делающая разбор по нему доступным, потому перед включением новых правил обязательно проверяем эту ситуацию. Если же она возникла, то создаем только новую продукцию и правила, которых в базе еще не было. При создании новых правил, для случая, когда неразобранная вершина R” является братом вершины R,, мы уже имеем правило, описывающее один из однородных. Это связано с тем, что проход при составлении предложения П' осуществляется сначала в глубину. Как и в случае создания правила для потомка, необходимо создать правило для неразобранного однородного. Также необходимо создать правило, описывающее саму структуру однородных членов, включив в него знаки препинания и союзы, если они есть в структуре предложения. Именно название этого правила будет использоваться в сформированной продукции для правила, по которому прошел разбор вершины R,.
Пример генерации нового правила
Приведем пример формирования правила для предложения «человек подошел к синему, а не к красному самолету». П' в данном случае - «человек подошел к синему самолету», R, - «синему», R” - созданная фиктивная вершина, являющаяся родителем для вершин «,» , «а» , «не» и братом для вершины R‘. Номер вершины R, в П' 3 (подсчет идет с 0). Сформируем множество М, состоящее из элементов {Ьі,Рі,Иі}, где у узла Ьі параметр ї равен 3. В нашем случае, на имеющейся базе правил разбора, оно будет состоять из одного элемента, состоящего из 3-х узлов. В узле И параметр г хранит название правила, по которому был разбор вершины R,, а в параметре п1 узла И хранится номер продукции в этом правиле. В итоге из базы данных правил можно однозначно извлечь искомое правило и продукцию. В нашем случае это:
ADJ11|gender 1 a, number 1 a, case 1 a|
[1:;adj;gender1+,number1+,case1 +,comp 1 pos]+property+| [1:;participle;gender 1 +,number 1 +,case 1 +]+property+|
[1:;poss_pron;gender 1 +,number 1 +,case 1 +]+property+
Номер продукции, по которой прошел разбор - О. Сформируем первое правило, содержащее продукцию, по которой была разобрана вершина R’.
GEN130|gender 1 A, number 1 A, case 1 A|
[1:;prep;]+prep+[2:;adj;gender 1 +,number 1 +,case 1 +,comp 1 pos]+property+
К продукции из правила ADJ11 при формировании нового правила была добавлена часть, описывающая наличие предлога перед прилагательным. Далее необходимо создать правило, описывающее неразобранный однородный член. Так как это однородные, то часть речи, роль в предложении, параметры согласования у него будут совпадать с однородным братом. Но необходимо учесть наличие перед ним частицы и предлога, поэтому сформированное правило будет иметь вид: GEN982|gender1A,number1A,case1A|
{1:;'HE':particle;}+nadv+[2:;prep;]+prep+[3:;adj;gender 1 +,number 1 +,case 1 +,comp 1 pos]+property+
Проверим, что таких правил в нашей базе еще нет. В нашем случае их, действительно, нет. Теперь следует создать правило, описывающее структуру однородных членов. Правило будет состоять из названий двух новых сформированных правил, разделенных союзами и знаками препинания в соответствии с деревом подчинения предложения. Оно будет иметь вид:
GEN90|gender 1 A, number 1 A, case 1 A|
<1:;GEN130;gender1+,number1+,case1+>{2:1;',':sign}+sign+{3:2;'A':interj;}+p roperty+<4:3;GEN982;gender 1 +, number 1 +, case 1 +>
Осталось сформировать новую продукцию для правила ADJ11. Новая продукция будет состоять из названия правила, описывающего структуру однородных. Так как описываются однородные, то параметры согласования будут идентичными тем, которые использовались для разбора вершины R’. В итоге, правило ADJ11 примет вид:
ADJ11|gender 1 a, number 1 a, case 1 а|
[1:;adj;gender1+,number1+,case1 +,comp 1 pos]+property+| [1:;participle;gender 1 +,number 1 +,case 1 +]+property+|
[1:;poss_pron;gender 1 +,number 1 +,case 1 +]+property+|
<1:;GEN90;gender 1 +,number 1 +,case 1 +>
Пополненная таким образом база правил разбора позволяет осуществить разбор для исходного предложения П «человек подошел к синему, а не к красному самолету».
Выводы
Созданная система генерации новых правил может пополнять существующую базу правил системы машинного перевода «Кросслейтор», позволяя разбирать предложения, которые с помощью исходной базы правил успешно разобрать не удавалось.
При формировании новых правил возникает ряд довольно сложных проблем, которые сейчас пока находятся на стадии разрешения. Основные из них:
1) Как уже было сказано выше, на данный момент, во многих случаях окончательный выбор параметров согласования остается за пользователем. Эту проблему можно будет решить, взяв статистику по многим деревьям.
2) Свободное построение предложений в русском языке, особенно в художественной литературе. На данный момент удается строить новые правила, в основном, для проективных и слабо проективных предложений. Для непроективных предложений попытка построения новых правил предпринимается, но не всегда успешно.
Список используемой литературы
1) Омонимические неоднозначности при анализе текстов. В.И. Божич, А.В. Тарасенко
2) Обзор методов синтаксического анализа. Мегалинг 2009. В.В. Дроздов
3) Синтаксические структуры естественного языка. А. А. Гладкий