Я задал вопрос, как правильно перемещаться по дереву NTLK.Навигация по дереву NLTK (последующий)
Как правильно перемещаться по дереву NLTK (или ParentedTree)? Я хотел бы идентифицировать определенный лист с родительским узлом «VBZ», затем я хотел бы перейти оттуда дальше вверх по дереву и влево, чтобы идентифицировать узел NP.
И при условии следующей иллюстрации:
я получил следующее (очень полезно) ответ от Томми (спасибо!):
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 деревьев среди вас, я хотел бы поговорить с вами и заплатить несколько кофе в обмен на немного понимания.)