Nltk: OSError: Java-Befehl ist bei Verwendung des Stanford-Parser-Beispiels fehlgeschlagen

Erstellt am 25. Dez. 2015  ·  18Kommentare  ·  Quelle: nltk/nltk

Hi,

Ich versuche, das Stanford-Parser-Beispiel auszuführen. Z.B

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

Die Ausführung des letzten Befehls führt zu einem Fehler:

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

Wenn ich denselben Befehl in der Befehlszeile reproduziere, erhalte ich den Fehler Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory

Daher ist die Analyse erfolgreich, nachdem slf4j-api.jar zum Klassenpfad _auf der Befehlszeile_ hinzugefügt wurde.

Wie kann slf4j-api.jar zum nltk-Klassenpfad hinzugefügt werden, damit das Parsen erfolgreich ist?

Dankeschön!
Schöne Ferien

Hilfreichster Kommentar

was ist 'st' im Befehl 'stanford_dir = st._stanford_jar.rpartition('/')[0]'

Alle 18 Kommentare

@yuvval Nur um sicher zu gehen, verwenden Sie Stanford Parser Version 2015-12-09? Wenn dies der Fall ist, tritt dieser Fehler auf, weil das neue StanfordNLP mehr Abhängigkeiten verwendet als zuvor. Dies ist ähnlich wie #1237

Sie müssten eine Weile warten, bis #1237 behoben ist und NLTK die Standford-Tools einholt.

Die schnelle Lösung ist entweder:

  1. Verwenden Sie die vorherige Version 2015-04-20 von http://nlp.stanford.edu/software/stanford-parser-full-2015-04-20.zip und die NLTK-API würde funktionieren, siehe http://stackoverflow.com /questions/13883277/stanford-parser-and-nltk/34112695#34112695 oder
  2. hacken Sie den Stanford-Parser-Klassenpfad:
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.")]

Dankeschön! Es funktioniert mit der 2015-04-20-Version.

Hat der Klassenpfad-Hack auch funktioniert?

Ich habe es nicht versucht - ich habe nur die neueste Version gelöscht und die Version 2015-04-20 heruntergeladen.

Hi! Ich habe versucht, deinem Hack zu folgen, aber für mich gibt es keinen `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'

Irgendeine Idee, wie man das lösen kann? Ich würde wirklich gerne die neueste Stanford-Version verwenden.

@methodds Verzeihen Sie meinen Tippfehler, es ist from nltk.parse.stanford import StanfordDependencyParser . Detaillierte Erläuterungen finden Sie unter https://gist.github.com/alvations/e1df0ba227e542955a8a .

Danke für den Link. Leider kann ich die Umgebungsvariablen nicht auf meinem Linux-Mint-Betriebssystem zum Laufen bringen.

Mein bashrc sieht so aus:

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"

Das Echo der Variablen sieht richtig aus:

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

Allerdings (auch nach einem Neustart) findet NLTK den Tagger immer noch nicht:

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.

Machen Sie source .bashrc und es wird in der Zwischenzeit funktionieren. Sehen Sie sich http://apple.stackexchange.com/questions/12993/why-doesnt-bashrc-run-automatically an, um zu erfahren, wie bashrc funktioniert.

Vielen Dank für Ihren Tipp, aber ich habe vorher .bashrc bezogen und es hat nicht funktioniert. Ich habe es nochmal probiert und leider funktioniert es immer noch nicht.

Was ist Ihre Linux-Distribution und -Version? Kannst du lsb_release -a ? Oder arbeitest du mit einem Mac?

Vielen Dank für die Untersuchung. ` lsb_release -a kehrt zurück

No LSB modules are available.
Distributor ID: LinuxMint
Description:    Linux Mint 17.3 Rosa
Release:    17.3
Codename:   rosa
  • Wo hast du die export Befehle ausgeführt? Welches Verzeichnis?
  • Wo führen Sie Ihre Python-Skripte aus? Welches Verzeichnis?

Gehen Sie zu dem Ort, an dem Sie Ihr Python-Skript ausführen möchten: import os; print os.environ .

Gehen Sie dann in Ihr Home-Verzeichnis, starten Sie Python und machen Sie dasselbe: import os; print os.environ

Sehen Sie, dass sich die beiden Sätze von Umgebungsvariablen unterscheiden?

Ich nehme an, Sie wollten, dass ich import os; print(os.environ) , was die Umgebungsvariablen, die ich in .bashrc exportiert habe, nicht enthüllt. Danach habe ich den Inhalt kopiert und in .profile (in meinem Home-Ordner) eingefügt und jetzt funktioniert es perfekt. Keine Ahnung warum =D.

Ich bin froh, dass .profile funktioniert, ich denke, es ist ein Problem mit der Betriebssystemverteilung. Ich würde nicht empfehlen, die Umgebungsvariablen statisch zu speichern, ich persönlich führe sie jedes Mal erneut aus, wenn ich meine Python-Skripte starte, damit ich sicher sein kann, dass es keinen Konflikt gibt. Viel Spaß mit der NLTK-API und den Stanford-Tools!

Dankeschön :)

was ist 'st' im Befehl 'stanford_dir = st._stanford_jar.rpartition('/')[0]'

Ich habe die gleiche Frage wie hansen7

für wenige, die gesucht haben, was st ist,
st = StanfordNERTagger(os.environ.get('STANFORD_MODELS'))
Ref: https://gist.github.com/manashmndl/810db10809cbc1209b34c7d25efe95d5#file -stanfordnertagger-py

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

Chris00 picture Chris00  ·  3Kommentare

stevenbird picture stevenbird  ·  3Kommentare

mwess picture mwess  ·  5Kommentare

DavidNemeskey picture DavidNemeskey  ·  4Kommentare

alvations picture alvations  ·  4Kommentare