使用过滤器检索图最低高度节点

时间:2016-04-01 20:16:00

标签: python algorithm graph tree nltk

给定Tree T,有时候是否为二进制,我需要检索与每个分支中的条件匹配的最低节点。

所以,我需要检索那些红色标记节点的列表(数组),其中label等于" NP" node.label() == 'NP'

实际上我使用的是NLTK Tree( 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 个答案:

答案 0 :(得分: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始终为空,则会将所有有效节点附加到下一级,但会在t中找到并返回任何结尾的“NP”节点,你想在递归中将它们传递到一个级别。

编辑:唯一可能失败的情况是顶级节点是“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