2010-08-17 18 views
8

¿Existe alguna forma de descomponer oraciones complejas en oraciones simples en nltk u otras bibliotecas de procesamiento de lenguaje natural?Romper/Descomponer oraciones complejas y compuestas en nltk

Por ejemplo:

El parque es tan maravilloso cuando se pone el sol y una brisa fresca sopla ==> El sol se está poniendo. una brisa fresca sopla. El parque es tan maravilloso.

Respuesta

10

Esto es mucho más complicado de lo que parece, por lo que es poco probable que encuentre un método perfectamente limpio.

Sin embargo, usando el analizador de Inglés en OpenNLP, puedo tomar su frase de ejemplo y obtener un árbol siguiente gramática:

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

A partir de ahí, se puede recoger lo distinguen como desee. Puede obtener sus subcláusulas extrayendo la sección de nivel superior (NP *) (VP *) menos la (SBAR *). Y luego podrías dividir la conjunción dentro del (SBAR *) en las otras dos declaraciones.

Nota, el analizador de OpenNLP está entrenado utilizando el corpus Penn Treebank. Obtuve un análisis bastante preciso de tu oración de ejemplo, pero el analizador no es perfecto y puede ser muy erróneo en otras oraciones. Look here para una explicación de sus etiquetas. Supone que ya tiene una comprensión básica de la lingüística y la gramática del inglés.

Editar: Por cierto, así es como accedo a OpenNLP desde Python. Esto supone que tiene los archivos jar y modelo OpenNLP en una carpeta 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

Gracias Chris, ¡Funciona! – Sharmila

+0

Analicé la oración de ejemplo con Stanford corenlp y la cláusula subordinada no se analizó correctamente. Así que, como dijo Cerin, los modelos no son 100% precisos y pueden tener árboles de análisis inexactos. –

Cuestiones relacionadas