2010-08-17 5 views
8

C'è un modo per scomporre frasi complesse in frasi semplici in nltk o in altre librerie di elaborazione del linguaggio naturale?Interrompe/decompone le frasi complesse e composte in nltk

Ad esempio:

Il parco è così meraviglioso quando il sole sta tramontando e una fresca brezza soffia ==> Il sole sta tramontando. soffia una fresca brezza Il parco è così meraviglioso.

risposta

10

Questo è molto più complicato di quanto sembri, quindi è improbabile trovare un metodo perfettamente pulito.

Tuttavia, utilizzando il parser inglese in OpenNLP, posso prendere il vostro esempio frase e ottenere un seguito albero di grammatica:

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

Da lì, si può prendere a parte come ti piace. Puoi ottenere le tue sottosezioni estraendo il livello superiore (NP *) (VP *) meno la sezione (SBAR *). E poi potresti dividere la congiunzione all'interno di (SBAR *) nelle altre due dichiarazioni.

Nota: il parser OpenNLP viene addestrato utilizzando il corpus Penn Treebank. Ho ottenuto un parsing abbastanza accurato sulla tua frase di esempio, ma il parser non è perfetto e può essere erroneamente sbagliato in altre frasi. Look here per una spiegazione dei suoi tag. Presume che tu abbia già una conoscenza di base della linguistica e della grammatica inglese.

Modifica: Btw, questo è il modo in cui accedo a OpenNLP da Python. Ciò presuppone che i file jar e model di OpenNLP siano presenti in una cartella 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:])) 
+0

Grazie Chris, funziona! – Sharmila

+0

Ho analizzato la frase di esempio con Stanford corenlp e la clausola subordinata non è stata analizzata correttamente. Quindi, come affermato da Cerin, i modelli non sono accurati al 100% e potrebbero fornire alberi di analisi imprecisi. –