Python 使用过滤器检索图形最低高度节点
给定一个树T,有时是二进制的,有时不是,我需要检索与每个分支中的条件匹配的最低节点 因此,我需要检索这些红色标记节点的列表(数组),其中它们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
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
中。