2016-04-01 18 views
1

ツリーT(バイナリである場合もありません)を指定すると、各ブランチの基準に一致する最下位ノードを取得する必要があります。グラフを取得する最下位ノードのフィルタ付き

したがって、labelが「NP」node.label() == 'NP'に等しいこれらの赤色のマークされたノードのリスト(配列)を取得する必要があります。

実際にはNLTKツリー(nltk.tree.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は常に空である場合は、1つのレベル以下のすべての有効なノードを追加することを忘れないでください、しかし、任意のエンド・オブ・ブランチ「NP "ノードは見つけられ、tに返されるので、再帰のレベルを渡す必要があります。

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

編集:最上位レベルのノードが「NP」とtreehに追加すべき場合には、「NP」のないサブノードが存在しない場合、これが失敗する場合のみです

edit2:treehを追加すると、サブツリーのチェックは、同じノードを異なるレベルの再帰レベルで同じノードでチェックしているので、決して実際には成立しません。したがって、実際にこのような関数を書くことができます:

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

現在の 'subtree'の上にNodeが見つかった場合は、入れ子のノードを追加したいだけなので、これが正しいかどうか分かりません。ノードを見つけたら –

+0

を追加しないでください_above_現在サブツリー?あなたは_subtrees_だけを見ているので、現在のノードの上にノードがあるかどうかは決して確認しません。それについて考えてみましょう: 't'はブランチの一番下の 'np'であるすべてのノードを表し、' len(t)== 0なら 'subtree.label()== 'NP''ならばサブツリーはa 't'が空でない場合は、ブランチにさらに下に" np "個のノードがあり、それらが' t'に格納されていることを意味します。 –

関連する問題