Stanford nlp 如何从Stanford解析器获取二值化解析树?

Stanford nlp 如何从Stanford解析器获取二值化解析树?,stanford-nlp,Stanford Nlp,从Stanford解析器(如englishPCFG.ser.gz)获得的解析树中,一个节点可能有两个以上的子节点 如何在每个节点上获得带有词性标记信息的二值化解析树? 是否有任何参数需要填充到解析器中以实现此目的?树不是严格的二进制分支,因为训练解析器的Penn树库不是。这是一个关于树库的理论问题,它一直困扰着计算语言学家 我处理这个问题的方法是,编写复杂的树转换逻辑,将选区分析器的输出重新构造为二进制分支结构,使用X-bar理论表示——在这个过程中,促进对词汇短语的功能投影,增加量词等等 [更

从Stanford解析器(如englishPCFG.ser.gz)获得的解析树中,一个节点可能有两个以上的子节点 如何在每个节点上获得带有词性标记信息的二值化解析树?
是否有任何参数需要填充到解析器中以实现此目的?

树不是严格的二进制分支,因为训练解析器的Penn树库不是。这是一个关于树库的理论问题,它一直困扰着计算语言学家

我处理这个问题的方法是,编写复杂的树转换逻辑,将选区分析器的输出重新构造为二进制分支结构,使用X-bar理论表示——在这个过程中,促进对词汇短语的功能投影,增加量词等等

[更新]我试过这门课。它在我使用的一个例子中效果很好。我正在解析西班牙语,并使用Clojure。下面是一个示例会话:

user=> (import edu.stanford.nlp.parser.lexparser.TreeBinarizer)
edu.stanford.nlp.parser.lexparser.TreeBinarizer
user=> (import     edu.stanford.nlp.trees.international.spanish.SpanishTreebankLanguagePack)
edu.stanford.nlp.trees.international.spanish.SpanishTreebankLanguagePack
user=> (import     edu.stanford.nlp.trees.international.spanish.SpanishHeadFinder)
edu.stanford.nlp.trees.international.spanish.SpanishHeadFinder
user=> ; I have a parsed tree:

user=> (.pennPrint t)
(sp
  (prep (sp000 a))
  (S
    (infinitiu (vmn0000 decir))
    (S
      (conj (cs que))
      (grup.verb (vaip000 hemos) (vmp0000 visto))
      (sn
        (spec (di0000 un))
        (grup.nom (nc0s000 relámpago))))))
nil
user=> ; let's create a binarizer

user=> (def tb (TreeBinarizer/simpleTreeBinarizer (SpanishHeadFinder.) (SpanishTreebankLanguagePack.)))
#'user/tb
user=> ; now transform the tree above -- note that the second embedded S node has three children

user=> (.pennPrint (.transformTree tb t))
(sp
  (prep (sp000 a))
  (S
    (infinitiu (vmn0000 decir))
    (S
      (conj (cs que))
      (@S
        (grup.verb (vaip000 hemos) (vmp0000 visto))
        (sn
          (spec (di0000 un))
          (grup.nom (nc0s000 relámpago)))))))
nil
user=> ; the binarizer created an intermediate phrasal node @S, pushing the conjuction into <Spec, @S>
user=>(导入edu.stanford.nlp.parser.lexparser.TreeBinarizer)
edu.stanford.nlp.parser.lexparser.TreeBinarizer
user=>(导入edu.stanford.nlp.trees.international.西班牙语.SpanishTreebankLanguagePack)
edu.stanford.nlp.trees.international.SpanishTreebankLanguagePack
user=>(导入edu.stanford.nlp.trees.international.西班牙语.SpanishHeadFinder)
edu.stanford.nlp.trees.international.spanish HeadFinder
用户=>;我有一个已解析的树:
用户=>(.Pennt打印)
(sp
(准备(sp000 a))
(S)
(无穷大(vmn0000分贝))
(S)
(联合(政务司司长)
(grup.verb(vaip000 hemos)(vmp0000 visto))
(序号
(规格(di0000 un))
(grup.nom(nc0s000 relámpago()())))
无
用户=>;让我们创建一个二进制程序
用户=>(def tb(树状网络化器/简单二值化器(SpanishHeadFinder.)(SpanishTreebankLanguagePack.))
#“用户/tb
用户=>;现在变换上面的树——注意,第二个嵌入的S节点有三个子节点
用户=>(.pennPrint(.transformTree tb t))
(sp
(准备(sp000 a))
(S)
(无穷大(vmn0000分贝))
(S)
(联合(政务司司长)
(@S
(grup.verb(vaip000 hemos)(vmp0000 visto))
(序号
(规格(di0000 un))
(grup.nom(nc0s000 relámpago()()())))
无
用户=>;二值化程序创建了一个中间短语节点@S,将连接推到

实际上,CoreNLP套件中有一个类,正如代码中的注释所建议的那样,它将树重组为头补二进制节点:我还没有尝试过。谢谢!我已经按照另一个问题的评论中的建议这么做了好吧,我试过TreeBinarizer,它很有效——至少在我试过的一个例子上是这样的:)是的。我也试过TreeBinarizer,它很管用。另外,如果解析树中每个节点都没有词性信息,您知道如何执行词性标记吗?对不起,我没有完全理解。是否要提取树中每个节点的POS?