有没有办法在nltk或其他自然语言处理库中将复杂句子分解为简单句子?
例如:
当太阳落山,凉风吹来时,公园真是太棒了==>太阳落山了。凉风吹来。公园太棒了。
答案 0 :(得分:11)
这比看起来要复杂得多,所以你不太可能找到一个非常干净的方法。
但是,使用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语料库进行训练。我在你的例句中获得了非常准确的解析,但解析器并不完美,在其他句子上可能会出现严重错误。 Look here有关其标签的说明。它假设您已经对语言学和英语语法有了一些基本的了解。
编辑:顺便说一句,这是我从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:]))