stanfordnlp stanford corenlp python parsing nlp nltk stanford-nlp
http://nlp.stanford.edu/software/stanford-ner-2015-04-20.ziphttp://nlp.stanford.edu/software/stanford-parser-2012-11-12.ziphttp://nlp.stanford.edu/software/stanford-parser-2012-11-12.ziphttp://nlp.stanford.edu/software/stanford-parser-2010-08-20.zip

python - corenlp - Stanford Parser y NLTK



corenlp stanford (17)

EDITADO

Nota: la siguiente respuesta solo funcionará en:

  • Versión NLTK> = 3.2.5
  • Stanford Tools compilado desde 2016-10-31
  • Python 2.7, 3.5 y 3.6

Como ambas herramientas cambian bastante rápido y la API puede verse muy diferente 3-6 meses después. Por favor, trate la siguiente respuesta como temporal y no como una solución eterna.

Siempre consulte https://github.com/nltk/nltk/wiki/Installing-Third-Party-Software para obtener la última instrucción sobre cómo interconectar las herramientas de Stanford NLP usando NLTK.

TL; DR

El siguiente código proviene de https://github.com/nltk/nltk/pull/1735#issuecomment-306091826

En la terminal:

wget http://nlp.stanford.edu/software/stanford-corenlp-full-2016-10-31.zip unzip stanford-corenlp-full-2016-10-31.zip && cd stanford-corenlp-full-2016-10-31 java -mx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer / -preload tokenize,ssplit,pos,lemma,parse,depparse / -status_port 9000 -port 9000 -timeout 15000

En Python:

