NLTK树数据结构,查找节点、其父节点或子节点

6
我正在使用nltk的树形数据结构来处理解析树字符串。
from nltk.tree import Tree
parsed = Tree('(ROOT (S (NP (PRP It)) (VP (VBZ is) (ADJP (RB so) (JJ nice))) (. .)))')

然而,数据结构似乎受到限制。 是否有可能通过节点的字符串值获取并导航到顶部或底部?

例如,假设您想获取字符串值为'nice'的节点,然后查看其父节点、子节点等。这可通过nltk的Tree实现吗?


另外,请参见https://dev59.com/OXHYa4cB1Zd3GeqPP82i?rq=1 - Jesuisme
1个回答

12
对于 NLTK 3.0 版本,您需要使用 ParentedTree 子类。使用您提供的示例树,创建一个 ParentedTree 并搜索您想要的节点。
请参考:http://www.nltk.org/api/nltk.html#nltk.tree.ParentedTree
from nltk.tree import ParentedTree
ptree = ParentedTree.fromstring('(ROOT (S (NP (PRP It)) \
        (VP (VBZ is) (ADJP (RB so) (JJ nice))) (. .)))')

leaf_values = ptree.leaves()

if 'nice' in leaf_values:
    leaf_index = leaf_values.index('nice')
    tree_location = ptree.leaf_treeposition(leaf_index)
    print tree_location
    print ptree[tree_location]

您可以直接遍历树来获取子树。parent() 方法用于查找给定子树的父树。
以下是使用更深层次的树进行子树和父树示例的代码:
from nltk.tree import ParentedTree
ptree = ParentedTree.fromstring('(ROOT (S (NP (JJ Congressional) \
    (NNS representatives)) (VP (VBP are) (VP (VBN motivated) \
    (PP (IN by) (NP (NP (ADJ shiny) (NNS money))))))) (. .))')

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

        if t.height() == 2:   #child nodes
            print t.parent()
            return

        for child in t:
            traverse(child)

traverse(ptree)

此外:一个“树位置”是一个元组,描述了树上的路径。因此,如果您有节点的路径,例如答案中的tree_location,其父节点将在tree_location[:-1]处。这适用于TreeParentedTree - alexis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接