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

Введение

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

Автозамена символов входного потока

Данная опиця предназначена для замены различных вариаций символов на их единый вариант представления. Для русского языка, в некоторых случаях, возможно будет целесообразным замена заглавной и строчной буквы 'ё' на букуву 'е', или замена разнообразных кавычек на кавычки одного вида. Файл с таблицей автозамены указывается в конфигурации в поле "Replace" и представляет собой текстовый файл с TAB-разделителями следующего формата:

<cur><tab><new>
  • <tab> - TAB-разделитель (символ '\t')
  • <cur> - символ из потока, который нужно заменить
  • <new> - сивмол, на который нужно произвести замену
Символы можно указывать в двух форматах:
  • в явном виде (строка из одного символа)
  • в формате U+xxxx, где хххх - это шестнадцатиричный юникодный код символа
ВАЖНО! Автозамена символов производится на самом начальном этапе, поэтому все лингвистические сущности, извлечённые из текста, будут содержать заменённые варианты символов!

Деление входного потока

Алгоритм деления входного потока на типизированные диапазоны достаточно примитивен и не имеет большого числа настроек (см. п. "SystemFields" в разделе "Конфигурация"). Фактически, единственным параметром, которым может управлять пользователь является поле "OmitSpaces" в конфигурационном файле, которое может принимать значения 'true' и 'false' (значение по умолчанию). Если параметр указан со значением 'true', то извлечённые пробельные символы будут отбрасываться, а контактность двух диапазонов необходимо определять при помощи следующего выражения:

leftSpan.getEndPos() == rightSpan.getAnchor()

Функция getAnchor() возвращает начальную позицию пробельного диапазона, стоящего перед диапазоном, для которого вызывается метод, в случае если "OmitSpaces" равен 'false' или перед текущим диапазоном не стоит пробельный диапазон, getAnchor() будет всегда возвращать то же значение, что и метод getStartPos().

Извлечение мультивордов

Под мультивородом понимается последовательность из нескольких подряд идущих диапазонов, которые образуют единую сущность.

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

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

ВАЖНО! Регулярные выражения должны быть составлены таким образом, чтобы обеспечить совпадение диапазона с первого символа первого диапазона, до последнего символа последнего диапазона, частичные совпадения извлечены не будут!

Теггирование единичных диапазонов

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

Формат словарей для регулярных выражений

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

ВАЖНО! Поддержка регулярных выражений в данном модуле реализована при помощи библиотеки dk.brics.automaton, спецификация регулярных выражений в которой отличается от традиционных регулярных выражений Perl/Java, пожалуйста, ознакомьтесь с документацией!

Морфологический анализ

Морфологический анализ состоит в поиске по словарю символьных диапазонов. В текущей версии все входные словоформы для поиске в словаре приводятся к верхнему регистру, поэтому морфологический анализ не является чувствительным к регистру, а исходный файл морфологического словаря должен содержать словоформы только в верхнем регистре. Путь к скомпилированному файлу морфолгического словаря указывается в конфигурации в поле "MorphDictionary". Реализация конечного автомата полностью повторяет описанную в статье Incremental Construction of Minimal Acyclic Finite State Automata and Transducers, а формат исходника словаря для компиляции описан в соответствующем пункте в разделе "Быстрый старт".

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

Морфологический синтез

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

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

Теггирование по лемме

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

Теггирование несловарных слов

На настоящий момент предсказание реализовано весьма рудиментарно и включает в себя два алгоритма:
  • с использованием словаря приставок
  • с использованием словарей регулярных выражений
Предсказание с использованием словаря приставок реализовано следующим образом. Если словоформа не найдена в словаре, то алгоритм пытается найти в словаре приставо такую приставку, с которой бы начиналось слово, после чего повторяется поиск в морфологическом словаре уже без приставки. Если слово без приставки в словаре найдено, то в качестве грамматических помет берутся пометы найденного слова, а в качестве леммы - лемма найденного слова, к началу которой прибавляется отброшенная до этого приставка. Приставки указываются заглавными буквами в текстовом файле, по одной на каждой строчке, в конфигурации данный файл прописывается в поле "Prefixes".

В случае неудачи предыдущего алгоритма используется алгоритм с использованием регулярных выражений. Файлы регулярных выражений записываются в виде массива путей в конфигурации в поле "Unknown", каждый файл представляет собой текстовый файл с TAB-разделителями следующего формата:

<regex><tab><tag>[<tab><json>]
  • <tab> - TAB-разделитель (символ '\t')
  • <regex> - регулярное выражение, которому должен соответствовать символьный диапазон
  • <tag> - набор помет, которые необходимо приписать данному диапазону при совпадени регулярного выражения
  • <json> - строка в формате JSON, описывающая массив JSON-структур, где каждая структура соответствует одной морфологической интерпретации, в которой могут быть указаны следующие поля:
    • "tag" - набор индивидуальных грамматических помет
    • "lemma" - директива лемматизации, которая представляет собой строку, в которой при помощи java.util.Formatter будет произведена подстановка указанной группы из регулярного выражения, для проверки на соответствие диапазона
Пример записи в словаре для регулярных выражений:

([А-Я|Ё][а-я|ё]+(ск|цк))им WPossibleSecondName [ { "tag": "mas,dat,sg", "lemma": "%2$sий" }, { "tag": "dat,pl", "lemma": "%2$sий" } ]

ВАЖНО! В силу того, что библиотека dk.brics.automaton не поддерживает группы, в данном модуле используются регулярные выражения Java!