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
@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:
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
export
Befehle ausgeführt? 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
Hilfreichster Kommentar
was ist 'st' im Befehl 'stanford_dir = st._stanford_jar.rpartition('/')[0]'