2010-08-17 45 views
8

Có cách nào để phân tách các câu phức tạp thành các câu đơn giản trong nltk hoặc các thư viện xử lý ngôn ngữ tự nhiên khác không?Break/Decompose câu phức tạp và phức hợp trong nltk

Ví dụ:

Công viên thật tuyệt vời khi mặt trời lặn và gió mát thổi ==> Mặt trời đang lặn. một làn gió mát thổi. Công viên thật tuyệt vời.

Trả lời

10

Điều này phức tạp hơn nhiều so với hình như vậy, vì vậy bạn không thể tìm được phương pháp hoàn toàn sạch sẽ.

Tuy nhiên, bằng cách sử dụng phân tích cú pháp tiếng Anh tại OpenNLP, tôi có thể đưa câu ví dụ của bạn và có được một cây ngữ pháp sau:

(S 
    (NP (DT The) (NN park)) 
    (VP 
     (VBZ is) 
     (ADJP (RB so) (JJ wonderful)) 
     (SBAR 
     (WHADVP (WRB when)) 
     (S 
      (S (NP (DT the) (NN sun)) (VP (VBZ is) (VP (VBG setting)))) 
      (CC and) 
      (S 
      (NP (DT a) (JJ cool) (NN breeze)) 
      (VP (VBZ is) (VP (VBG blowing))))))) 
    (. .))) 

Từ đó, bạn có thể nhặt nó ngoài như bạn muốn. Bạn có thể nhận được các mệnh đề phụ của bạn bằng cách giải nén cấp cao nhất (NP *) (VP *) trừ đi phần (SBAR *). Và sau đó bạn có thể chia kết hợp bên trong (SBAR *) thành hai câu lệnh khác.

Lưu ý, trình phân tích cú pháp OpenNLP được đào tạo bằng cách sử dụng kho dữ liệu Penn Treebank. Tôi nhận được một phân tích khá chính xác về câu ví dụ của bạn, nhưng trình phân tích cú pháp không hoàn hảo và có thể cực kỳ sai về các câu khác. Look here để được giải thích về các thẻ của nó. Nó giả định bạn đã có một số hiểu biết cơ bản về ngôn ngữ học và ngữ pháp tiếng Anh.

Chỉnh sửa: Btw, đây là cách tôi truy cập OpenNLP từ Python. Điều này giả sử bạn có các tệp jar và mô hình OpenNLP trong thư mục opennlp-tools-1.4.3.

import os, sys 
from subprocess import Popen, PIPE 
import nltk 

BP = os.path.dirname(os.path.abspath(__file__)) 
CP = "%(BP)s/opennlp-tools-1.4.3.jar:%(BP)s/opennlp-tools-1.4.3/lib/maxent-2.5.2.jar:%(BP)s/opennlp-tools-1.4.3/lib/jwnl-1.3.3.jar:%(BP)s/opennlp-tools-1.4.3/lib/trove.jar" % dict(BP=BP) 
cmd = "java -cp %(CP)s -Xmx1024m opennlp.tools.lang.english.TreebankParser -k 1 -d %(BP)s/opennlp.models/english/parser" % dict(CP=CP, BP=BP) 
p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True) 
stdin, stdout, stderr = (p.stdin, p.stdout, p.stderr) 
text = "This is my sample sentence." 
stdin.write('%s\n' % text) 
ret = stdout.readline() 
ret = ret.split(' ') 
prob = float(ret[1]) 
tree = nltk.Tree.parse(' '.join(ret[2:])) 
+0

Cảm ơn bạn Chris, Nó hoạt động! – Sharmila

+0

Tôi phân tích cú pháp câu ví dụ với Stanford corenlp và mệnh đề cấp dưới không được phân tích cú pháp chính xác. Vì vậy, giống như Cerin đã nói, các mô hình không chính xác 100% và có thể cho các cây phân tích không chính xác. –

Các vấn đề liên quan