Разбивать / Разлагать сложные и сложные предложения в nltk - PullRequest
8 голосов
/ 17 августа 2010

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

Например:

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

1 Ответ

11 голосов
/ 18 августа 2010

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

Однако, используя анализатор английского языка в 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:]))
...