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
@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:
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
export
? ¿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
Comentario más útil
qué es 'st' en el comando 'stanford_dir = st._stanford_jar.rpartition (' / ') [0]'