2016-12-15 2 views
2

私は、「サービス」このような-subtrees(および他のいくつかのタイプ)ペンツリーバンクv2の木を処理し、しばしば遭遇nltkを使ってptbパーズツリーの-NONE-と* T * -iを取り除くには?

enter image description here

私は手動で私が実際にさらに使用するノードを洗練するためのルールの多くを追加することができます(スタンフォードパーサーが返すものと同じように、タグやトークンを解析し、「ああ、見てください」リンクや「ここにノードがある」必要はありませんが)、これらのサービスノードや巨大なギャップ「ブランチブランチ」(上記の-NONE-ノードを削除した場合、SBARには子供が全くいなくなりましたが、奇妙です)。

from nltk.corpus import ptb; ptb.parsed_sents()とすべての出力から、実際の解析(単語、タグ、句読点)以外のすべてを削除できるのだろうか?

答えて

1

トレースを支配するサブツリーを削除します。以下では、サブツリーを反復処理しますが、実際には子をチェックします。これにより、空のサブツリーを含むノードを変更して、空のサブツリーを簡単に削除することができます。

for sub in some_tree.subtrees(): 
    for n, child in enumerate(sub): 
     if isinstance(child, str): 
      continue 
     if all(leaf.startswith("*") for leaf in child.leaves()): 
      del sub[n] # Delete this child 

私はトレースを検出する簡単な基準としてleaf.startswith("*")を使用しました。必要に応じて自分のものと交換してください。

編集:あなたは-NONE-をラベルだけサブツリーを含むすべてのノードを削除したい、このような各サブツリーは、正確に1つのリーフを支配しているのでは、以下のテストを使用します。今

if len(list(child.subtrees(filter=lambda x:x.label()=='-NONE-')))==len(child.leaves()): 
     del sub[n] 
+0

どうすれば '-NONE-'なのでしょうか?問題は、これらのサービスノードのすべての種類がわからないことです。問題の具体的な例を提示しました –

+0

削除の基準がすべての「-NONE」ノードと結果として空になるすべての上位ノードを削除することになっている場合は、それに応じて基準を変更する必要があります。このタグが常に高さ1で発生する場合は、かなり簡単です。葉が残っているように多くの '-NONE-'ノードを支配するサブツリーを削除してください。 – alexis

+0

@alexisという具体的な回答をありがとう!それは非常に便利ですが、私が言及した問題は少し異なります。私は、「他のすべて」が何であるかを事前に知らなくても、自分自身を解析する以外のすべてを取り除くことができるかどうか疑問に思っていました。そこにはこれらの痕跡と共同索引があり、残ります。それは最初の非常に便利なスニペットですが、 –

0

おかげで、以下の回答@alexsisへのIそれらのことがトレースと共同指数と呼ばれていることを知ってください。 treetoolsパッケージには、implementationdef ptb_delete_traces(tree)が見つかりました。

関連する問題