NLTK树数据结构,查找一个节点,它是父节点还是子节点

发布于 2021-01-29 18:09:50

我正在使用nltk的Tree数据结构来处理parsetree字符串。

from nltk.tree import Tree
parsed = Tree('(ROOT (S (NP (PRP It)) (VP (VBZ is) (ADJP (RB so) (JJ nice))) (. .)))')

但是,数据结构似乎受到限制。是否可以通过其字符串值获取节点,然后导航至顶部或底部?

例如,假设您要获取字符串值为 ‘nice’ 的节点,然后查看其父级,子级等是什么?可以通过nltk的Tree实现该节点吗?

关注者
0
被浏览
148
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    对于NLTK 3.0,您想使用ParentedTree子类。

    http://www.nltk.org/api/nltk.html#nltk.tree.ParentedTree

    使用给定的示例树,创建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)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看