【问题标题】:NLTK tree data structure, finding a node, it's parent or childrenNLTK 树数据结构,找到一个节点,它是父节点还是子节点
【发布时间】:2014-09-12 18:57:44
【问题描述】:

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

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

然而,数据结构似乎是有限的。 是否可以通过它的字符串值获取一个节点,然后导航到顶部或底部?

例如假设你想获取字符串值为'nice'的节点,然后看看它的父、子等是什么。通过nltk的树可以实现吗?

【问题讨论】:

标签: python tree nltk parse-tree


【解决方案1】:

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

【讨论】:

  • 另外:“树位置”是一个元组,描述了沿着树向下的路径。因此,如果您有一个节点的路径,例如答案中的tree_location,其父节点将位于tree_location[:-1]。这适用于TreeParentedTree
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-06
  • 2014-04-28
  • 2014-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多