/beltagger

A PoS tagger for Belarusian (rewrite of the YABC Tagger)

Primary LanguageC++

Общие сведения

В репозитории находится лемматизатор для белорусского языка, реализованный на C++. Это глубоко переработанная и улучшенная версия лемматизатора ЭКБЯ, написанного на Perl Владиславом Порицким при участии Оксаны Волчек в 2013 г. Настоящий лемматизатор является кроссплатформенным: поддерживаются платформы Windows и GNU/Linux. Лемматизатор правиловый. При анализе текста учитываются не только словоформы, содержащиеся в грамматической базе, но и последовательности арабских цифр, русскоязычные слова, латиничные написания. Поддерживается обработка тарашкевицы, многих дефисно пишущихся сложных слов, а также написаний, отклоняющихся от правил белорусской орфографии 2008 г. Доступен также дополнительный модуль для выдвижения гипотез о леммах и грамматических разборах для неопознанных словоформ.

Установка

Структура проекта

  • Директория src_assembler содержит исходный код сборщика грамматической базы.
  • Директория src_lemmatizer содержит исходный код лемматизатора.
  • Директория src_db содержит исходные текстовые файлы, из которых собирается грамматическая база. В основе грамматической базы лежит «Граматычны слоўнік беларускай мовы», тома которого доступны на сайте slounik.org (существительное, глагол, остальные части речи). Исправлены многочисленные мелкие неточности, обнаруженные в электронном варианте словаря, и добавлено около 10 тысяч парадигм (собственные имена, заимствования-неологизмы, аббревиатуры и др.).
  • Директория example содержит протокенизированные текстовые файлы karatkevich.txt (У. Караткевіч. Каласы пад сярпом тваім) и akudovich.txt (В. Акудовіч. Мяне няма). Эти тексты можно использовать для пробных запусков лемматизатора с разными входными параметрами.

Кроме того, в корневой директории находятся скрипты build.bat и build.sh, тегсет tagset_YABC.html, суффиксная таблица sufftable_example.txt и скрипт sufftable.pl. Подробнее об этих файлах см. далее.

Сборка лемматизатора

Для сборки лемматизатора требуются:

  • компилятор C++: GCC или MSVS
  • cmake версии не ниже 2.8
  • библиотека Boost (при тестировании использовался Boost 1.55.0)

В простейшем случае, если ваша система сконфигурирована правильно, для сборки лемматизатора должно быть достаточно запустить консольный скрипт build.bat (на Windows) или build.sh (на GNU/Linux). Если в процессе сборки не обнаружен путь к библиотеке Boost, может понадобиться прописать путь к ней явным образом в оба файла CMakeLists.txt (в директориях src_assembler и src_lemmatizer). На GNU/Linux следует проверить, что в системе установлена локаль ru_RU.CP1251. Если нет, сгенерируйте ее с помощью locale-gen или localedef.

В результате сборки должны появиться два исполняемых файла: сборщик грамматической базы assembler и лемматизатор lemmatizer, – а также файл грамматической базы db.txt.

Использование

Сборщик грамматической базы

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

  • -i, --input-dir [путь] – путь к директории с исходными файлами для сборки грамматической базы. По умолчанию подразумевается, что рядом с исполняемым файлом находится директория src, в которой и лежат исходные файлы.

  • -o, --output-file [путь к файлу] – имя файла для собранной грамматической базы. По умолчанию выходной файл называется db.txt.

  • -f, --format [detailed | simple | dummy] – формат вывода грамматической базы.

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

іграў	ігра|іграць	N:f:pG||V:IT-:iasm

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

іграў	ігра|іграць	N:f:pG|V:IT-:iasm

При отладочном формате dummy на одной строке приводится информация не о токене, а о тройке вида «токен – одна возможная лемма – один возможный грамматический разбор»:

іграў	ігра	N:f:pG
іграў	іграць	V:IT-:iasm

По умолчанию вывод является подробным.

Лемматизатор

Лемматизатор lemmatizer работает со входными текстами в кодировке Windows-1251. Тексты должны быть предварительно протокенизированы: каждый токен должен находиться на отдельной строке. Для подготовки текстов из директории example использовался токенизатор Г. Шмида из проекта TreeTagger.

Параметры командной строки

