¿Cómo hago el análisis de dependencia en NLTK?

Al revisar el libro NLTK, no está claro cómo generar un árbol de dependencias a partir de una oración dada.

La sección relevante del libro: el subcapítulo sobre la gramática de la dependencia da una figura de ejemplo, pero no muestra cómo analizar una oración para establecer esas relaciones, ¿o tal vez me esté perdiendo algo fundamental en la PNL?

EDITAR: Quiero algo similar a lo que hace el analizador de Stanford : dada una frase “Le disparé a un elefante mientras dormía”, debería devolver algo como:

nsubj(shot-2, I-1) det(elephant-4, an-3) dobj(shot-2, elephant-4) prep(shot-2, in-5) poss(sleep-7, my-6) pobj(in-5, sleep-7) 

Podemos usar Stanford Parser de NLTK.

Requerimientos

Necesitas descargar dos cosas de su sitio web:

  1. El analizador Stanford CoreNLP .
  2. Modelo de idioma para su idioma deseado (por ejemplo , modelo de idioma inglés )

¡Advertencia!

¡Asegúrese de que la versión del modelo de idioma coincida con la versión del analizador Stanford CoreNLP!

La versión actual de CoreNLP a partir del 22 de mayo de 2018 es 3.9.1.

Después de descargar los dos archivos, extraiga el archivo zip en cualquier lugar que desee.

Código Python

A continuación, cargue el modelo y utilícelo a través de NLTK.

 from nltk.parse.stanford import StanfordDependencyParser path_to_jar = 'path_to/stanford-parser-full-2014-08-27/stanford-parser.jar' path_to_models_jar = 'path_to/stanford-parser-full-2014-08-27/stanford-parser-3.4.1-models.jar' dependency_parser = StanfordDependencyParser(path_to_jar=path_to_jar, path_to_models_jar=path_to_models_jar) result = dependency_parser.raw_parse('I shot an elephant in my sleep') dep = result.next() list(dep.triples()) 

Salida

La salida de la última línea es:

 [((u'shot', u'VBD'), u'nsubj', (u'I', u'PRP')), ((u'shot', u'VBD'), u'dobj', (u'elephant', u'NN')), ((u'elephant', u'NN'), u'det', (u'an', u'DT')), ((u'shot', u'VBD'), u'prep', (u'in', u'IN')), ((u'in', u'IN'), u'pobj', (u'sleep', u'NN')), ((u'sleep', u'NN'), u'poss', (u'my', u'PRP$'))] 

Creo que esto es lo que quieres.

Creo que podría usar un analizador de dependencia basado en corpus en lugar del que proporciona NLTK basado en gramática.

Hacer un análisis de dependencia basado en corpus en incluso una pequeña cantidad de texto en Python no es ideal para el rendimiento. Así que en NLTK proporcionan un envoltorio para MaltParser , un analizador de dependencia basado en corpus.

Puede encontrar esta otra pregunta sobre la representación RDF de oraciones relevante.

Si necesita un mejor rendimiento, Spacy ( https://spacy.io/ ) es la mejor opción. El uso es muy simple:

 import spacy nlp = spacy.load('en') sents = nlp(u'A woman is walking through the door.') 

Obtendrá un árbol de dependencias como salida, y podrá extraer fácilmente toda la información que necesite. También puede definir sus propias tuberías personalizadas. Ver más en su sitio web.

https://spacy.io/docs/usage/

Si desea tomar en serio el análisis de dependencia, no use el NLTK, todos los algoritmos están fechados y son lentos. Intente algo como esto: https://spacy.io/

De la documentación de Stanford Parser: “las dependencias se pueden obtener usando nuestro software en […] árboles de estructura de frase usando la clase EnglishGrammaticalStructure disponible en el paquete del analizador”. http://nlp.stanford.edu/software/stanford-dependencies.shtml

El manual de dependencias también menciona: “O nuestra herramienta de conversión puede convertir la salida de otros analizadores de distrito electoral a la representación de Dependencias de Stanford”. http://nlp.stanford.edu/software/dependencies_manual.pdf

Ninguna funcionalidad parece estar implementada en NLTK actualmente.

Para utilizar Stanford Parser de NLTK

1) Ejecutar el servidor CoreNLP en localhost
Descargue Stanford CoreNLP aquí (y también el archivo de modelo para su idioma). El servidor puede iniciarse ejecutando el siguiente comando (más detalles aquí )

 # Run the server using all jars in the current directory (eg, the CoreNLP home directory) java -mx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer -port 9000 -timeout 15000 

o por la API de CORENLP_HOME primero debe configurar la variable de entorno CORENLP_HOME )

 os.environ["CORENLP_HOME"] = "dir" client = corenlp.CoreNLPClient() # do something client.stop() 

2) Llame al analizador de dependencias desde NLTK

 >>> from nltk.parse.corenlp import CoreNLPDependencyParser >>> dep_parser = CoreNLPDependencyParser(url='http://localhost:9000') >>> parse, = dep_parser.raw_parse( ... 'The quick brown fox jumps over the lazy dog.' ... ) >>> print(parse.to_conll(4)) The DT 4 det quick JJ 4 amod brown JJ 4 amod fox NN 5 nsubj jumps VBZ 0 ROOT over IN 9 case the DT 9 det lazy JJ 9 amod dog NN 5 nmod . . 5 punct 

Consulte la documentación detallada aquí , y también esta pregunta NLTK CoreNLPDependencyParser: No se pudo establecer la conexión .