Nltk: OSError : la commande Java a échoué lors de l'utilisation de l'exemple d'analyseur syntaxique stanford

Créé le 25 déc. 2015  ·  18Commentaires  ·  Source: nltk/nltk

Salut,

J'essaie d'exécuter l'exemple de l'analyseur syntaxique stanford. Par exemple

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.")]

l'exécution de la dernière commande génère une erreur :

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

lorsque je reproduis la même commande sur la ligne de commande, j'obtiens l'erreur Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory

Par conséquent, après avoir ajouté slf4j-api.jar au chemin de classe _sur la ligne de commande_, l'analyse est réussie.

Comment slf4j-api.jar peut-il être ajouté au chemin de classe nltk, afin que l'analyse soit réussie ?

Merci!
Joyeuses fêtes

Commentaire le plus utile

qu'est-ce que 'st' dans la commande 'stanford_dir = st._stanford_jar.rpartition('/')[0]'

Tous les 18 commentaires

@yuvval Juste pour être sûr que vous utilisez la version 2015-12-09 de Stanford Parser ? Si tel est le cas, cette erreur se produit car le nouveau StanfordNLP utilise plus de dépendances qu'auparavant. Ceci est similaire à #1237

Vous devrez attendre un certain temps avant que #1237 ne soit corrigé et que NLTK rattrape les outils Standford.

La solution rapide consiste soit à :

  1. utilisez la version précédente 2015-04-20 de http://nlp.stanford.edu/software/stanford-parser-full-2015-04-20.zip et l'API NLTK fonctionnerait, voir http://stackoverflow.com /questions/13883277/stanford-parser-and-nltk/34112695#34112695 ou
  2. pirater le chemin de classe de l'analyseur 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.")]

Merci! Il fonctionne avec la version 2015-04-20.

Le piratage du chemin de classe a-t-il également fonctionné ?

Je n'ai pas essayé - j'ai juste supprimé la dernière version et téléchargé la version 2015-04-20.

Salut! J'ai essayé de suivre votre hack mais pour moi il n'y a pas de `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'

Aucune idée sur la façon de résoudre ça? J'aimerais vraiment utiliser la dernière version de stanford.

@methodds Excusez ma faute de frappe, c'est from nltk.parse.stanford import StanfordDependencyParser . Veuillez consulter https://gist.github.com/alvations/e1df0ba227e542955a8a pour des explications détaillées.

Merci pour le lien. Malheureusement, je ne parviens pas à faire fonctionner les variables d'environnement sur mon système d'exploitation Linux Mint.

Mon bashrc ressemble à ceci :

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"

Faire écho aux variables semble correct :

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

Cependant (même après le redémarrage) NLTK ne trouve toujours pas le tagueur :

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.

Faites source .bashrc et cela fonctionnera pendant ce temps, jetez un œil à http://apple.stackexchange.com/questions/12993/why-doesnt-bashrc-run-automatically pour apprendre comment fonctionne bashrc.

Merci pour votre astuce, mais j'ai source .bashrc au préalable et cela n'a pas fonctionné. J'ai réessayé et malheureusement cela ne fonctionne toujours pas.

Quelle est votre distribution et version Linux ? Pouvez-vous faire un lsb_release -a ? Ou travaillez-vous avec un Mac ?

Merci d'avoir enquêté. ` lsb_release -a renvoie

No LSB modules are available.
Distributor ID: LinuxMint
Description:    Linux Mint 17.3 Rosa
Release:    17.3
Codename:   rosa
  • Où avez-vous fait les commandes export ? Quel répertoire ?
  • Où exécutez-vous vos scripts python ? Quel répertoire ?

Allez à l'endroit où vous voulez exécuter votre script python, faites ceci : import os; print os.environ .

Ensuite, allez dans votre répertoire personnel, lancez python et faites de même : import os; print os.environ

Voyez-vous que les 2 ensembles de variables d'environnement diffèrent ?

Je suppose que vous vouliez que j'utilise import os; print(os.environ) , qui n'a pas révélé les variables d'environnement que j'ai exportées dans .bashrc . Après cela, j'ai copié collé le contenu dans .profile (dans mon dossier personnel) et maintenant cela fonctionne parfaitement. Je ne sais pas pourquoi si =D.

Heureux que .profile fonctionne, je pense que c'est un problème de distribution du système d'exploitation. Je ne recommanderais pas de stocker les variables d'environnement comme statiques, personnellement, je les réexécute à chaque fois que je démarre mes scripts python, afin que je puisse être sûr qu'il n'y a pas de conflit. Amusez-vous avec l'API NLTK et les outils Stanford !

Merci :)

qu'est-ce que 'st' dans la commande 'stanford_dir = st._stanford_jar.rpartition('/')[0]'

j'ai la même question que hansen7

pour quelques-uns qui ont cherché ce qui est st,
st = StanfordNERTagger(os.environ.get('STANFORD_MODELS'))
Réf : https://gist.github.com/manashmndl/810db10809cbc1209b34c7d25efe95d5#file -stanfordnertagger-py

Cette page vous a été utile?
0 / 5 - 0 notes