【问题标题】:Chunking with Python-Treetaggerwrapper使用 Python-Treetaggerwrapper 进行分块
【发布时间】:2016-08-27 17:24:57
【问题描述】:

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 不同,但也许我只是遗漏了一些东西?任何帮助将不胜感激。

【问题讨论】:

    标签: python nlp chunking treetagger


    【解决方案1】:

    原始发帖人的假设是正确的。 treetaggerwrapper(从 2.2.4 版开始)将分块定义为仅仅是“文本的预处理”,并且在这个意义上没有完全包装 TreeTagger 的功能。来自treetaggerwrapper.py

    • 管理文本预处理(分块)代替外部 Perl 脚本,就像在基本 TreeTagger 安装中一样,从而避免每次必须标记一段文本时都启动 Perl。

    但是查看tagger-chunker-german可以看到获取子句标签是一串操作,实际上调用了3次TreeTagger:

    $ 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 复制一些额外的逻辑。

    【讨论】:

      【解决方案2】:

      如果有完整的代码示例会更容易,如果有其他问题,请提供一个示例,但我试一试。 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 需要像您的帖子中那样声明它。 这就引出了您使用的是哪个 Python 版本的问题。

      分块

      分块是多标记序列的标记,例如 黄狗

      • Word -> POS-Tag
      • -> DT(文章)
      • 黄色 -> JJ(形容词)
      • 狗 -> NN(名词)

      这三个词加在一起就是一个词组,将被标记为 NP(名词短语)。

      【讨论】:

        【解决方案3】:

        我认为在 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 功能。

        【讨论】:

          猜你喜欢
          • 2012-06-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-24
          相关资源
          最近更新 更多