>>> from nltk.tag.stanford import CoreNLPPOSTagger, CoreNLPNERTagger >>> from nltk.parse.corenlp import CoreNLPParser >>> stpos, stner = CoreNLPPOSTagger(), CoreNLPNERTagger() >>> stpos.tag(''What is the airspeed of an unladen swallow ?''.split()) [(u''What'', u''WP''), (u''is'', u''VBZ''), (u''the'', u''DT''), (u''airspeed'', u''NN''), (u''of'', u''IN''), (u''an'', u''DT''), (u''unladen'', u''JJ''), (u''swallow'', u''VB''), (u''?'', u''.'')] >>> stner.tag(''Rami Eid is studying at Stony Brook University in NY''.split()) [(u''Rami'', u''PERSON''), (u''Eid'', u''PERSON''), (u''is'', u''O''), (u''studying'', u''O''), (u''at'', u''O''), (u''Stony'', u''ORGANIZATION''), (u''Brook'', u''ORGANIZATION''), (u''University'', u''ORGANIZATION''), (u''in'', u''O''), (u''NY'', u''O'')] >>> parser = CoreNLPParser(url=''http://localhost:9000'') >>> next( ... parser.raw_parse(''The quick brown fox jumps over the lazy dog.'') ... ).pretty_print() # doctest: +NORMALIZE_WHITESPACE ROOT | S _______________|__________________________ | VP | | _________|___ | | | PP | | | ________|___ | NP | | NP | ____|__________ | | _______|____ | DT JJ JJ NN VBZ IN DT JJ NN . | | | | | | | | | | The quick brown fox jumps over the lazy dog . >>> (parse_fox, ), (parse_wolf, ) = parser.raw_parse_sents( ... [ ... ''The quick brown fox jumps over the lazy dog.'', ... ''The quick grey wolf jumps over the lazy fox.'', ... ] ... ) >>> parse_fox.pretty_print() # doctest: +NORMALIZE_WHITESPACE ROOT | S _______________|__________________________ | VP | | _________|___ | | | PP | | | ________|___ | NP | | NP | ____|__________ | | _______|____ | DT JJ JJ NN VBZ IN DT JJ NN . | | | | | | | | | | The quick brown fox jumps over the lazy dog . >>> parse_wolf.pretty_print() # doctest: +NORMALIZE_WHITESPACE ROOT | S _______________|__________________________ | VP | | _________|___ | | | PP | | | ________|___ | NP | | NP | ____|_________ | | _______|____ | DT JJ JJ NN VBZ IN DT JJ NN . | | | | | | | | | | The quick grey wolf jumps over the lazy fox . >>> (parse_dog, ), (parse_friends, ) = parser.parse_sents( ... [ ... "I ''m a dog".split(), ... "This is my friends '' cat ( the tabby )".split(), ... ] ... ) >>> parse_dog.pretty_print() # doctest: +NORMALIZE_WHITESPACE ROOT | S _______|____ | VP | ________|___ NP | NP | | ___|___ PRP VBP DT NN | | | | I ''m a dog

Por favor, eche un vistazo a http://www.nltk.org/_modules/nltk/parse/corenlp.html para obtener más información sobre la API de Stanford. Eche un vistazo a los documentos!

¿Es posible usar Stanford Parser en NLTK? (No estoy hablando de Stanford POS).


EDITADO

A partir de la versión 3.1 de NLTK, las instrucciones de esta respuesta ya no funcionarán. Siga las instrucciones en https://github.com/nltk/nltk/wiki/Installing-Third-Party-Software

Esta respuesta se mantiene para fines heredados en . La respuesta sí funciona para NLTK v3.0.

Respuesta original

Aquí hay una adaptación del código de danger98 que funciona con nltk3.0.0 en windoze, y presumiblemente también en otras plataformas, ajusta los nombres de directorio según corresponda para tu configuración:

import os from nltk.parse import stanford os.environ[''STANFORD_PARSER''] = ''d:/stanford-parser'' os.environ[''STANFORD_MODELS''] = ''d:/stanford-parser'' os.environ[''JAVAHOME''] = ''c:/Program Files/java/jre7/bin'' parser = stanford.StanfordParser(model_path="d:/stanford-grammars/englishPCFG.ser.gz") sentences = parser.raw_parse_sents(("Hello, My name is Melroy.", "What is your name?")) print sentences

Tenga en cuenta que el comando de análisis ha cambiado (consulte el código fuente en www.nltk.org/_modules/nltk/parse/stanford.html) y que debe definir la variable JAVAHOME. Intenté que se lea el archivo de gramática in situ en el contenedor, pero hasta ahora no he podido hacerlo.


EDITADO

A partir de la versión 3.1 de NLTK, las instrucciones de esta respuesta ya no funcionarán. Siga las instrucciones en https://github.com/nltk/nltk/wiki/Installing-Third-Party-Software

Esta respuesta se mantiene para fines heredados en . La respuesta sí funciona para NLTK v3.0.

Respuesta original

Una pequeña actualización (o simplemente alternativa) sobre la respuesta integral de danger89 sobre el uso de Stanford Parser en NLTK y Python

Con stanford-parser-full-2015-04-20, JRE 1.8 y nltk 3.0.4 (python 2.7.6), parece que ya no es necesario extraer el inglésPCFG.ser.gz de stanford-parser-xxx-models .jar o configurar cualquier os.environ

from nltk.parse.stanford import StanfordParser english_parser = StanfordParser(''path/stanford-parser.jar'', ''path/stanford-parser-3.5.2-models.jar'') s = "The real voyage of discovery consists not in seeking new landscapes, but in having new eyes." sentences = english_parser.raw_parse_sents((s,)) print sentences #only print <listiterator object> for this version #draw the tree for line in sentences: for sentence in line: sentence.draw()


EDITADO

A partir de la versión 3.1 de NLTK, las instrucciones de esta respuesta ya no funcionarán. Siga las instrucciones en https://github.com/nltk/nltk/wiki/Installing-Third-Party-Software

Esta respuesta se mantiene para fines heredados en . La respuesta sí funciona para NLTK v3.0.

Respuesta original

Claro, prueba lo siguiente en Python:

import os from nltk.parse import stanford os.environ[''STANFORD_PARSER''] = ''/path/to/standford/jars'' os.environ[''STANFORD_MODELS''] = ''/path/to/standford/jars'' parser = stanford.StanfordParser(model_path="/location/of/the/englishPCFG.ser.gz") sentences = parser.raw_parse_sents(("Hello, My name is Melroy.", "What is your name?")) print sentences # GUI for line in sentences: for sentence in line: sentence.draw()

Salida:

[Árbol (''ROOT'', [Árbol (''S'', [Árbol (''INTJ'', [Árbol (''UH'', [''Hello''])]), Árbol ('','', ['','']), Árbol (''NP'', [Árbol (''PRP $'', [''Mi'']), Árbol (''NN'', [''nombre''])]), Árbol (''VP'', [Árbol (''VBZ'', [ ''es'']), Árbol (''ADJP'', [Árbol (''JJ'', [''Melroy''])])]), Árbol (''.'', [''.''])])]), Árbol ('' ROOT '', [Árbol ('' SBARQ '', [Árbol ('' WHNP '', [Árbol ('' WP '', ['' Qué ''])]), Árbol ('' SQ '', [Árbol ('' VBZ '', ['' es '' ]), Árbol (''NP'', [Árbol (''PRP $'', [''tu'']), Árbol (''NN'', [''nombre''])])]), Árbol (''.'', [''? ''])])])]

Nota 1: en este ejemplo, tanto el analizador como los archivos jar están en la misma carpeta.

Nota 2:

  • El nombre de archivo de stanford parser es: stanford-parser.jar
  • El nombre de archivo de los modelos de stanford es: stanford-parser-xxx-models.jar

Nota 3: El archivo inglésPCFG.ser.gz se puede encontrar dentro del archivo models.jar (/edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz). Utilice come archive manager para ''descomprimir'' el archivo models.jar.

Nota 4: Asegúrese de estar utilizando Java JRE (Runtime Environment) 1.8 también conocido como Oracle JDK 8. De lo contrario, obtendrá: Major.minor versión 52.0 no admitida.

Instalación

  1. Descargue NLTK v3 desde: https://github.com/nltk/nltk . E instala NLTK:

    instalación de sudo python setup.py

  2. Puede usar el descargador NLTK para obtener Stanford Parser, usando Python:

    import nltk nltk.download()

  3. Prueba mi ejemplo! (no olvide cambiar las rutas de jar y cambiar la ruta del modelo a la ubicación de ser.gz)

O:

  1. Descargue e instale NLTK v3, igual que arriba.

  2. Descargue la última versión de ( la versión actual del nombre del archivo es stanford-parser-full-2015-01-29.zip): http://nlp.stanford.edu/software/lex-parser.shtml#Download

  3. Extraiga el standford-parser-full-20xx-xx-xx.zip.

  4. Crea una nueva carpeta (''jarras'' en mi ejemplo). Coloque los archivos extraídos en esta carpeta jar: stanford-parser-3.xx-models.jar y stanford-parser.jar.

    Como se muestra arriba, puede usar las variables de entorno (STANFORD_PARSER & STANFORD_MODELS) para apuntar a esta carpeta ''jars''. Estoy usando Linux, así que si usas Windows, usa algo como: C: // folder // jars.

  5. Abra stanford-parser-3.xx-models.jar usando un administrador de archivos (7zip).

  6. Navegue dentro del archivo jar; edu / stanford / nlp / models / lexparser. Nuevamente, extraiga el archivo llamado ''englishPCFG.ser.gz''. Recuerde la ubicación donde extrae este archivo ser.gz.

  7. Al crear una instancia de StanfordParser, puede proporcionar la ruta del modelo como parámetro. Esta es la ruta completa al modelo, en nuestro caso /location/of/englishPCFG.ser.gz.

  8. Prueba mi ejemplo! (no olvide cambiar las rutas de jar y cambiar la ruta del modelo a la ubicación de ser.gz)


EDITADO

A partir del 15 de octubre de 2015, la biblioteca de PyPi se ha actualizado con NLTK v3.1, que tiene una versión estabilizada de la API de herramientas de Stanford NLP. ( https://pypi.python.org/pypi/nltk )

Además, NLTK v3.1 se puede instalar usando el administrador de paquetes Ubuntu apt-get con https://launchpad.net/ubuntu/+source/nltk (consulte https://github.com/nltk/nltk/issues/747 )

Respuesta original

El paquete PyPi (que se descarga usando pip y easy_install) está horriblemente desactualizado (desde 2012). Para acceder al SP, debe descargar la última compilación ( https://github.com/nltk/nltk ) e instalarlo. Eso le permitirá usar la solución dada por @ Danger89


EDITADO

Nota: la siguiente respuesta solo funcionará en:

  • Versión NLTK> = 3.2.4
  • Stanford Tools compilado desde 2015-04-20
  • Python 2.7, 3.4 y 3.5 (Python 3.6 aún no es compatible oficialmente)

Como ambas herramientas cambian bastante rápido y la API puede verse muy diferente 3-6 meses después. Por favor, trate la siguiente respuesta como temporal y no como una solución eterna.

Siempre consulte https://github.com/nltk/nltk/wiki/Installing-Third-Party-Software para obtener la última instrucción sobre cómo interconectar las herramientas de Stanford NLP usando NLTK.

TL; DR

cd $HOME # Update / Install NLTK pip install -U nltk # Download the Stanford NLP tools wget http://nlp.stanford.edu/software/stanford-ner-2015-04-20.zip wget http://nlp.stanford.edu/software/stanford-postagger-full-2015-04-20.zip wget http://nlp.stanford.edu/software/stanford-parser-full-2015-04-20.zip # Extract the zip file. unzip stanford-ner-2015-04-20.zip unzip stanford-parser-full-2015-04-20.zip unzip stanford-postagger-full-2015-04-20.zip export STANFORDTOOLSDIR=$HOME export CLASSPATH=$STANFORDTOOLSDIR/stanford-postagger-full-2015-04-20/stanford-postagger.jar:$STANFORDTOOLSDIR/stanford-ner-2015-04-20/stanford-ner.jar:$STANFORDTOOLSDIR/stanford-parser-full-2015-04-20/stanford-parser.jar:$STANFORDTOOLSDIR/stanford-parser-full-2015-04-20/stanford-parser-3.5.2-models.jar export STANFORD_MODELS=$STANFORDTOOLSDIR/stanford-postagger-full-2015-04-20/models:$STANFORDTOOLSDIR/stanford-ner-2015-04-20/classifiers

Entonces:

>>> from nltk.tag.stanford import StanfordPOSTagger >>> st = StanfordPOSTagger(''english-bidirectional-distsim.tagger'') >>> st.tag(''What is the airspeed of an unladen swallow ?''.split()) [(u''What'', u''WP''), (u''is'', u''VBZ''), (u''the'', u''DT''), (u''airspeed'', u''NN''), (u''of'', u''IN''), (u''an'', u''DT''), (u''unladen'', u''JJ''), (u''swallow'', u''VB''), (u''?'', u''.'')] >>> from nltk.tag import StanfordNERTagger >>> st = StanfordNERTagger(''english.all.3class.distsim.crf.ser.gz'') >>> st.tag(''Rami Eid is studying at Stony Brook University in NY''.split()) [(u''Rami'', u''PERSON''), (u''Eid'', u''PERSON''), (u''is'', u''O''), (u''studying'', u''O''), (u''at'', u''O''), (u''Stony'', u''ORGANIZATION''), (u''Brook'', u''ORGANIZATION''), (u''University'', u''ORGANIZATION''), (u''in'', u''O''), (u''NY'', u''O'')] >>> from nltk.parse.stanford import StanfordParser >>> parser=StanfordParser(model_path="edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz") >>> list(parser.raw_parse("the quick brown fox jumps over the lazy dog")) [Tree(''ROOT'', [Tree(''NP'', [Tree(''NP'', [Tree(''DT'', [''the'']), Tree(''JJ'', [''quick'']), Tree(''JJ'', [''brown'']), Tree(''NN'', [''fox''])]), Tree(''NP'', [Tree(''NP'', [Tree(''NNS'', [''jumps''])]), Tree(''PP'', [Tree(''IN'', [''over'']), Tree(''NP'', [Tree(''DT'', [''the'']), Tree(''JJ'', [''lazy'']), Tree(''NN'', [''dog''])])])])])])] >>> from nltk.parse.stanford import StanfordDependencyParser >>> dep_parser=StanfordDependencyParser(model_path="edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz") >>> print [parse.tree() for parse in dep_parser.raw_parse("The quick brown fox jumps over the lazy dog.")] [Tree(''jumps'', [Tree(''fox'', [''The'', ''quick'', ''brown'']), Tree(''dog'', [''over'', ''the'', ''lazy''])])]

En Long:


En primer lugar , debe tenerse en cuenta que las herramientas de Stanford NLP están escritas en Java y NLTK está escrita en Python . La forma en que NLTK está interactuando con la herramienta es a través de la llamada de la herramienta Java a través de la interfaz de línea de comando.

En segundo lugar , la API de NLTK para las herramientas de Stanford NLP ha cambiado bastante desde la versión 3.1. Por lo tanto, es aconsejable actualizar su paquete NLTK a v3.1.

En tercer lugar , la API de NLTK para las herramientas de Stanford NLP se ajusta a las herramientas de PNL individuales, por ejemplo, Stanford POS tagger , Stanford NER Tagger , Stanford Parser .

Para el etiquetador POS y NER, NO se ajusta al paquete Stanford Core NLP .

Para Stanford Parser, es un caso especial en el que se envuelve tanto el Stanford Parser como el Stanford Core NLP (personalmente, no he usado este último usando NLTK, preferiría seguir la demostración de @dimazest en http://www.eecs.qmul.ac.uk/~dm303/stanford-dependency-parser-nltk-and-anaconda.html )

Tenga en cuenta que a partir de NLTK v3.1, las variables STANFORD_JAR y STANFORD_PARSER están en desuso y NO SE UTILIZARON MÁS.

En más tiempo:


PASO 1

Suponiendo que ha instalado Java apropiadamente en su sistema operativo.

Ahora, instale / actualice su versión NLTK (vea http://www.nltk.org/install.html ):

  • Usando pip : sudo pip install -U nltk
  • Distro de Debian (usando apt-get): sudo apt-get install python-nltk

Para Windows (utilice la instalación binaria de 32 bits):

  1. Instale Python 3.4: http://www.python.org/downloads/ (evite las versiones de 64 bits)
  2. Instalar Numpy (opcional): http://sourceforge.net/projects/numpy/files/NumPy/ (la versión que especifica pythnon3.4)
  3. Instalar NLTK: http://pypi.python.org/pypi/nltk
  4. Instalación de prueba: Inicio> Python34, luego escriba importar nltk

( ¿Por qué no 64 bits? Consulte https://github.com/nltk/nltk/issues/1079 )

Luego, fuera de la paranoia, vuelva a nltk su versión nltk dentro de python:

from __future__ import print_function import nltk print(nltk.__version__)

O en la línea de comando:

python3 -c "import nltk; print(nltk.__version__)"

Asegúrese de ver 3.1 como salida.

Para aún más paranoia, verifique que todas sus herramientas favoritas de Stanford NLP estén disponibles:

from nltk.parse.stanford import StanfordParser from nltk.parse.stanford import StanfordDependencyParser from nltk.parse.stanford import StanfordNeuralDependencyParser from nltk.tag.stanford import StanfordPOSTagger, StanfordNERTagger from nltk.tokenize.stanford import StanfordTokenizer

( Nota : Las importaciones anteriores SÓLO se asegurarán de que esté utilizando una versión NLTK correcta que contenga estas API. No ver errores en la importación no significa que haya configurado correctamente la API NLTK para usar las Herramientas de Stanford)

PASO 2

Ahora que ha verificado que tiene la versión correcta de NLTK que contiene la interfaz necesaria de herramientas de Stanford NLP. Debe descargar y extraer todas las herramientas necesarias de Stanford NLP.

TL; DR , en Unix:

cd $HOME # Download the Stanford NLP tools wget http://nlp.stanford.edu/software/stanford-ner-2015-04-20.zip wget http://nlp.stanford.edu/software/stanford-postagger-full-2015-04-20.zip wget http://nlp.stanford.edu/software/stanford-parser-full-2015-04-20.zip # Extract the zip file. unzip stanford-ner-2015-04-20.zip unzip stanford-parser-full-2015-04-20.zip unzip stanford-postagger-full-2015-04-20.zip

En Windows / Mac:

PASO 3

Configure las variables de entorno de modo que NLTK pueda encontrar la ruta de archivo relevante automáticamente. Tienes que establecer las siguientes variables:

  • Agregue el archivo .jar NLP de Stanford adecuado a la variable de entorno CLASSPATH .

    • por ejemplo, para el NER, será stanford-ner-2015-04-20/stanford-ner.jar
    • por ejemplo, para el POS, será stanford-postagger-full-2015-04-20/stanford-postagger.jar
    • por ejemplo, para el analizador sintáctico, será stanford-parser-full-2015-04-20/stanford-parser.jar y el archivo jar modelo de analizador, stanford-parser-full-2015-04-20/stanford-parser-3.5.2-models.jar
  • Agregue el directorio de modelo apropiado a la variable STANFORD_MODELS (es decir, el directorio donde puede encontrar dónde se guardan los modelos pre-entrenados)

    • por ejemplo, para el NER, estará en stanford-ner-2015-04-20/classifiers/
    • por ejemplo, para el POS, estará en stanford-postagger-full-2015-04-20/models/
    • por ejemplo, para el Analizador, no habrá un directorio modelo.

En el código, verifique que busque el directorio STANFORD_MODELS antes de agregar el nombre del modelo. Además, vea que la API también intenta buscar automáticamente los entornos del SO para el `CLASSPATH

Tenga en cuenta que a partir de NLTK v3.1, las variables STANFORD_JAR están en desuso y NO se utilizan MÁS . Los fragmentos de código encontrados en las siguientes preguntas de podrían no funcionar:

TL; DR para STEP 3 en Ubuntu

export STANFORDTOOLSDIR=/home/path/to/stanford/tools/ export CLASSPATH=$STANFORDTOOLSDIR/stanford-postagger-full-2015-04-20/stanford-postagger.jar:$STANFORDTOOLSDIR/stanford-ner-2015-04-20/stanford-ner.jar:$STANFORDTOOLSDIR/stanford-parser-full-2015-04-20/stanford-parser.jar:$STANFORDTOOLSDIR/stanford-parser-full-2015-04-20/stanford-parser-3.5.2-models.jar export STANFORD_MODELS=$STANFORDTOOLSDIR/stanford-postagger-full-2015-04-20/models:$STANFORDTOOLSDIR/stanford-ner-2015-04-20/classifiers

( Para Windows : consulte https://.com/a/17176423/610569 para obtener instrucciones sobre cómo configurar variables de entorno)

DEBES establecer las variables como antes antes de iniciar Python, luego:

>>> from nltk.tag.stanford import StanfordPOSTagger >>> st = StanfordPOSTagger(''english-bidirectional-distsim.tagger'') >>> st.tag(''What is the airspeed of an unladen swallow ?''.split()) [(u''What'', u''WP''), (u''is'', u''VBZ''), (u''the'', u''DT''), (u''airspeed'', u''NN''), (u''of'', u''IN''), (u''an'', u''DT''), (u''unladen'', u''JJ''), (u''swallow'', u''VB''), (u''?'', u''.'')] >>> from nltk.tag import StanfordNERTagger >>> st = StanfordNERTagger(''english.all.3class.distsim.crf.ser.gz'') >>> st.tag(''Rami Eid is studying at Stony Brook University in NY''.split()) [(u''Rami'', u''PERSON''), (u''Eid'', u''PERSON''), (u''is'', u''O''), (u''studying'', u''O''), (u''at'', u''O''), (u''Stony'', u''ORGANIZATION''), (u''Brook'', u''ORGANIZATION''), (u''University'', u''ORGANIZATION''), (u''in'', u''O''), (u''NY'', u''O'')] >>> from nltk.parse.stanford import StanfordParser >>> parser=StanfordParser(model_path="edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz") >>> list(parser.raw_parse("the quick brown fox jumps over the lazy dog")) [Tree(''ROOT'', [Tree(''NP'', [Tree(''NP'', [Tree(''DT'', [''the'']), Tree(''JJ'', [''quick'']), Tree(''JJ'', [''brown'']), Tree(''NN'', [''fox''])]), Tree(''NP'', [Tree(''NP'', [Tree(''NNS'', [''jumps''])]), Tree(''PP'', [Tree(''IN'', [''over'']), Tree(''NP'', [Tree(''DT'', [''the'']), Tree(''JJ'', [''lazy'']), Tree(''NN'', [''dog''])])])])])])]

Alternativamente, podría intentar agregar las variables de entorno dentro de python, como lo sugirieron las respuestas anteriores, pero también puede decirle directamente al analizador / grabador que se inicialice en la ruta directa donde guardó el archivo .jar y sus modelos.

NO es necesario configurar las variables de entorno si usa el siguiente método, PERO cuando la API cambie los nombres de los parámetros, deberá cambiar en consecuencia. Es por eso que es más aconsejable establecer las variables de entorno que modificar su código python para adaptarlo a la versión NLTK.

Por ejemplo ( sin establecer ninguna variable de entorno ):

# POS tagging: from nltk.tag import StanfordPOSTagger stanford_pos_dir = ''/home/alvas/stanford-postagger-full-2015-04-20/'' eng_model_filename= stanford_pos_dir + ''models/english-left3words-distsim.tagger'' my_path_to_jar= stanford_pos_dir + ''stanford-postagger.jar'' st = StanfordPOSTagger(model_filename=eng_model_filename, path_to_jar=my_path_to_jar) st.tag(''What is the airspeed of an unladen swallow ?''.split()) # NER Tagging: from nltk.tag import StanfordNERTagger stanford_ner_dir = ''/home/alvas/stanford-ner/'' eng_model_filename= stanford_ner_dir + ''classifiers/english.all.3class.distsim.crf.ser.gz'' my_path_to_jar= stanford_ner_dir + ''stanford-ner.jar'' st = StanfordNERTagger(model_filename=eng_model_filename, path_to_jar=my_path_to_jar) st.tag(''Rami Eid is studying at Stony Brook University in NY''.split()) # Parsing: from nltk.parse.stanford import StanfordParser stanford_parser_dir = ''/home/alvas/stanford-parser/'' eng_model_path = stanford_parser_dir + "edu/stanford/nlp/models/lexparser/englishRNN.ser.gz" my_path_to_models_jar = stanford_parser_dir + "stanford-parser-3.5.2-models.jar" my_path_to_jar = stanford_parser_dir + "stanford-parser.jar" parser=StanfordParser(model_path=eng_model_path, path_to_models_jar=my_path_to_models_jar, path_to_jar=my_path_to_jar)


Editado

A partir del analizador de Stanford actual (2015-04-20), la salida predeterminada para lexparser.sh ha cambiado, por lo que el siguiente script no funcionará.

Pero esta respuesta se mantiene por herencia, aún funcionará con http://nlp.stanford.edu/software/stanford-parser-2010-08-20.zip .

Respuesta original

Aquí está la versión de Windows de la respuesta de alvas

sentences = (''. ''.join([''this is sentence one without a period'',''this is another foo bar sentence ''])+''.'').encode(''ascii'',errors = ''ignore'') catpath =r"YOUR CURRENT FILE PATH" f = open(''stanfordtemp.txt'',''w'') f.write(sentences) f.close() parse_out = os.popen(catpath+r"/nlp_tools/stanford-parser-2010-08-20/lexparser.bat "+catpath+r"/stanfordtemp.txt").readlines() bracketed_parse = " ".join( [i.strip() for i in parse_out if i.strip() if i.strip()[0] == "("] ) bracketed_parse = "/n(ROOT".join(bracketed_parse.split(" (ROOT")).split(''/n'') aa = map(lambda x :ParentedTree.fromstring(x),bracketed_parse)

NOTAS:

  • En lexparser.bat necesita cambiar todas las rutas en ruta absoluta para evitar errores de Java como "clase no encontrada"

  • Recomiendo encarecidamente que aplique este método en Windows, ya que intenté varias respuestas en la página y todos los métodos comunican que python con Java falla.

  • Deseo saber de usted si tiene éxito en Windows y desearía poder decirme cómo supera todos estos problemas.

  • busque python wrapper para stanford coreNLP para obtener la versión python


Editado

A partir del analizador de Stanford actual (2015-04-20), la salida predeterminada para lexparser.sh ha cambiado, por lo que el siguiente script no funcionará.

Pero esta respuesta se mantiene por herencia, aún funcionará con http://nlp.stanford.edu/software/stanford-parser-2012-11-12.zip .

Respuesta original

Sugiero que no te metas con Jython, JPype. Deje que Python haga cosas de pitón y deje que java haga cosas java, obtenga la salida de Stanford Parser a través de la consola.

Después de haber instalado http://nlp.stanford.edu/software/stanford-parser-2012-11-12.zip en su directorio de inicio ~/ , simplemente use esta receta de Python para obtener el análisis de paréntesis plano:

import os sentence = "this is a foo bar i want to parse." os.popen("echo ''"+sentence+"'' > ~/stanfordtemp.txt") parser_out = os.popen("~/stanford-parser-2012-11-12/lexparser.sh ~/stanfordtemp.txt").readlines() bracketed_parse = " ".join( [i.strip() for i in parser_out if i.strip()[0] == "("] ) print bracketed_parse


Como nadie mencionó realmente y de alguna manera me ha preocupado mucho, aquí hay una forma alternativa de usar el analizador de Stanford en python:

stanford_parser_jar = ''../lib/stanford-parser-full-2015-04-20/stanford-parser.jar'' stanford_model_jar = ''../lib/stanford-parser-full-2015-04-20/stanford-parser-3.5.2-models.jar'' parser = StanfordParser(path_to_jar=stanford_parser_jar, path_to_models_jar=stanford_model_jar)

de esta manera, ya no tienes que preocuparte por el camino.

Para aquellos que no pueden usarlo correctamente en Ubuntu o ejecutar el código en Eclipse.


Estoy en una máquina con Windows y simplemente puede ejecutar el analizador normalmente como lo hace desde el comando como pero como en un directorio diferente para que no necesite editar el archivo lexparser.bat. Solo ponte en el camino completo.

cmd = r''java -cp /Documents/stanford_nlp/stanford-parser-full-2015-01-30 edu.stanford.nlp.parser.lexparser.LexicalizedParser -outputFormat "typedDependencies" /Documents/stanford_nlp/stanford-parser-full-2015-01-30/stanford-parser-3.5.1-models/edu/stanford/nlp/models/lexparser/englishFactored.ser.gz stanfordtemp.txt'' parse_out = os.popen(cmd).readlines()

La parte más difícil para mí fue darme cuenta de cómo ejecutar un programa Java desde una ruta diferente. Debe haber una mejor manera, pero esto funciona.


Estoy usando la versión nltk 3.2.4. Y el siguiente código funcionó para mí.

from nltk.internals import find_jars_within_path from nltk.tag import StanfordPOSTagger from nltk import word_tokenize # Alternatively to setting the CLASSPATH add the jar and model via their path: jar = ''/home/ubuntu/stanford-postagger-full-2017-06-09/stanford-postagger.jar'' model = ''/home/ubuntu/stanford-postagger-full-2017-06-09/models/english-left3words-distsim.tagger'' pos_tagger = StanfordPOSTagger(model, jar) # Add other jars from Stanford directory stanford_dir = pos_tagger._stanford_jar.rpartition(''/'')[0] stanford_jars = find_jars_within_path(stanford_dir) pos_tagger._stanford_jar = '':''.join(stanford_jars) text = pos_tagger.tag(word_tokenize("Open app and play movie")) print(text)

Salida:

[(''Open'', ''VB''), (''app'', ''NN''), (''and'', ''CC''), (''play'', ''VB''), (''movie'', ''NN'')]




Me tomó muchas horas y finalmente encontré una solución simple para los usuarios de Windows. Básicamente es una versión resumida de una respuesta existente de alvas, pero fácil de seguir (con suerte) para aquellos que son nuevos en stanford NLP y que son usuarios de Windows.

1) Descargue el módulo que desea usar, como NER, POS, etc. En mi caso, quería usar NER, así que descargué el módulo de http://nlp.stanford.edu/software/stanford-ner-2015-04-20.zip

2) Descomprime el archivo.

3) Establezca las variables de entorno (classpath y stanford_modules) de la carpeta descomprimida.

import os os.environ[''CLASSPATH''] = "C:/Users/Downloads/stanford-ner-2015-04-20/stanford-ner.jar" os.environ[''STANFORD_MODELS''] = "C:/Users/Downloads/stanford-ner-2015-04-20/classifiers/"

4) configure las variables de entorno para JAVA, como en donde tiene instalado JAVA. para mí estaba debajo

os.environ[''JAVAHOME''] = "C:/Program Files/Java/jdk1.8.0_102/bin/java.exe"

5) importa el módulo que quieras

from nltk.tag import StanfordNERTagger

6) llame al modelo preestablecido que está presente en la carpeta del clasificador en la carpeta descomprimida. agregue ".gz" al final para la extensión de archivo. para mí, el modelo que quería usar era english.all.3class.distsim.crf.ser

st = StanfordNERTagger(''english.all.3class.distsim.crf.ser.gz'')

7) Ahora ejecuta el analizador! y hemos terminado!

st.tag(''Rami Eid is studying at Stony Brook University in NY''.split())


No puedo dejar esto como un comentario debido a la reputación, pero dado que gasté (¿desperdiciado?) Algún tiempo resolviendo esto, preferiría compartir mi problema / solución para que este analizador funcione en NLTK.

En la excelente respuesta de alvas , se menciona que:

por ejemplo, para el Analizador, no habrá un directorio modelo.

Esto me llevó erróneamente a:

  • No tenga cuidado con el valor que pongo a STANFORD_MODELS (y solo me importa mi CLASSPATH )
  • dejar ../path/tostanford-parser-full-2015-2012-09/models directory * virtualmente vacío * (o con un archivo jar cuyo nombre no coincide con nltk regex)!

Si el OP, como yo, solo quería usar el analizador sintáctico, puede ser confuso que, al no descargar nada más (sin POStagger, sin NER, ...) y al seguir todas estas instrucciones, sigamos recibiendo un error.

Eventualmente, para cualquier CLASSPATH dado (siguientes ejemplos y explicaciones en las respuestas de este hilo) aún obtendría el error:

NLTK no pudo encontrar stanford-parser - (/ d +) (. (/ D +)) + - models.jar! Establezca la variable de entorno CLASSPATH. Para obtener más información, en stanford-parser - (/ d +) (. (/ D +)) + - models.jar,

ver: http://nlp.stanford.edu/software/lex-parser.shtml

O:

NLTK no pudo encontrar stanford-parser.jar! Establezca la variable de entorno CLASSPATH. Para obtener más información, en stanford-parser.jar, consulte: http://nlp.stanford.edu/software/lex-parser.shtml

Aunque , lo que es más importante, podría cargar y usar correctamente el analizador si llamara a la función con todos los argumentos y la ruta especificados por completo, como en:

stanford_parser_jar = ''../lib/stanford-parser-full-2015-04-20/stanford-parser.jar'' stanford_model_jar = ''../lib/stanford-parser-full-2015-04-20/stanfor-parser-3.5.2-models.jar'' parser = StanfordParser(path_to_jar=stanford_parser_jar, path_to_models_jar=stanford_model_jar)

Solución para el analizador solo:

Por lo tanto, el error provino de NLTK y de cómo está buscando los jars utilizando las variables de entorno STANFORD_MODELS y CLASSPATH suministradas. Para resolver esto, el *-models.jar , con el formato correcto (para que coincida con la expresión regular en el código NLTK, por lo que no -corenlp -.... jar) debe estar ubicado en la carpeta designada por STANFORD_MODELS .

A saber, primero creé:

mkdir stanford-parser-full-2015-12-09/models

Luego se agregó en .bashrc :

export STANFORD_MODELS=/path/to/stanford-parser-full-2015-12-09/models

Y finalmente, copiando stanford-parser-3.6.0-models.jar (o la versión correspondiente), en:

path/to/stanford-parser-full-2015-12-09/models/

Podría hacer que StanfordParser cargue sin problemas en python con el clásico CLASSPATH que apunta a stanford-parser.jar . En realidad, como tal, puede llamar a StanfordParser sin parámetros, el valor predeterminado simplemente funcionará.


Puede usar la salida de Stanford Parsers para crear un árbol en nltk (nltk.tree.Tree).

Suponiendo que el analizador stanford le proporciona un archivo en el que hay exactamente un árbol de análisis sintáctico para cada oración. Entonces este ejemplo funciona, aunque podría no parecer muy pitónico:

f = open(sys.argv[1]+".output"+".30"+".stp", "r") parse_trees_text=[] tree = "" for line in f: if line.isspace(): parse_trees_text.append(tree) tree = "" elif "(. ...))" in line: #print "YES" tree = tree+'')'' parse_trees_text.append(tree) tree = "" else: tree = tree + line parse_trees=[] for t in parse_trees_text: tree = nltk.Tree(t) tree.__delitem__(len(tree)-1) #delete "(. .))" from tree (you don''t need that) s = traverse(tree) parse_trees.append(tree)


Si recuerdo bien, el analizador de Stanford es una biblioteca de Java, por lo tanto, debe tener un intérprete de Java ejecutándose en su servidor / computadora.

Lo usé una vez como servidor, combinado con un script php. El script usaba la función exec () de php para hacer una llamada de línea de comandos al analizador de esta manera:

<?php exec( "java -cp /pathTo/stanford-parser.jar -mx100m edu.stanford.nlp.process.DocumentPreprocessor /pathTo/fileToParse > /pathTo/resultFile 2>/dev/null" ); ?>

No recuerdo todos los detalles de este comando, básicamente abrió el archivo ToParse, lo analizó y escribió el resultado en el archivo de resultados. PHP luego abriría el archivo de resultados para un uso posterior.

El final del comando dirige el detallado del analizador a NULL, para evitar que la información innecesaria de la línea de comando perturbe el script.

No sé mucho sobre Python, pero podría haber una manera de hacer llamadas de línea de comando.

Puede que no sea la ruta exacta que estabas esperando, pero con suerte te dará algo de inspiración. La mejor de las suertes.