给定Tree T,有时候是否为二进制,我需要检索与每个分支中的条件匹配的最低节点。
所以,我需要检索那些红色标记节点的列表(数组),其中label
等于" NP" node.label() == 'NP'
。
实际上我使用的是NLTK Tree( 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
答案 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