2015-10-15 21 views
5

Otrzymuję następujący wynik, gdy wykonuję parser stanford z nltk.Wyodrębnianie reguł gramatycznych z analizowanego wyniku

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

ale muszę go w formie

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

Jak mogę uzyskać taki wynik, być może przy użyciu funkcji rekurencyjnej. Czy jest już wbudowana funkcja?

Odpowiedz

5

Pierwszy poruszać się drzewa, patrz How to iterate through all nodes of a tree? i 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) 

i czego szukasz 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'] 

Zauważ, że Tree.productions() zwraca Production przedmiotu, zobacz https://github.com/nltk/nltk/blob/develop/nltk/tree.py#L22 i https://github.com/nltk/nltk/blob/develop/nltk/grammar.py#L236.

Jeśli chcesz formę ciąg reguł gramatycznych, można zrobić:

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

Albo

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