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

Python 使用过滤器检索图形最低高度节点,python,algorithm,graph,tree,nltk,Python,Algorithm,Graph,Tree,Nltk,给定一个树T,有时是二进制的,有时不是,我需要检索与每个分支中的条件匹配的最低节点 因此,我需要检索这些红色标记节点的列表(数组),其中它们label等于“NP”node.label() 实际上我使用的是NLTK树(NLTK.Tree.Tree)数据结构,但是您只能发布伪代码,我可以实现它 以下是我尝试过的代码: def traverseTree(tree): if not isinstance(tree, nltk.Tree): return [] h = [] for subt

给定一个树T,有时是二进制的,有时不是,我需要检索与每个分支中的条件匹配的最低节点

因此,我需要检索这些红色标记节点的列表(数组),其中它们
label
等于“NP”
node.label()

实际上我使用的是NLTK树(NLTK.Tree.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

您有一个条件,即如果没有更好的规范候选者,则追加子树,但是如果
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”的子节点,则此操作将失败,在这种情况下,应将
添加到
h

#after for loop has finished
if len(h) == 0 and tree.label() == "NP":
    h.append(tree)
return h
edit2:如果将
添加到
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

我不确定这是否正确,因为我只想添加嵌套的节点,因此,如果我在当前
子树
上方找到任何节点,我不应该添加它如果您在当前子树上方找到任何节点?您只查看子树,因此从不检查当前子树上方是否有节点。试想一下:
t
表示在其分支底部为“np”的所有节点,
如果len(t)==0
和subtree.label()==“np”`则子树是有效节点,但如果
t
不为空,则表示在分支的更下方有“np”节点,它们存储在
t
中。