2013-09-27 202 views
7

Tôi có đoạn mã sau bằng Python.Làm thế nào để tạo ra nhiều phân tích cây cho một câu mơ hồ trong NLTK?

sent = [("very","ADJ"),("colourful","ADJ"),("ice","NN"),("cream","NN"),("van","NN")] 
patterns= r""" 
    NP:{<ADJ>*<NN>+} 

""" 
NPChunker=nltk.RegexpParser(patterns) # create chunk parser 
for s in NPChunker.nbest_parse(sent): 
    print s.draw() 

Đầu ra là:

(S (NP very/ADJ colourful/ADJ ice/NN cream/NN van/NN)) 

Nhưng đầu ra nên có thêm 2 cây phân tích cú pháp.

(S (NP very/ADJ colourful/ADJ ice/NN) (NP cream/NN) (NP van/NN)) 
(S (NP very/ADJ colourful/ADJ ice/NN cream/NN) van/NN) 

Vấn đề là chỉ biểu thức chính quy đầu tiên được thực hiện bởi RegexpParser. Làm thế nào tôi có thể tạo ra tất cả các phân tích cú pháp cây có thể cùng một lúc?

Trả lời

3

Điều này là không thể với lớp RegexpParser. Nó thừa hưởng phương thức nbest_parse từ giao diện ParserI, và nhìn vào mã nguồn (https://github.com/nltk/nltk/blob/master/nltk/parse/api.py), nó có thể được thấy rằng nó chỉ mặc định để chạy phương thức phân tích cú pháp của lớp cơ sở và trả về nó như là một iterable.

Khi ai đó cố gắng giải thích trong Chunking with nltk, các lớp chunking không phải là công cụ để sử dụng cho mục đích này (chưa!), Có một cái nhìn tại http://nltk.org/book/ch08.html, có một số ví dụ nhanh, mà sẽ chỉ đưa bạn một nửa với những gì bạn muốn đạt được, đòi hỏi rất nhiều thiết kế trước khi chế biến và thông minh.