Nltk: OSError: el comando Java falló al usar el ejemplo del analizador de Stanford

Creado en 25 dic. 2015  ·  18Comentarios  ·  Fuente: nltk/nltk

Hola,

Estoy intentando ejecutar el ejemplo del analizador de Stanford. P.ej

from nltk.parse.stanford import * 
dep_parser=StanfordDependencyParser(model_path="edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz")
[parse.tree() for parse in dep_parser.raw_parse("The quick brown fox jumps over the lazy dog.")]

ejecutar el último comando da como resultado un error:

OSError: Java command failed : [u'/usr/bin/java', u'-mx1000m', '-cp', ....

cuando reproduzco el mismo comando en la línea de comando, obtengo el error Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory

Por lo tanto, después de agregar slf4j-api.jar a la ruta de clase _en la línea de comandos_, el análisis es exitoso.

¿Cómo se puede agregar slf4j-api.jar a nltk classpath, para que el análisis sea exitoso?

¡Gracias!
Felices vacaciones

Comentario más útil

qué es 'st' en el comando 'stanford_dir = st._stanford_jar.rpartition (' / ') [0]'

Todos 18 comentarios

@yuvval ¿ Solo para asegurarse de que está utilizando la versión del analizador Stanford 2015-12-09? Si es así, este error se debe a que el nuevo StanfordNLP usa más dependencias que antes. Esto es similar al # 1237

Tendría que esperar un tiempo antes de que se arregle el # 1237 y NLTK se ponga al día con las herramientas de Standford.

La solución rápida es:

  1. use la versión anterior 2015-04-20 de http://nlp.stanford.edu/software/stanford-parser-full-2015-04-20.zip y la API NLTK funcionaría, consulte http://stackoverflow.com / preguntas / 13883277 / stanford-parser-and-nltk / 34112695 # 34112695 o
  2. hackear el classpath del analizador de Stanford:
from nltk.internals import find_jars_within_path
from nltk.parse.stanford import StanfordDependencyParser
dep_parser=StanfordDependencyParser(model_path="edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz")
stanford_dir = st._stanford_jar.rpartition('/')[0]
# or in windows comment the line above and uncomment the one below:
#stanford_dir = st._stanford_jar.rpartition("\\")[0]
stanford_jars = find_jars_within_path(stanford_dir)
st.stanford_jar = ':'.join(stanford_jars)
[parse.tree() for parse in dep_parser.raw_parse("The quick brown fox jumps over the lazy dog.")]

¡Gracias! Funciona con la versión 2015-04-20.

¿El truco de classpath también funcionó?

No lo intenté, simplemente eliminé la última versión y descargué la versión 2015-04-20.

¡Hola! Traté de seguir tu truco, pero para mí no hay un `` StanfordDependencyParser '':

print(nltk.__version__)
from nltk.tag import StanfordDependencyParser

3.1
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-7-67bb74c3494a> in <module>()
----> 1 from nltk.tag import StanfordDependencyParser

ImportError: cannot import name 'StanfordDependencyParser'

Alguna idea de como resolver esto? Realmente me gustaría usar la última versión de Stanford.

@methodds Disculpe mi error tipográfico, es from nltk.parse.stanford import StanfordDependencyParser . Consulte https://gist.github.com/alvations/e1df0ba227e542955a8a para obtener explicaciones detalladas.

Gracias por el enlace. Desafortunadamente, no puedo hacer que las variables de entorno funcionen en mi sistema operativo linux mint.

Mi bashrc ve así:

export JAVA_HOME="/usr/lib/jvm/java-8-oracle/"
export PATH=$JAVA_HOME/bin:$PATH

export CLASSPATH="/home/cs/stanford_nlp/stanford-postagger-full-2015-04-20/stanford-postagger.jar:$CLASSPATH"

export CLASSPATH="/home/cs/stanford_nlp/stanford-ner-2015-04-20/stanford-ner.jar:$CLASSPATH"

export STANFORD_MODELS="/home/cs/stanford_nlp/stanford-ner-2015-04-20/classifiers:$STANFORD_MODELS"

export STANFORD_MODELS="/home/cs/stanford_nlp/stanford-postagger-full-2015-04-20/models:$STANFORD_MODELS"

Hacer eco de las variables se ve bien:

echo $CLASSPATH
/home/cs/stanford_nlp/stanford-ner-2015-04-20/stanford-ner.jar:/home/cs/stanford_nlp/stanford-postagger-full-2015-04-20/stanford-postagger.jar

echo $STANFORD_MODELS
/home/cs/stanford_nlp/stanford-postagger-full-2015-04-20/models:/home/cs/stanford_nlp/stanford-ner-2015-04-20/classifiers

Sin embargo (incluso después de reiniciar) NLTK todavía no encuentra el etiquetador:

from nltk.tag.stanford import StanfordPOSTagger
st = StanfordPOSTagger('english-bidirectional-distsim.tagger')
st.tag('What is the airspeed of an unladen swallow ?'.split())

NLTK was unable to find stanford-postagger.jar! Set the CLASSPATH
environment variable.

Haz source .bashrc y funcionará mientras tanto, echa un vistazo a http://apple.stackexchange.com/questions/12993/why-doesnt-bashrc-run-automatically para aprender cómo funciona bashrc.

Gracias por tu consejo, pero obtuve .bashrc de antemano y no funcionó. Lo intenté de nuevo y, lamentablemente, todavía no funciona.

¿Cuál es su distribución y versión de Linux? ¿Puedes hacer un lsb_release -a ? ¿O estás trabajando con una Mac?

Gracias por investigar. ` lsb_release -a devuelve

No LSB modules are available.
Distributor ID: LinuxMint
Description:    Linux Mint 17.3 Rosa
Release:    17.3
Codename:   rosa
  • ¿Dónde hiciste los comandos export ? ¿Qué directorio?
  • ¿Dónde está ejecutando sus scripts de Python? ¿Qué directorio?

Vaya al lugar donde desea ejecutar su script de Python, haga esto: import os; print os.environ .

Luego vaya a su directorio de inicio, inicie Python y haga lo mismo: import os; print os.environ

¿Ves que los 2 conjuntos de variables de entorno difieren?

Supongo que querías que usara import os; print(os.environ) , que no reveló las variables de entorno que exporté en .bashrc . Después de eso, copié y pegué el contenido en .profile (en mi carpeta de inicio) y ahora funciona perfectamente. Aunque no tengo idea de por qué = D.

Me alegro de que .profile funcione, creo que es un problema de distribución del sistema operativo. No recomendaría almacenar las variables de entorno como estáticas, personalmente, las vuelvo a ejecutar cada vez que inicio mis scripts de Python, para estar seguro de que no hay ningún conflicto. ¡Diviértete con la API de NLTK y las herramientas de Stanford!

Gracias :)

qué es 'st' en el comando 'stanford_dir = st._stanford_jar.rpartition (' / ') [0]'

Tengo la misma pregunta que hansen7

para pocos que han estado buscando lo que es st,
st = StanfordNERTagger(os.environ.get('STANFORD_MODELS'))
Ref: https://gist.github.com/manashmndl/810db10809cbc1209b34c7d25efe95d5#file -stanfordnertagger-py

¿Fue útil esta página
0 / 5 - 0 calificaciones