使用 Python-Treetaggerwrapper 分块
Chunking with Python-Treetaggerwrapper
Treetagger 可以进行词性标记和文本分块,这意味着提取口头和名词性从句,如这个德语示例所示:
$ 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>
. $. .
我正在尝试找出如何使用 Python 中的 Treetaggerwrapper 执行此操作(因为它比直接调用 Treetagger 更快),但我无法弄清楚它是如何完成的。文档将分块称为预处理,所以我尝试使用这个:
tags = tagger.tag_text(u"Dieser Satz ist ein Satz.",prepronly=True)
但输出只是一个单词列表,没有添加任何信息。我开始认为 Wrapper 所称的 Chunking 与实际标记器所称的 Chunking 有所不同,但也许我只是遗漏了什么?任何帮助将不胜感激。
如果有完整的代码示例会更容易,请提供一个完整的代码示例以供进一步提问,但我试一试。
TreeTaggerWrapper Documentation 有一个很好的例子:
>>> 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 需要像在 post 中那样声明它。
这提出了您正在使用哪个 Python 版本的问题。
分块
分块是多标记序列的标记,例如
黄狗:
- Word -> POS-Tag
- ->DT(文章)
- 黄色 -> JJ(形容词)
- dog -> NN(名词)
这三个词一起是一个词块,将被标记为 NP(名词短语)。
楼主的猜测是对的。 treetaggerwrapper
(从版本 2.2.4 开始)仅将分块定义为 "preprocessing of text",并没有在这个意义上完全包装 TreeTagger 的功能。来自 treetaggerwrapper.py
:
- Manage preprocessing of text (chunking) in place of external Perl scripts as in base TreeTagger installation, thus avoid starting Perl each time a piece of text must be tagged.
但是查看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",
并在 tagger-chunker-german
操作链之后使用另一个 parfile 发出对 TreeTagger 的额外调用。不过,您可能仍然需要从 cmd/filter-chunker-output-german.perl
复制一些额外的逻辑。
我认为他在 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功能
Treetagger 可以进行词性标记和文本分块,这意味着提取口头和名词性从句,如这个德语示例所示:
$ 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>
. $. .
我正在尝试找出如何使用 Python 中的 Treetaggerwrapper 执行此操作(因为它比直接调用 Treetagger 更快),但我无法弄清楚它是如何完成的。文档将分块称为预处理,所以我尝试使用这个:
tags = tagger.tag_text(u"Dieser Satz ist ein Satz.",prepronly=True)
但输出只是一个单词列表,没有添加任何信息。我开始认为 Wrapper 所称的 Chunking 与实际标记器所称的 Chunking 有所不同,但也许我只是遗漏了什么?任何帮助将不胜感激。
如果有完整的代码示例会更容易,请提供一个完整的代码示例以供进一步提问,但我试一试。 TreeTaggerWrapper Documentation 有一个很好的例子:
>>> 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 需要像在 post 中那样声明它。 这提出了您正在使用哪个 Python 版本的问题。
分块
分块是多标记序列的标记,例如 黄狗:
- Word -> POS-Tag
- ->DT(文章)
- 黄色 -> JJ(形容词)
- dog -> NN(名词)
这三个词一起是一个词块,将被标记为 NP(名词短语)。
楼主的猜测是对的。 treetaggerwrapper
(从版本 2.2.4 开始)仅将分块定义为 "preprocessing of text",并没有在这个意义上完全包装 TreeTagger 的功能。来自 treetaggerwrapper.py
:
- Manage preprocessing of text (chunking) in place of external Perl scripts as in base TreeTagger installation, thus avoid starting Perl each time a piece of text must be tagged.
但是查看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",
并在 tagger-chunker-german
操作链之后使用另一个 parfile 发出对 TreeTagger 的额外调用。不过,您可能仍然需要从 cmd/filter-chunker-output-german.perl
复制一些额外的逻辑。
我认为他在 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功能