Эталонный корпус для проверки морфологического и синтаксического анализатора, сегментатора

Задачи и особенности эталонного корпуса русского языка

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

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

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

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

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

Утилита проверки морфологического и синтаксического анализатора

Данная утилита написана на C++. Фактически она представляет из себя пример использования API грамматического словаря. Ее исходный текст вместе с проектом для сборки в Visual Studio входит в состав SDK. Она также собирается под Linux и используется для автоматического тестирования solarix_grammar_engine.so.

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

Кроме тестирования правил морфологического разбора и построения синтаксических деревьев, эта же утилита содержит тест многопоточности.

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

Тесты морфоанализатора для русского, английского и других языков

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

Этот подход справедлив и для утилиты тестирования. Названия частей речи и грамматических категорий она берет из грамматического словаря. Благодаря этому утилита одинаково хорошо проверяет морфологический разбор для любого описанного в словаре языка.

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

Для тестового файла используется кодировка utf-8, с BOM или без.

Формат тестовых паттернов для морфологического анализатора

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

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

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

Команды управления морфологическим и синтаксическим тестом

Строки, начинающиеся с символа #, рассматриваются особым образом. Если после # идет одна из описанных далее команд, то она выполняется. В остальных случаях такие строки считаются комментариями и полностью игнорируются.

Строка #exit прекращает чтение и анализ предложений. Весь текст ниже этой команды игнорируется. Это можно использовать для добавления и накапливания новых тестовых предложений.

Команда #fuzzyon разрешает использование алгоритмов нечеткой проекции. Парная ей команда #fuzzyoff отключает нечеткую проекцию, переводя морфологический анализатор в режим по умолчанию. Эти две команды управляют формированием аргумента Flags при вызове функции sol_MorphologyAnalysis и аргумента MorphologicalFlags при вызове функции sol_SyntaxAnalysis.

Команда #disallow_incomplete заставляет морфологический анализатор фиксировать ошибку, если при анализе предложения не удалось найти синтаксический паттерн, покрывающий все предложение. В нормальном режиме работы по умолчанию морфологический анализатор продолжает поиск знакомых синтаксических конструкций в предложении, даже если не удалось полностью выяснить синтаксис. Во многих случаях реального применения это позволяет добиваться хороших результатов, однако мешает обнаруживать ошибки. Вышеуказанная директива отключает неполный анализ. Чтобы снова активировать его, нужно указать директиву #allow_incomplete. Эти две команды управляют формированием аргумента Flags при вызове функции sol_MorphologyAnalysis и аргумента MorphologicalFlags при вызове функции sol_SyntaxAnalysis. Точно такую же фукцию выполняют опции командной строки -allow_incomplete и -disallow_incomplete, и директивы #allow_incomplete и #disallow_incomplete в консольной программе Syntax.

Блок тестового предложения

Тестовое предложение вместе со всей дополнительной информацией располагается между двумя строками $begin и $end. К примеру:

$begin
в лесу вчера были найдены обломки НЛО
в@предлог
лесу@существительное падеж:мест
вчера@наречие
были@глагол
найдены@прилагательное краткий число:мн
обломки@существительное падеж:вин
НЛО@существительное падеж:род
$end

Сразу после $begin идет строка с предложением, которое будет подано на вход морфологического анализатора.

Далее идут строки, соответствующие каждому из слов.

Слово отделяется от грамматической информации символом @ или !.

Символ ! означает строгое требование, чтобы словоформа содержала единственный вариант морфологического разбора. Если вариантов будет больше, то выполнение теста будет прервано с диагностикой.

Символ @ не проверяет количество вариантов распознавания.

После символа ! или @ идет название части речи в том виде, как оно было задано при описании языка. Для русского языка пример приведен ранее, а для английского языка существительные, прилагательные, глаголы и т.д. имеют другие названия:

$begin
It is possible for some type of arithmetic computations to produce an invalid result
It@eng_pronoun
is@eng_verb
possible@eng_adjective
for@eng_prep
some@eng_adjective
type@eng_noun
of@eng_prep
arithmetic@eng_adjective
computations@eng_noun
to@eng_particle
produce@eng_verb
an@*
invalid@eng_adjective
result@eng_noun
$end

Если сразу после символа @ или ! идет * или конец строки, то проверка результатов морфологического анализа для слова не производится. Это позволяет экономить силы при создании тестов, не вводя проверки для артиклей или знаков препинания.

После названия части речи идет список грамматических категорий, которые должны быть у словоформы. Элементы этого списка отделяются пробелами. Элемент может быть названием грамматической категории, если она объявлена как бистабильная. В этом случае проверяется, что словоформа имеет данную категорию в значении 1. Если предварить имя бистабильной категрии тильдой, то будет проверено, что словоформа имеет ее состояние 0. Например:

$begin
кенгуру был выведен в секретной лаборатории
...
выведен@прилагательное причастие страд краткий род:муж число:ед
...
$end

В этом примере проверяется, что слово выведен распознано как краткая форма страдательного причастия.

А в этом примере мы проверяем, что слово умный распознано как полная форма прилагательного:

