2015-10-15 9 views
5

Ottengo risultati seguenti quando eseguo parser stanford da nltk.Estrazione della regola di grammatica dal risultato analizzato

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

ma ho bisogno nella forma

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

Come posso ottenere questo risultato, magari utilizzando la funzione ricorsiva. Esiste già una funzione integrata?

risposta

5

primo a navigare in un albero, vedi How to iterate through all nodes of a tree? e 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) 

E quello che stai cercando è 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'] 

Nota che Tree.productions() restituisce un oggetto Production, vedi https://github.com/nltk/nltk/blob/develop/nltk/tree.py#L22 e https://github.com/nltk/nltk/blob/develop/nltk/grammar.py#L236.

Se si desidera una forma di stringa delle regole grammaticali, è possibile fare:

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

O

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