Python 如何正确导航NLTK解析树?

Python 如何正确导航NLTK解析树?,python,tree,nlp,nltk,Python,Tree,Nlp,Nltk,NLTK又把我逼疯了 如何正确导航NLTK树(或ParentedTree)? 我想用父节点“VBZ”标识某个叶,然后我想从那里进一步向上移动到树的左侧,以标识NP节点 我该怎么做?NLTK树类似乎没有经过仔细考虑。。。或者我太笨了 谢谢你的帮助 根据您想要做的事情,这应该是可行的。它将首先为您提供最接近的左NP节点,然后是第二个最近的节点,以此类推。因此,如果您有一个(S(NP1)(VP(NP2)(VBZ)),您的NP_树列表将有[ParentedTree(NP2),ParentedTree(N

NLTK又把我逼疯了

如何正确导航NLTK树(或ParentedTree)? 我想用父节点“VBZ”标识某个叶,然后我想从那里进一步向上移动到树的左侧,以标识NP节点

我该怎么做?NLTK树类似乎没有经过仔细考虑。。。或者我太笨了

谢谢你的帮助


根据您想要做的事情,这应该是可行的。它将首先为您提供最接近的左NP节点,然后是第二个最近的节点,以此类推。因此,如果您有一个
(S(NP1)(VP(NP2)(VBZ))
,您的
NP_树
列表将有
[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', [])])]

非常感谢!我仍在理解你在那里做了什么。是否也可以查找特定的VBZ(具有特定的叶)?因为我不能投票支持你(我没有足够的声誉),我能给你买杯咖啡吗?这样做,对吗
如果t.label()==“VBZ”和t.leaves()[0]==“does”:
(假设“does”是VBZ)我必须检查
t.leaves()
的返回值,但是如果您希望VBZ只有一个叶子是“does”,假设您从
leaves()
得到一个数组,那么您应该执行此操作
并且t.leaves()=[“does”
。这将解决叶子中只有一个单词的问题,在没有叶子的情况下,没有可能的索引越界异常。如果出于与NNP子节点相同的原因,您可能希望在t.leaves()中执行其他叶子
和“does”,那么当您找到NP节点时,只需检查NP节点的子节点(ren)是否有以NNP标签为根的子树。根据是否只能有一个包含NNP的子树或多个子树和叶子,其中一个是NNP,您的搜索方式会有所不同。如果您需要我对代码进行注释以帮助您理解,请告诉我,我将编辑我的帖子