Лемматизатор запускается из командной строки и принимает следующие параметры:

  • -i, --input-file [путь к файлу] – входной протокенизированный текстовый файл на белорусском языке. Технически это должен быть TSV-файл в любое число колонок, последняя (или единственная) из которых содержит сам токен. Параметр является обязательным.

  • -c, --columns [число] – количество колонок во входном файле. По умолчанию оно принимается равным 3: идентификатор текстового фрагмента, порядковый номер токена в нем, сам токен. Такой формат соответствует случаю, когда на вход лемматизатора подается коллекция токенизированных текстов, сцепленная в один файл: каждому тексту соответствует свой порядковый номер, и токены внутри текстов занумерованы. Количество колонок не может быть меньше 1 (когда в единственной колонке содержатся только токены).

  • -o, --output-file [путь к файлу] – выходной файл. По умолчанию результаты лемматизации выводятся в файл, имя которого отличается от имени входного файла префиксом tagged_. Это TSV-файл, колонок в котором на три больше, чем во входном (добавляются леммы, грамматические разборы и специальные пометы).

  • -u, --unknowns-file [default | путь к файлу] – режим вывода информации о неопознанных токенах и файл для хранения этой информации. По умолчанию сведения о неопознанных токенах никуда не выводятся. Если передана опция default, то для вывода будет использован файл, имя которого отличается от имени входного файла префиксом unknown_. Любая другая текстовая строка, переданная с этим флагом, будет понята как желаемое имя файла.

  • -m, --memo [on | off] – режим мемоизации. Для некоторых токенов поиск леммы и грамматического разбора может быть затратным по времени. Чтобы не повторять этот процесс каждый раз, когда встречается определенный токен, лемматизатор может запоминать все свои решения, принимаемые при обработке входного файла, и хранить их в структуре данных с быстрым доступом. По умолчанию мемоизация включена, что ускоряет работу программы, но несколько увеличивает затраты памяти, особенно при обработке больших файлов. Принудительно включить или выключить мемоизацию позволяют опции on и off.

  • -t, --tar [shallow | deep] – режим обработки тарашкевицы. Орфография белорусских текстов, выполненных кириллической графикой, может принадлежать к одной из двух традиций: «наркомовка» (нормативная белорусская орфография, ныне действующий вариант которой отражен в правилах 2008 г.) или «тарашкевица» (широко используемая альтернативная орфография). Грамматическая база лемматизатора использует наркомовку, но лемматизатор также может пытаться опознавать токены, написание которых отвечает нормам тарашкевицы. Если делается попытка максимально полно охватить специфические явления тарашкевицы, такую обработку тарашкевичных написаний мы называем глубокой, а иначе – поверхностной (учитываются только самые простые факты, такие как отражение мягкости согласных на письме или замены вроде без –> бяз, не –> ня). По умолчанию обработка тарашкевицы является поверхностной, что ускоряет работу программы, но может заметно ухудшить качество разбора в случаях, когда текст содержит много тарашкевичных написаний. Принудительно выбрать поверхностный или глубокий режим обработки тарашкевицы позволяют опции shallow и deep.

  • -s, --suf [путь к файлу] – режим выдвижения гипотез и суффиксная таблица, используемая для порождения гипотез. Некоторые токены лемматизатор не может опознать, потому что грамматическая база не содержит их ни в одном из мыслимых вариантов написания. Но так как словоизменение в белорусском языке тяготеет к правому краю словоформы (окончания и т. п.), можно предполагать, как будут выглядеть лемма и разбор для неопознанного токена, если такой же финалью, как у него, обладают какие-нибудь из словоформ, содержащихся в базе. Информацию о том, какие пары вида «финаль леммы – грамматический разбор» могут соответствовать данной финали токена, удобно хранить в структуре данных, которая называется суффиксной таблицей. Для получения суффиксной таблицы на основе грамматической базы или какой-нибудь коллекции текстов, обработанных лемматизатором, можно использовать скрипт sufftable.pl, написанный на Perl Владиславом Порицким. Имея суффиксную таблицу, лемматизатор будет выдвигать гипотезы о том, как выглядят леммы и разборы для неопознанных токенов. По умолчанию суффиксная таблица не используется и гипотезы не выдвигаются. Пример суффиксной таблицы, которую можно передать в опцию -s, – файл sufftable_example.txt.

  • -g, --guessing [default | путь к файлу] – режим вывода информации о гипотезах и файл для хранения этой информации. Флаг имеет смысл задавать лишь в том случае, если задан флаг -s. По умолчанию сведения о гипотезах никуда не выводятся. Если передана опция default, то для вывода будет использован файл, имя которого отличается от имени входного файла префиксом guessed_. Любая другая текстовая строка, переданная с этим флагом, будет понята как желаемое имя файла.

