如何正确导航 NLTK 解析树?

How to properly navigate an NLTK parse tree?

NLTK 又让我抓狂了。

如何正确浏览 NLTK 树(或 ParentedTree)? 我想用父节点 "VBZ" 识别某个叶子,然后我想从那里进一步向上移动到树的左侧以识别 NP 节点。

我该怎么做? NLTK树class好像没有想通...还是我太笨了...

感谢您的帮助!

根据您想执行的操作,这应该可行。它会首先为您提供最接近的左侧 NP 节点,然后是第二个最近的节点,依此类推。因此,如果您有一个 (S (NP1) (VP (NP2) (VBZ))) 的树,您的 np_trees 列表将具有 [ParentedTree(NP2), ParentedTree(NP1)]

from nltk.tree import *

np_trees = []

def traverse(t):
    try:
        t.label()
    except AttributeError:
        return

    if t.label() == "VBZ":
        current = t
        while current.parent() is not None:

            while current.left_sibling() is not None:

                if current.left_sibling().label() == "NP":
                    np_trees.append(current.left_sibling())

                current = current.left_sibling()

            current = current.parent()

    for child in t:
        traverse(child)

tree = ParentedTree.fromstring("(S (NP (NNP)) (VP (VBZ) (NP (NNP))))")
traverse(tree)
print np_trees # [ParentedTree('NP', [ParentedTree('NNP', [])])]