Это намного сложнее, чем кажется, поэтому вы вряд ли найдете идеально чистый метод.
Однако, используя анализатор английского языка в OpenNLP , я могу взять ваш примерпредложение и получить следующее грамматическое дерево:
(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)))))))
(. .)))
Оттуда вы можете выбрать его, как вам нравится.Вы можете получить свои подпункты путем извлечения верхнего уровня (NP *) (VP *) минус раздел (SBAR *).И затем вы можете разделить соединение внутри (SBAR *) на два других оператора.
Обратите внимание, что парсер OpenNLP обучается с использованием Penn Treebank корпус.Я получил довольно точный анализ вашего примера предложения, но синтаксический анализатор не идеален и может быть совершенно неверным в других предложениях. Смотрите здесь для объяснения его тегов.Предполагается, что у вас уже есть некоторое базовое понимание лингвистики и грамматики английского языка.
Редактировать: Кстати, именно так я и получаю доступ к OpenNLP из Python.Это предполагает, что у вас есть файлы jar и модели OpenNLP в папке 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:]))