2015-10-15 22 views
5

Ich bekomme folgendes Ergebnis, wenn ich Stanford Parser von Nltk ausführen.Grammar Regel Extraktion von geparsten Ergebnis

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

, aber ich brauche es in Form

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

Wie kann ich dieses Ergebnis zu erhalten, vielleicht rekursive Funktion. Gibt es bereits eingebaute Funktion?

Antwort

5

Erstes einen Baum zu navigieren, sehen How to iterate through all nodes of a tree? und 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) 

Und was Sie suchen ist 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'] 

Beachten Sie, dass Tree.productions() gibt ein Production Objekt finden https://github.com/nltk/nltk/blob/develop/nltk/tree.py#L22 und https://github.com/nltk/nltk/blob/develop/nltk/grammar.py#L236.

Wenn Sie eine Zeichenfolge Form der Grammatikregeln möchten, können Sie entweder tun:

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

Oder

>>> 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'"]