2015-10-15 9 views
5

मुझे निम्नलिखित परिणाम मिलते हैं जब मैं nltk से स्टैनफोर्ड पार्सर निष्पादित करता हूं।पार्स किए गए परिणाम से व्याकरण नियम निष्कर्षण

(S (VP (VB get) (NP (PRP me)) (ADVP (RB now)))) 

लेकिन मैं यह प्रपत्र

S -> VP 
VP -> VB NP ADVP 
VB -> get 
PRP -> me 
RB -> now 

मैं इस परिणाम कैसे प्राप्त कर सकते हैं में की जरूरत है, शायद पुनरावर्ती क्रिया का उपयोग कर। क्या पहले से ही निर्मित फ़ंक्शन है?

उत्तर

5

एक पेड़ से नेविगेट करने के How to iterate through all nodes of a tree? और How to navigate a nltk.tree.Tree? देखते हैं, पहले:

>>> from nltk.tree import Tree 
>>> bracket_parse = "(S (VP (VB get) (NP (PRP me)) (ADVP (RB now))))" 
>>> ptree = Tree.fromstring(bracket_parse) 
>>> ptree 
Tree('S', [Tree('VP', [Tree('VB', ['get']), Tree('NP', [Tree('PRP', ['me'])]), Tree('ADVP', [Tree('RB', ['now'])])])]) 
>>> for subtree in ptree.subtrees(): 
...  print subtree 
... 
(S (VP (VB get) (NP (PRP me)) (ADVP (RB now)))) 
(VP (VB get) (NP (PRP me)) (ADVP (RB now))) 
(VB get) 
(NP (PRP me)) 
(PRP me) 
(ADVP (RB now)) 
(RB now) 

और क्या आप देख रहे हैं https://github.com/nltk/nltk/blob/develop/nltk/tree.py#L341 है:

>>> ptree.productions() 
[S -> VP, VP -> VB NP ADVP, VB -> 'get', NP -> PRP, PRP -> 'me', ADVP -> RB, RB -> 'now'] 

ध्यान दें कि Tree.productions() रिटर्न एक Production वस्तु https://github.com/nltk/nltk/blob/develop/nltk/tree.py#L22 देख सकते हैं और https://github.com/nltk/nltk/blob/develop/nltk/grammar.py#L236

आप व्याकरण के नियमों की एक स्ट्रिंग रूप चाहते हैं, तो आप या तो कर सकते हैं:

>>> for rule in ptree.productions(): 
...  print rule 
... 
S -> VP 
VP -> VB NP ADVP 
VB -> 'get' 
NP -> PRP 
PRP -> 'me' 
ADVP -> RB 
RB -> 'now' 

या

>>> rules = [str(p) for p in ptree.productions()] 
>>> rules 
['S -> VP', 'VP -> VB NP ADVP', "VB -> 'get'", 'NP -> PRP', "PRP -> 'me'", 'ADVP -> RB', "RB -> 'now'"] 
संबंधित मुद्दे