2015-10-15 20 views
5

Tôi nhận được kết quả sau khi tôi thực thi trình phân tích cú pháp stanford từ nltk.Trích xuất quy tắc ngữ pháp từ kết quả được phân tích cú pháp

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

nhưng tôi cần nó dưới dạng

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

Làm thế nào tôi có thể nhận được kết quả này, có lẽ sử dụng hàm đệ quy. Có chức năng tích hợp sẵn không?

Trả lời

5

Đầu tiên để di chuyển một cây, xem 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) 

Và những gì bạn đang tìm kiếm là 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'] 

Lưu ý rằng Tree.productions() trả về một đối tượng Production, xem https://github.com/nltk/nltk/blob/develop/nltk/tree.py#L22https://github.com/nltk/nltk/blob/develop/nltk/grammar.py#L236.

Nếu bạn muốn có một hình thức chuỗi các quy tắc ngữ pháp, bạn có thể làm:

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

Hoặc

>>> 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'"] 
Các vấn đề liên quan