如何在Python中获取二进制解析

时间:2017-06-25 03:03:53

标签: python nlp nltk

我有来自自然语言推理语料库(SNLImultiNLI)的数据,以这种形式出现:

'( ( Two ( blond women ) ) ( ( are ( hugging ( one another ) ) ) . ) )'

它们应该是二叉树(有些不是很干净)。

我想将一些自己的句子解析成这种格式。我怎么能用NLTK或类似的东西呢?

我找到了StanfordParser,但我一直无法找到如何解析这个问题。

1 个答案:

答案 0 :(得分:4)

任何树都可以转换为保留其成分的二叉树。这是一个适用于nltk.Tree输入的简单解决方案:

from nltk import Tree
from functools import reduce

def binarize(tree):
    """
    Recursively turn a tree into a binary tree.
    """
    if isinstance(tree, str):
        return tree
    elif len(tree) == 1:
        return binarize(tree[0])
    else:
        label = tree.label()
        return reduce(lambda x, y: Tree(label, (binarize(x), binarize(y))), tree)

如果您想要普通元组而不是Tree,请将最后一个return语句替换为:

return reduce(lambda x, y: (binarize(x), binarize(y)), tree)

示例:

>>> t = Tree.fromstring('''(ROOT (S (NP (NNP Oracle))
    (VP (VBD had) (VP (VBN fought) (S (VP (TO to)
      (VP (VB keep) (NP (DT the) (NNS forms))
        (PP (IN from) (S (VP (VBG being) (VP (VBN released))))))))))))''')

>>> bt = binarize(t)

>>> print(t)
(ROOT
  (S
    (NP (NNP Oracle))
    (VP
      (VBD had)
      (VP
        (VBN fought)
        (S
          (VP
            (TO to)
            (VP
              (VB keep)
              (NP (DT the) (NNS forms))
              (PP (IN from) (S (VP (VBG being) (VP (VBN released))))))))))))
>>> print(bt)
(S
  Oracle
  (VP
    had
    (VP
      fought
      (VP
        to
        (VP (VP keep (NP the forms)) (PP from (VP being released)))))))

这将确保二进制结构,但它不一定是正确的结构。大覆盖率解析器生成非二进制分支,因为一些附件选择非常难。 (考虑一下经典的“我用望远镜看到了那个女孩”;对象内部的PP“和望远镜”,还是VP的一部分?)。所以要小心。