2016-07-25 8 views
0

私はSCPを使用して英語の文章の解析CFGツリーを取得しています。Stanford CoreNLP Python Parserを使用して特定の出力を作成する

from corenlp import * 
corenlp = StanfordCoreNLP() 
corenlp.parse("Every cat loves a dog") 

私の予想される出力は、このようなツリー:

(S (NP (DET Every) (NN cat)) (VP (VT loves) (NP (DET a) (NN dog)))) 

しかし、私が得たもの:

(ROOT (S (NP (DT Every) (NN cat)) (VP (VBZ loves) (NP (DT a) (NN dog))))) 

どのように予想されるようにPOSタグを変更し、ルートノードを削除するには?

おかげ

+0

期待される出力はどこから得られますか? POSタグは、CoreNLPが解析する[Penn Treebankタグ](http://www.comp.leeds.ac.uk/ccalas/tagsets/upenn.html)ではありません。 –

答えて

1

あなたはNLTKからnltk.treeモジュールを使用することができます。

from nltk.tree import * 

def traverse(t): 
    try: 
     # Replace Labels 
     if t.label() == "DT": 
      t.set_label("DET") 
     elif t.label() == "VBZ": 
      t.set_label("VT") 
    except AttributeError: 
     return 

    for child in t: 
     traverse(child) 

output_tree= "(ROOT (S (NP (DT Every) (NN cat)) (VP (VBZ loves) (NP (DT a) (NN dog)))))" 
tree = ParentedTree.fromstring(output_tree) 

# Remove ROOT Element 
if tree.label() == "ROOT": 
    tree = tree[0] 

traverse(tree) 
print tree 
# (S (NP (DET Every) (NN cat)) (VP (VT loves) (NP (DET a) (NN dog)))) 
+0

ありがとう、しかし、木の出力を普通の文字列(1行の文字列)に変換する方法はありますか?私が持っているものは、マルチラインと多くの余分なスペースを持つツリーです... ありがとう! – suckerlynch

+0

最終的な "プリントツリー"出力は1行のみで表示されます。あなたはチェックすることができます - new_tree = str(ツリー);または、new_tree = re.sub( "[\ s] +"、 ""、str(tree))を使用することもできます。 – RAVI

関連する問題