簡體   English   中英

NLTK樹數據結構,查找節點,它的父節點或子節點

[英]NLTK tree data structure, finding a node, it's parent or children

我使用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的樹實現?

對於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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM