2010-08-17 20 views
8

Karmaşık cümleleri nltk veya diğer doğal dil işleme kitaplıklarındaki basit cümlelere ayırmanın bir yolu var mı? ÖrneğinKarmaşık ve karmaşık cümleler nltk'ye bölünür

: güneş kuruyor ve serin bir esinti ==> güneş kuruyor esen zaman

Park çok harika. serin bir esinti esiyor. Park çok güzel.

cevap

10

Bu, göründüğünden çok daha karmaşıktır, dolayısıyla mükemmel bir temiz yöntem bulma olasılığınız yoktur.

Ancak OpenNLP İngiliz ayrıştırıcı kullanarak, senin örnek bir cümle alıp, şu dilbilgisi ağacı alabilirsiniz: istediğiniz gibi

(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))))))) 
    (. .))) 

Oradan sen ayrı alabilirsiniz. Alt-maddelerini, (SBAR *) eksi (SBAR *) bölümünün üst seviyesini (NP *) (VP *) çıkararak alabilirsiniz. Ve sonra, (SBAR *) içindeki bağlantıyı diğer iki ifadeye bölebilirsiniz.

Not, OpenNLP ayrıştırıcısına Penn Treebank corpus kullanılarak eğitim verilir. Örnek cümlenin üzerine oldukça doğru bir ayrıştırma yaptım, ama ayrıştırıcı mükemmel değil ve diğer cümlelerde çılgınca yanlış olabilir. Etiketlerinin açıklaması için Look here. Dilbilim ve İngilizce dilbilgisi hakkında bazı temel anlayışınız olduğunu varsayar.

Düzenleme: Btw, Python'dan OpenNLP'ye bu şekilde erişiyorum. Bu, bir opennlp-tools-1.4.3 klasöründe OpenNLP jar ve model dosyalarını olduğunu varsayar.

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

Teşekkürler Chris, Çalışır! – Sharmila

+0

Örnek cümleyi Stanford corenlp ile ayrıştırdım ve alt madde doğru ayrıştırılmadı. Cerin'in de belirttiği gibi, modeller% 100 doğru değildir ve yanlış ayrıştırma ağaçları verilebilir. –