Разделение с помощью Python-Treetaggerwrapper

Treetagger может делать POS-теги, а также фрагменты текста, что означает извлечение словесных и именных предложений, как в этом немецком примере:

$ echo 'Das ist ein Test.' | cmd/tagger-chunker-german
    reading parameters ...
    tagging ...
     finished.
<NC>
Das PDS die
</NC>
<VC>
ist VAFIN   sein
</VC>
<NC>
ein ART eine
Test    NN  Test
</NC>
.   $.  .

Я пытаюсь выяснить, как это сделать с помощью Treetaggerwrapper в Python (поскольку это быстрее, чем прямой вызов Treetagger), но я не могу понять, как это делается. Документация относится к фрагментации как к предварительной обработке, поэтому я попытался использовать это:

tags = tagger.tag_text(u"Dieser Satz ist ein Satz.",prepronly=True)

Но вывод - это просто список слов без добавления информации. Я начинаю думать, что то, что Wrapper называет Chunking, отличается от того, что фактический теггер называет Chunking, но, может быть, я просто что-то упустил? Любая помощь будет оценена.

3 ответа

Решение

Оригинальный постер прямо в его предположениях. treetaggerwrapper (начиная с версии 2.2.4) определяет разбиение на фрагменты как просто "предварительную обработку текста" и в этом смысле не полностью охватывает возможности TreeTagger. От treetaggerwrapper.py:

  • Управляйте предварительной обработкой текста (чанкингом) вместо внешних сценариев Perl, как при базовой установке TreeTagger, поэтому избегайте запуска Perl каждый раз, когда фрагмент текста должен быть помечен.

Но проверять tagger-chunker-german Можно видеть, что получение предложений и тегов - это строка операций, фактически вызывающая TreeTagger 3 раза:

$ echo 'Das ist ein Test.' | cmd/tree-tagger-german | perl -nae 'if ($#F==0){print} else {print "$F[0]-$F[1]\n"}' | bin/tree-tagger lib/german-chunker.par -token -sgml -eps 0.00000001 -hyphen-heuristics -quiet | cmd/filter-chunker-output-german.perl | bin/tree-tagger -quiet -token -lemma -sgml lib/german-utf8.par

в то время как treetaggerwrapperкоманда тегов (показана в tagcmdlist) на самом деле - это однократный вызов (после предварительной обработки текста) для:

bin/tree-tagger -token -lemma -sgml -quiet -no-unknown lib/german-utf8.par


Точка входа, чтобы расширить это для порции, является линией

"tagparfile": "german-utf8.par",

где вы бы определить что-то вроде

"chunkingparfile": "german-chunker.par",

и выполнить дополнительный вызов TreeTagger с этим другим файлом после tagger-chunker-german операционная цепочка. Тогда вам, вероятно, все еще придется скопировать дополнительную логику из cmd/filter-chunker-output-german.perl хоть.

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

>>> import pprint   # For proper print of sequences.
>>> import treetaggerwrapper
>>> #1) build a TreeTagger wrapper:
>>> tagger = treetaggerwrapper.TreeTagger(TAGLANG='en')
>>> #2) tag your text.
>>> tags = tagger.tag_text("This is a very short text to tag.")
>>> #3) use the tags list... (list of string output from TreeTagger).
>>> pprint.pprint(tags)
['This\tDT\tthis',
 'is\tVBZ\tbe',
 'a\tDT\ta',
 'very\tRB\tvery',
 'short\tJJ\tshort',
 'text\tNN\ttext',
 'to\tTO\tto',
 'tag\tVV\ttag',
 '.\tSENT\t.']
>>> # Note: in output strings, fields are separated with tab chars (\t).

Обратите внимание, что это пример для Python 3, потому что перед текстом нет u, чтобы объявить его как Unicode. Это связано с тем, что Python 3 принимает Unicode по умолчанию, а Python 2.7 требует его объявления, как в вашем посте. Что поднимает вопрос, какую версию Python вы используете.

лязг

Чанкинг - это маркировка последовательностей из нескольких токенов, например,"Желтая собака":

  • Word -> POS-тег
  • The -> DT (статья)
  • желтый -> JJ (прилагательное)
  • собака -> NN (существительное)

Все три слова вместе являются куском и будут помечены как NP (существительная фраза).

Я думаю, что в treetaggerwrapper он использует двоичный файл для выполнения задачи тегирования, так как я нашел это в treetaggerwrapper.py:

    # ----- Set binary by platform.
    if ON_WINDOWS:
        self.tagbin = os.path.join(self.tagbindir, "tree-tagger.exe")
    elif ON_MACOSX or ON_POSIX:
        self.tagbin = os.path.join(self.tagbindir, "tree-tagger")

Тогда ответ вполне очевиден: сама библиотека treetagger не предоставляет двоичный файл для chunker, что приводит к тому, что treetaggerwrapper, а также другая библиотека "treetagger-python" не имеют функции chunk.

Другие вопросы по тегам