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:]))
Grazie Chris, funziona! – Sharmila
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. –