Примеры запуска

Запуск лемматизатора может выглядеть так.

Пример 1
lemmatizer -i ./example/karatkevich.txt -c 1
  • обрабатывается входной файл ./example/karatkevich.txt
  • во входном файле 1 колонка
  • пролемматизованный текст сохраняется в файл ./example/tagged_karatkevich.txt
  • неопознанные токены не логируются
  • мемоизация включена
  • обработка тарашкевицы поверхностная
  • гипотезы о неопознанных токенах не выдвигаются
Пример 2
lemmatizer -i ./example/akudovich.txt 
    -c 1
    -o ./example/result_akudovich.txt 
    -u default
    -t deep 
    -s sufftable_example.txt
    -g default
  • обрабатывается входной файл ./example/akudovich.txt
  • во входном файле 1 колонка
  • пролемматизованный текст сохраняется в файл ./example/result_akudovich.txt
  • неопознанные токены логируются в файл ./example/unknown_akudovich.txt
  • мемоизация включена
  • обработка тарашкевицы глубокая
  • выдвигаются гипотезы о неопознанных токенах, используется суффиксная таблица sufftable_example.txt
  • сведения о гипотезах логируются в файл ./example/guessed_akudovich.txt

Результаты лемматизации

Выходной файл имеет формат TSV и содержит на три колонки больше, чем входной файл:

  • леммы
  • грамматические разборы
  • специальные пометы (поле может быть пустым)

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

    сонца	сонца		N:n:sA|N:n:sG|N:n:sN
    вялiкiя	вялікі		Adj:0pA|Adj:0pN
    Але		Ала|але		NP_fn:f:sD|NP_fn:f:sL||Conj:coord
    Разам	раз|разам	N:m:pD|N:m:sI||Prep

Грамматические разборы записываются в соответствии с тегсетом, созданным при работе над Экспериментальным корпусом белорусского языка. См. файл tagset_YABC.html.

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

[ORTH] – словоформа опознана в результате работы модуля SymbolTweaker после того, как к ней были применены правила установления соответствий между современной орфографической нормой и правописной нормой, существовавшей до 2008 г.:

    дзесятая	дзясяты	NumOrd:fsN	[ORTH]

[TAR] – словоформа является тарашкевичным написанием и опознана в результате работы модуля TarShallow или TarDeep:

    звесьці	звесці	V:PT-:Inf	[TAR]

[HYPH] – словоформа опознана после того, как удален знак переноса:

    Вы-пусціць	выпусціць	V:PT-:Inf|V:PT-:ips3	[HYPH]

[COMPeq], [COMPneq], [COMPadj]... – словоформа является сложным словом, пишущимся через дефис, и опознана в результате работы модуля Compounds. Если грамматический разбор частей полностью совпадает, то помета выглядит как [COMPeq], а если в разборах есть отличия, то как [COMPneq] (в том числе иногда в середине содержится цифра, указывающая на количество частей в сложном слове):

    хлопцы-казакі	хлопец-казак	N:m:pN	[COMPeq]
    прыказка-байка	прыказка-байка	N:f:sN	[COMP2eq]
    конусаў-свечак	конус-свечка	N:f:pG|N:m:pG	[COMP2neq]

Если словоформа является пишущимся через дефис прилагательным, ей сопоставляется помета [COMPadj]:

    сіне-чырвоны	сіне-чырвоны	Adj:msA|Adj:msN	[COMPadj]

[GUESS] – словоформа опознана в результате работы модуля Guessing. Предлагаемые леммы и грамматические разборы являются гипотезами:

    Прыдняпроўе	Прыдняпроўе	N:n:sA|N:n:sN			[GUESS]
    Стафану	Стафан		N:m:sD|N:m:sG|NP_fn:m:sD	[GUESS]

Условия использования

Программная часть лемматизатора распространяется под лицензией BSD. Исходные тексты грамматической базы представляют собой результат переработки «Граматычнага слоўніка беларускай мовы», авторские права на который принадлежат коллективу его составителей. При использовании лемматизатора желательно (хотя и не обязательно) ссылаться на сайт slounik.org, разработчики которого опубликовали в сети «Граматычны слоўнік», и на страницу нашего проекта.