Модуль синтаксического анализа

Введение

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

Идеи и алгоритмы, положенные в основу данного модуля описаны в статье Template Search Algorithm for Multiple Syntactic Parses.

Структура грамматики

Синтаксический анализатор поддерживает неограниченное количество файло с грамматикой, указанных в конфигурации в виде массива путей в поле "Grammar". Существует два типа файлов грамматики: файлы с маппингом помет (должны заканчиваться на расширение 'tags') и файлы с продукционными правилами (должны заканчиваться на расширение 'prod').

Маппинг помет предназначен для автоматического приписывания синтаксических помет по морфологическим, если это требуется (например, всем диапазонам с пометой 'Noun' проставить синтаксическую помету 'NP' и т.д.). Маппинг представляет собой простой текстовый файл с TAB-разделителями, где в левой колонке пишутся пометы (одна или несколько через запятую), которые должны присутствовать в теге, чтобы в этот тег были добавлены пометы  (одна или несколько через запятую) из правой колонки.

Файлы с продукционными правилами представляют собой файлы в формате JSON, каждый файл должен начинаться с символа '{' и заканчиваться символом '}', между ними должны находиться пары ключ-значение, где ключём будет являться название правила, а значением - JSON-структура, описывающее данное правило.

ВАЖНО! Названия правил должны быть уникальны в рамках всех файов с продукционными правилами, подключённых к текущей конфигурации!

Формат синтаксических правил

Каждое синтаксическое правило, как было сказано выше, представляет собой пару ключ-значение, где ключём является его уникальное название, а значением - JSON-структуру с тремя обязательными полями:

"Rule_name": {
"head": { },
"subord": { },
"target": { }
}
  • "head" - описывает составляющую, являющуюся вершиной
  • "subord" - описывает составляющую, являющуюся зависимым
  • "target" - описывает продукцию правила и особенности взаимоотношения вершины с зависимым
Каждая из двух составляющих, вершина и зависимое, может быть описана следующим набором полей:
  • "tag" - ограничения на бинарный тег
  • "value" - ограничение на текстовое значение составляющей (в виде регулярного выражения)
  • "root" - ограничение на лемму-вершину составляющей (регистронезависимое)
Все вышеописанные условия применяются между собой с логическим условием 'И', т.е. для срабатывания правила для каждого узла должны быть пройдены все ограничения. Дополнительные функции присутствуют в ограничении на тег:
  • в строке ограничения тега можно указывать несколько тегов с логическим условием 'ИЛИ', разделяя различные варианты тега вертикальной чертой '|'
  • если в теге перед названием пометы поставить восклицательный знак, то данная помета будет учитываться с отрицанием
  • если в теге присутствуют названия категорий, то будет введено ограничение на согласование по этой категории между обеими составляющими
ВАЖНО! При наличии согласования в тегах обеих составляющих для срабватывания правила должны сработать согласования в обоих тегах!

ВАЖНО! Если указаны теги с условием 'ИЛИ', то при проверке применимости правила варианты тегов между двумя составляющими будут сопоставляться по принципе каждый с каждым, правило сработает, если будет найдена хотя бы одна пара тегов, удовлетворяющих ограничениям на пометы своей составляющей и удовлетворяющих ограничению на согласование с противоположной составляющей!

Поле "target" может содержать следующие поля:
  • "copy" - директива наследования бинарного тега от дочерних составляющих, реализуется как JSON-структура с двумя возможными полями "Head" и "Subord", возможно два варианта наследования:
    • полное, в этом случае после двоеточия ставится 'true'
    • частичное явно, в этом случае после двоеточия открывается JSON-массив, в котором перечисляются категории, какоторые необходимо унаследовать от указанной составляющей
  • "tag" - директива, позволяющая добавить в явном виде какие-то пометы в бинарный тег продукционной составляющей или удалить какие-то пометы или категории, унаследованные в режиме "copy" при помощи знака '!' перед пометой или категорией
  • "pos" - указание на линейный порядок вершины и зависимого, возможны следующие значения данного признака:
    • "Left" - зависимое слово находится левее вершины, "стрелка" зависимости будет направлена влево
    • "Right" - зависимое слово находится правее вершины, "стрелка" зависимости будет направлена вправо
    • "Both" - линейный порядок вершины и зависимого не ограничивается
  • "rel" - тип синтаксического отношения, представляет собой бинарный тег с тем же пространством полей и категорий, что и для обозначения текстовых сущностей, можно указать одну или несколько помет через запятую, автоматически будет добавлена одна из помет "arrowLeft" или "arrowRight" из поля "SystemFields" конфигурационного файла, в зависимости от взаимного расположения вершины и зависимого
Пример правила:

"NP_Adj_Noun": {
"head": {
"tag": "NP,Case",
},
"subord": {
"tag": "AP,sg,Number,Gender|AP,pl,Number",
},
"target": {
"copy": { "Head": True },
"rel": "Attribute",
"pos": "Left",
}
}