6

我正在使用 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 的树实现?

4

1 回答 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)
于 2014-09-22T11:20:17.260 回答