Разделение с помощью 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.