2016-09-04 6 views
4

NLP解析木を句(独立および従属)に分割する方法は?

(ROOT (S (NP (PRP You)) (VP (MD could) (VP (VB say) (SBAR (IN that) (S (NP (PRP they)) (ADVP (RB regularly)) (VP (VB catch) (NP (NP (DT a) (NN shower)) (, ,) (SBAR (WHNP (WDT which)) (S (VP (VBZ adds) (PP (TO to) (NP (NP (PRP$ their) (NN exhilaration)) (CC and) (NP (FW joie) (FW de) (FW vivre))))))))))))) (. .))) 

オリジナルの文章のようなNLPの解析木をされて考えると、「あなたは、彼らが定期的に彼らの爽快感と生きる喜びに追加のシャワーを、捕まえることを言うことができます。」

どのように句を抽出してリバースエンジニアリングすることができますか?私たちは、SおよびSBARで分割されるだろう はSで

- You could say 
- that they regularly catch a shower 
- , which adds to their exhilaration and joie de vivre. 

分割に到着する

- (S (NP (PRP You)) (VP (MD could) (VP (VB say) 
- (SBAR (IN that) (S (NP (PRP they)) (ADVP (RB regularly)) (VP (VB catch) (NP (NP (DT a) (NN shower)) 
- (, ,) (SBAR (WHNP (WDT which)) (S (VP (VBZ adds) (PP (TO to) 
    (NP (NP (PRP$ their) (NN exhilaration)) (CC and) (NP (FW joie) (FW 
    de) (FW vivre))))))))))))) (. .))) 

(劣後句の種類を、例えばを維持するため)、SBARは非常に簡単に思えます。問題は、断片からすべてのPOSタグとチャンクを取り除いているようです。

答えて

4

Tree.subtrees()を使用できます。詳細については、NLTK Tree Classを参照してください。

コード:

from nltk import Tree 

parse_str = "(ROOT (S (NP (PRP You)) (VP (MD could) (VP (VB say) (SBAR (IN that) (S (NP (PRP they)) (ADVP (RB regularly)) (VP (VB catch) (NP (NP (DT a) (NN shower)) (, ,) (SBAR (WHNP (WDT which)) (S (VP (VBZ adds) (PP (TO to) (NP (NP (PRP$ their) (NN exhilaration)) (CC and) (NP (FW joie) (FW de) (FW vivre))))))))))))) (. .)))" 
#parse_str = "(ROOT (S (SBAR (IN Though) (S (NP (PRP he)) (VP (VBD was) (ADJP (RB very) (JJ rich))))) (, ,) (NP (PRP he)) (VP (VBD was) (ADVP (RB still)) (ADJP (RB very) (JJ unhappy))) (. .)))" 

t = Tree.fromstring(parse_str) 
#print t 

subtexts = [] 
for subtree in t.subtrees(): 
    if subtree.label()=="S" or subtree.label()=="SBAR": 
     #print subtree.leaves() 
     subtexts.append(' '.join(subtree.leaves())) 
#print subtexts 

presubtexts = subtexts[:]  # ADDED IN EDIT for leftover check 

for i in reversed(range(len(subtexts)-1)): 
    subtexts[i] = subtexts[i][0:subtexts[i].index(subtexts[i+1])] 

for text in subtexts: 
    print text 

# ADDED IN EDIT - Not sure for generalized cases 
leftover = presubtexts[0][presubtexts[0].index(presubtexts[1])+len(presubtexts[1]):] 
print leftover 

出力:

You could say 
that 
they regularly catch a shower , 
which 
adds to their exhilaration and joie de vivre 
. 
+0

うわー!素晴らしい! @ RAVIあなたはかなりNLPの達人です!どこに連絡しますか? :) – giorgio79

+0

このようないくつかのパーズでは、このアルゴが失敗していることに気付きました。(ROOT(S)(SBP))(VP(VBPがVBDだった)(ADJP(RB非常に)(JJリッチ)) ADVP(RB非常に)(JJ不幸)))()。))) ' – giorgio79

+0

回答が更新されました。 – RAVI

関連する問題