2010-08-17 121 views
8

在nltk或其他自然語言處理庫中是否有將複雜句子分解爲簡單句子的方法?在nltk中分解複雜句子

例如:

該公園是如此美妙當太陽設置和一個清風是吹==>太陽是設置。一陣清涼的微風吹過。這個公園真是太棒了。

回答

10

這看起來要複雜得多,所以你不可能找到一個完美清潔的方法。

然而,在使用英語語法分析器中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和model文件。

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:])) 
+0

謝謝克里斯,它的工作原理! – Sharmila 2010-09-15 02:33:58

+0

我用斯坦福corenlp解析了例句,並且下級子句沒有正確解析。就像Cerin所說的那樣,這些模型並不是100%準確的,並且可能會給出不準確的分析樹。 – 2014-03-30 01:01:21