在nltk中拆分复杂和复合句

9 投票
1 回答
6368 浏览
提问于 2025-04-16 02:54

有没有办法把复杂的句子拆分成简单的句子,像在nltk或者其他自然语言处理的库里?

举个例子:

公园在日落时分真美,还有凉爽的微风吹拂 ==> 太阳正在落下。凉爽的微风在吹。公园真美。

1 个回答

12

这件事比看起来要复杂得多,所以你可能找不到一个完全干净的方法。

不过,使用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的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:]))

撰写回答