2015-05-07 48 views
0

我問過我如何正確導航通過NTLK樹。導航NLTK樹(後續)

如何正確瀏覽NLTK樹(或ParentedTree)?我想用父節點「VBZ」來標識某個葉子,然後我想從那裏進一步向上移動並向左移動以標識NP節點。

Original question

並提供瞭如下圖所示:

NLTK tree

我從湯米以下(非常有用)答案(謝謝!):

from nltk.tree import * 

np_trees = [] 

def traverse(t): 
    try: 
     t.label() 
    except AttributeError: 
     return 

    if t.label() == "VBZ": 
     current = t 
     while current.parent() is not None: 

      while current.left_sibling() is not None: 

       if current.left_sibling().label() == "NP": 
        np_trees.append(current.left_sibling()) 

       current = current.left_sibling() 

      current = current.parent() 

    for child in t: 
     traverse(child) 

tree = ParentedTree.fromstring("(S (NP (NNP)) (VP (VBZ) (NP (NNP))))") 
traverse(tree) 
print np_trees # [ParentedTree('NP', [ParentedTree('NNP', [])])] 

但我怎麼能包括th我只提取那些有NNP子節點的NP節點?

任何幫助將不勝感激。

(一般情況下,如果在你們中間NLTK樹木任何專家,我很想跟你聊天,以換取一些真知灼見交幾個咖啡。)

回答

2

我平時用的子樹功能與此相結合的過濾器。 更改你的樹稍,以表明它只是選擇之一NP的現在:

>>> tree = ParentedTree.fromstring("(S (NP (NNP)) (VP (VBZ) (NP (NNS))))") 
>>> for st in tree.subtrees(filter = lambda x: x.label() == "NP" and x[0].label() == 'NNP'): 
...  print(st) 
... 
(NP (NNP)) 

然而,這可能會崩潰,當你的樹/ X [0]沒有一個標籤(當它是一個終端,用於例)。或者當你的NP完全空時拋出一個IndexError。但我會說那些場景很不可能。但是,很可能我在這裏監督着事情,你可能想建立一些額外的檢查...