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

6 投票
1 回答
13852 浏览
提问于 2025-04-21 09:01

我正在使用nltk的树形数据结构来处理解析树字符串。

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

不过,这个数据结构似乎有一些限制。有没有办法通过字符串值找到一个节点,然后再往上或往下查找呢?

比如说,如果你想找到字符串值为'nice'的节点,然后看看它的父节点、子节点等等。这能通过nltk的树形结构实现吗?

1 个回答

12

对于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)

撰写回答