Это намного сложнее, чем кажется, поэтому вы вряд ли найдете идеально чистый метод.
Однако, используя синтаксический анализатор английского языка в 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:]))
person
Cerin
schedule
18.08.2010