Есть ли способ разложить сложные предложения на простые предложения в nltk или других библиотеках обработки естественного языка?
Например:
] Парк так прекрасен, когда солнце садится и дует прохладный ветерок ==> Солнце садится. дует прохладный ветерок. Парк такой замечательный.
Это намного сложнее, чем кажется, поэтому вы вряд ли найдете идеально чистый метод.
Однако, используя синтаксический анализатор английского языка в 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. Предполагается, что у вас есть файл OpenNLP jar и файлы модели в папке 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:]))