Разбиение / Разложение сложных и составных предложений в nltk

Есть ли способ разложить сложные предложения на простые предложения в nltk или других библиотеках обработки естественного языка?

Например:

] Парк так прекрасен, когда солнце садится и дует прохладный ветерок ==> Солнце садится. дует прохладный ветерок. Парк такой замечательный.

8
задан Sharmila 17 August 2010 в 10:22
поделиться

1 ответ

Это намного сложнее, чем кажется, поэтому вы вряд ли найдете идеально чистый метод.

Однако, используя синтаксический анализатор английского языка в 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:]))
11
ответ дан 5 December 2019 в 15:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: