有没有办法在 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语料库训练的。我对您的例句进行了非常准确的解析,但是解析器并不完美,并且在其他句子上可能会大错特错。在此处查看其标签的说明。它假设您已经对语言学和英语语法有一些基本的了解。
编辑:顺便说一句,这就是我从 Python 访问 OpenNLP 的方式。这假设您在 opennlp-tools-1.4.3 文件夹中有 OpenNLP jar 和模型文件。
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:]))