2016-04-01 1 views
1

Учитывая дерево T, иногда двоичное или нет, мне нужно получить самый низкий узел, который соответствует критериям в каждой ветви.Получить граф Самый низкий узел высоты с фильтром

Итак, мне нужно получить список (массив) этих красных отмеченных узлов, где они label равно «NP» node.label() == 'NP'.

На самом деле я использую дерево NLTK (nltk.tree.Tree), но вы можете публиковать только псевдокод, и я могу его реализовать.

Example of Tree

Вот код, который я пытался:

def traverseTree(tree): 
    if not isinstance(tree, nltk.Tree): return [] 
    h = [] 
    for subtree in tree: 
    if type(subtree) == nltk.tree.Tree: 
     t = traverseTree(subtree) 
     if subtree.label() == 'NP' and len(t) == 0: h.append(subtree) 
    return h 

ответ

1

у вас есть условное, что если нет лучше кандидатов для вашей спецификации затем добавить поддерево, но что, если len(t)>0? в том случае, если вы хотите, чтобы узлы были найдены в подразделах вызовов:

def traverseTree(tree): 
    if not isinstance(tree, nltk.Tree): return [] 
    h = [] 
    for subtree in tree: 
    if type(subtree) == nltk.tree.Tree: 
     t = traverseTree(subtree) 
     #RIGHT HERE!! need to extend by t or the other found nodes are thrown out 
     h.extend(t) 

     if subtree.label() == 'NP' and len(t) == 0: 
      h.append(subtree) 

    return h 

Имейте в виду, что если t всегда пусто вы бы добавить все допустимые узлы один уровень ниже, но любой конец из-филиала «NP «узлы будут найдены и возвращены в t, поэтому вы хотите передать им уровень в рекурсии.

Редактировать: единственный случай, когда это было бы потерпеть неудачу, если узел верхнего уровня является «NP» и нет подузлов «NP» в этом случае tree должны быть добавлены к h:

#after for loop has finished 
if len(h) == 0 and tree.label() == "NP": 
    h.append(tree) 
return h 

edit2: если вы добавите tree в h, тогда проверка на поддеревья никогда не будет реализована, так как они проверяют один и тот же узел с теми же условностями только на разных уровнях рекурсии, поэтому вы можете просто написать функцию следующим образом:

def traverseTree(tree): 
    if not isinstance(tree, nltk.Tree): return [] 
    h = [] 
    for subtree in tree: 
     #no need to check here as well as right inside the call 
     h.extend(traverseTree(subtree)) 
    if tree.label() == 'NP' and len(h) == 0: 
     h.append(tree) 
    return h 
+0

Я не уверен, что это правильно, потому что я хочу только добавить вложенный, поэтому, если бы я нашел какой-либо Node над текущим 'поддеревом', я бы не добавил его –

+0

, если вы обнаружили какие-либо узлы _above_ текущего поддерево? Вы только смотрите на _subtrees_, поэтому никогда не проверяете, есть ли узел над текущим. Просто подумайте об этом: 't' представляет все узлы, которые являются« np »в нижней части своих ветвей,' if len (t) == 0' и subtree.label() == "NP" ', тогда поддерево действительный узел, но если 't' не является пустым, это означает, что в ветке есть еще« np »узлы, и они хранятся в' t'. –

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