Đ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:]))
Cảm ơn bạn Chris, Nó hoạt động! – Sharmila
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. –