TreeTagger
TreeTagger — языконезависимый инструмент морфологической разметки текстов, разработанный Хелмутом Шмидом в институте компьютерной лингвистики университета Штутгарта. TreeTagger оперирует деревьями принятия решений и успешно применяется в задачах обработки таких языков, как русский, английский, немецкий, французский, итальянский, и др.
Доступность
Исходный код TreeTagger закрыт. Анализатор распространяется в виде архива с исполняемыми файлами под различные операционные системы, причём его использование в коммерческих целях подлежит отдельному лицензированию. Стоимость коммерческой лицензии зависит от вида деятельности и размера организации-покупателя: стартапы и малые предприятия платят меньше, чем крупные клиенты. Лицензия приобретается на каждый необходимый язык.
Файл параметров для русского языка доступен по адресу http://corpus.leeds.ac.uk/mocky/ по имени russian.par.gz
. Данная модель русского языка использует тагсет MULTEXT-East.
Установка
Бинарную сборку анализатора TreeTagger и все необходимые модели можно скачать с официального сайта. Для успешной инсталляции TreeTagger нужно выполнить следующие шаги:
- скачать пакет анализатора для целевой системы: Linux (x86), Linux (x86_64), Mac OS X (Intel), Mac OS X (PowerPC), Solaris (SPARC);
- скачать скрипты для разметки в директорию с пакетом анализатора;
- скачать установочный скрипт
install-tagger.sh
; - скачать файлы параметров для нужной системы;
- открыть окно терминала и запустить установочный скрипт, который распакует и сконфигурирует пакеты в текущую директорию.
Использование
Командная строка
В каталоге 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.