TreeTagger

Материал из NLPub

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

Доступность

Исходный код TreeTagger закрыт. Анализатор распространяется в виде архива с исполняемыми файлами под различные операционные системы, причём его использование в коммерческих целях подлежит отдельному лицензированию. Стоимость коммерческой лицензии зависит от вида деятельности и размера организации-покупателя: стартапы и малые предприятия платят меньше, чем крупные клиенты. Лицензия приобретается на каждый необходимый язык.

Файл параметров для русского языка доступен по адресу http://corpus.leeds.ac.uk/mocky/ по имени russian.par.gz. Данная модель русского языка использует тагсет MULTEXT-East.

Установка

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

  1. скачать пакет анализатора для целевой системы: Linux (x86), Linux (x86_64), Mac OS X (Intel), Mac OS X (PowerPC), Solaris (SPARC);
  2. скачать скрипты для разметки в директорию с пакетом анализатора;
  3. скачать установочный скрипт install-tagger.sh;
  4. скачать файлы параметров для нужной системы;
  5. открыть окно терминала и запустить установочный скрипт, который распакует и сконфигурирует пакеты в текущую директорию.

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

Командная строка

В каталоге cmd внутри директории с TreeTagger имеются команды, ориентированные на обработку конкретных языков: tree-tagger-russian, tree-tagger-english, etc. Для простой обработки текста достаточно вызвать команду, соответствующую требуемому языку, и передать текст в поток стандартного ввода.

% echo 'Привет, как дела?' | ~/treetagger/cmd/tree-tagger-russian
	reading parameters ...
	tagging ...
Привет	Ncmsnn	привет
,	,	,
как	C	как
дела	Ncnpnn	дело
?	SENT	?
	 finished.

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

% echo 'потоки' | ~/treetagger/cmd/tree-tagger-russian 2>/dev/null
потоки	Ncmpnn	поток

Каждая строка вывода анализатора состоит из трёх строк, разделённых знаком табуляции '\t'. Первая строка — текущая лексема или графема, вторая — морфосинтаксический дескриптор в рамках принятого тагсета, третья — лемма.

Java

Существует обёртка для TreeTagger, позволяющая использовать его в Java-приложениях.

Ruby

Доступен гем treetagger-ruby.

Perl

Обёртка для использования из Perl — Lingua::TreeTagger.

Возможные проблемы

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

% echo 'По дефолту у меня стояла 2. Выбрал 4.' | tree-tagger-russian
  reading parameters ...
  tagging ...
По	Sp-d	по
дефолту	Ncmsdn	дефолт
у	Sp-g	у
меня	P-1-sgn	я

ERROR: Internal buffer overflow in function tag_token
aborted.

Проблема заключается в некорректной токенизации текста при помощи встроенного токенизатора для UTF-8. Данное поведение может быть исправлено путём незначительной доработки скрипта вызова TreeTagger. Если вы используете Java и tt4j, то все необходимые исправления уже внесены авторами библиотеки и дополнительное вмешательство не требуется.

Файл tree-tagger-russian — это обычный скрипт командной строки, вызывающий необходимые приложения с требуемыми параметрами. Отдельного внимания заслуживают две последних строки файла:

$TOKENIZER $* |
$TAGGER $OPTIONS $PARFILE

После выполнения токенизации стоит вставить вызов утилиты sed, разбивающий строки вида "2." на две строки: "2" и ".": sed -re 's/^(\w*?)(\.+)$/\1\n\2/'.

Таким образом, конец файла tree-tagger-russian примет вид:

$TOKENIZER $* |
sed -re 's/^(\w*?)(\.+)$/\1\n\2/' |
$TAGGER $OPTIONS $PARFILE

Благодаря этому небольшому изменению, анализатор будет обрабатывать строки корректно:

% echo 'По дефолту у меня стояла 2. Выбрал 4.' | tree-tagger-russian
  reading parameters ...
  tagging ...
По	Sp-d	по
дефолту	Ncmsdn	дефолт
у	Sp-g	у
меня	P-1-sgn	я
стояла	Vmis-sfa-e	стоять
2	Mc---d	2
.	SENT	.
Выбрал	Vmis-sma-p	выбрать
4	Mc---d	4
.	SENT	.
   finished.

Ссылки

См. также

Примечания