2015-05-07 3 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', [])])] 

Но как я могу включить что я извлекаю только те узлы NP, у которых есть дочерний узел NNP?

Любая помощь будет очень признательна заново.

(Вообще, если есть эксперт по 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)) 

Это может произойти сбой, однако, когда ваше поддерево/х [0] не имеет метки (если это терминал, для пример). Или бросайте IndexError, когда ваш NP полностью пуст. Но я бы сказал, что сценарий этого сценария очень вероятен. Однако, возможно, я наблюдаю за этим, и вы можете захотеть построить дополнительные проверки ...

Смежные вопросы