$begin
кот достаточно умный, чтобы поймать эту мышь, прятавшуюся в подвале
...
умный@прилагательное ~краткий падеж:им число:ед род:муж
...
$end

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

$begin
в лесу найден НЛО
в@предлог
лесу@существительное падеж:мест
найден@прилагательное краткий род:муж
НЛО@существительное падеж:им
$end

Необязательность проверки грамматических категорий

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

$begin
Леса были непроходимые
Леса@существительное падеж:им число:мн
были@глагол
непроходимые@прилагательное падеж:им
$end

Проверка альтернативных версий

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

Чтобы задать для слова OR-список альтернативных вариантов, нужно просто перечислить их в одной строке после @ или !, разделяя символом вертикальной черты. К примеру:

$begin
приказ наступать на Ростов
приказ@существительное падеж:им | существительное падеж:вин
наступать@инфинитив
на@предлог
Ростов@существительное падеж:вин
$end

Ёфикация

При написании тестов для русского языка следует помнить, что хотя буква ё в словаре приводится к е, но если в исходном тестовом предложении слово написано с ё, то проверочная строка должна содержать слово в точно таком же виде, так как утилита проверят буквальное совпадение символов слова:

$begin
читать лёжа
читать@инфинитив
лёжа@наречие
$end

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

$begin
talk tête-à-tête
talk@eng_verb
tête-à-tête@eng_adverb
$end

Тесты сегментатора

Сегментатор текста выполняет предварительную разбивку на предложения. Для проверки его работы используются функции sol_CreateSentenceBrokerMem8, sol_FetchSentence и sol_GetFetchedSentence8.

Чтобы запустить тест сегментатора, нужно в командной строке указать путь к файлу с эталонными разбивками:

TestLexicon -segmenter файл_с_эталонами.txt

Файл должен быть в кодировке utf-8. Он состоит из кусков текста, каждый из которых начинается со строки $begin и заканчивается строкой $end. Конец текста и начало эталонной сегментации внутри блока $begin...$end указывается строкой $sentences.

$begin
Число пи примерно равно 3.1415926
$sentences
Число пи примерно равно 3.1415926
$end
Количество строк с текстом между директивами $begin и $sentences не ограничено.

После директивы $sentences каждая строка содержит ровно одно предложение, которое должно быть выделено из исходного текста.

Статистические особенности корпуса

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

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

  © Elijah Koziev 2010
прикладные проекты на основе грамматического словаря API грамматической машины компоненты для доступа к грамматическому словарю условия получения SDK токенизатор и сегментатор морфологический анализ и синтез лемматизатор база N-грамм синтаксический анализатор словоформы морфология и синтаксис русского языка падеж число род совершенный и несовершенный вид экспорт в SQL формат экспорт в XML формат скрипт SQL словаря структура SQL словаря структура XML словаря компоненты для доступа к грамматическому словарю ORM Persistent Dictionary Library лемматизация стемминг примеры использования грамматического словаря склонение существительных в русском языке склонение русских прилагательных спряжение глаголов в русском языке поиск текста с учетом морфологии OCR подсистема расширенные регулярные выражения генератор текста генератор случайного текста и имитатор рандомизатор синонимизатор перефразировщик Статистика буквенных паттернов

Грамматический словарь русского языка



Грамматический словарь
склонение и спряжение глаголов, существительных, прилагательных

В состав входит русский и английский словарь.

платформа:  Windows 2000 ... Windows 7
требования: 512 Mb свободной памяти, 300 Мб на диске
размер:         34 Мб

  скачать грамматический словарь купить грамматический словарь SDK грамматического словаря
грамматический словарь русского языка



SDK Грамматического словаря



SDK Грамматического Словаря
склонение и спряжение глаголов, существительных, прилагательных

В состав входит русский и английский словарь.

платформа:  Windows 2000 ... Windows 7
размер:         13 Мб

SQL словарь (демо):
sqlite mysql oracle firebird mssql

скачать демо-версию SDK купить SDK API грамматического словаря



Поисковая система



Integra
настольная и сетевая поисковая система 

платформа:  Windows XP ... Windows 7
требования: 512 Mb свободной памяти
размер:         21 Мб

Дополнительные компоненты:
MySQL поисковый сервер 13.5 Мб
Integra.Premium MySQL 3.9 Мб

скачать поисковую систему SDK поисковой системыописание поисковой системы



SDK Поисковой системы



SDK Поискового движка
API для настольной и сетевой поисковая система 

платформа:  Windows XP ... Windows 7
размер:         17 Мб

Дополнительные компоненты:

MySQL поисковый сервер 13.5 Мб
Integra.Premium MySQL 3.9 Мб

скачать SDK SDK поисковой системы



Экранный переводчик



Translator
экранный переводчик

платформа:  Windows XP ... Windows 7
требования: 256 Mb свободной памяти
размер:         4.4 Мб

Дополнительные компоненты:
расширенный англо-русский словарь 6.4 Мб


скачать экранный переводчикописание экранного переводчика



изменено 08-Dec-12