2014-11-27 9 views
10

Ich versuche nltk.tag.stanford module für Tagging, einen Satz zu verwenden (zunächst wie zB das Wiki), aber ich bekomme immer folgende Fehlermeldung:NLTK Stanford pos Tagger Fehler: Java Befehl fehlgeschlagen

Traceback (most recent call last): 
    File "test.py", line 28, in <module> 
    print st.tag(word_tokenize('What is the airspeed of an unladen swallow ?')) 
    File "/usr/local/lib/python2.7/dist-packages/nltk/tag/stanford.py", line 59, in tag 
    return self.tag_sents([tokens])[0] 
    File "/usr/local/lib/python2.7/dist-packages/nltk/tag/stanford.py", line 81, in tag_sents 
    stdout=PIPE, stderr=PIPE) 
    File "/usr/local/lib/python2.7/dist-packages/nltk/internals.py", line 160, in java 
    raise OSError('Java command failed!') 
OSError: Java command failed! 

oder nach LookupError Fehler:

LookupError: 

=========================================================================== 
NLTK was unable to find the java file! 
Use software specific configuration paramaters or set the JAVAHOME environment variable. 
=========================================================================== 

dies ist der exapmle Code:

>>> from nltk.tag.stanford import POSTagger 
>>> st = POSTagger('/usr/share/stanford-postagger/models/english-bidirectional-distsim.tagger', 
...    '/usr/share/stanford-postagger/stanford-postagger.jar') 
>>> st.tag('What is the airspeed of an unladen swallow ?'.split()) 

habe ichauchstatt split, aber es machte keinen Unterschied.

Ich habe auch Java wieder installiert oder jdk! und meine Suche war erfolglos! etwas wie nltknltk.internals.config_java() oder ...!

Hinweis: Ich benutze Linux (Xubuntu)!

Antwort

7

Wenn Sie die eingebettete Dokumentation in der nltk/internals.py (Zeilen 58 - 175) lesen, sollten Sie Ihre Antwort leicht genug finden. Die NLTK benötigt den vollständigen Pfad zur Java-Binärdatei.

If not specified, then nltk will search the system for a Java binary; and if one is not found, it will raise a LookupError exception.

Sie haben ein paar Optionen, die ich auf der Grundlage einer wenig Forschung glauben:

1) Fügen Sie den folgenden Code in Ihr Projekt (nicht eine große Lösung)

import os 
java_path = "path/to/java" # replace this 
os.environ['JAVAHOME'] = java_path 

2) Deinstallieren & NLTK wieder installieren (vorzugsweise in einem virtualenv) (besser aber immer noch nicht toll)

pip uninstall nltk 
sudo -E pip install nltk 

3) Stellen Sie die Java-Umgebungsvariable (Dies ist die pragmatische Lösung IMO)

Bearbeiten der Systempfad Datei/etc/profile

sudo gedit /etc/profile 

Fügen Sie die folgenden Zeilen in Ende

JAVA_HOME=/usr/lib/jvm/jdk1.7.0 
PATH=$PATH:$HOME/bin:$JAVA_HOME/bin 
export JAVA_HOME 
export JRE_HOME 
export PATH 
+0

in 'usr/lib/jvm /' Ich habe 3 Verzeichnis 'default-java' und' java-1.7.0-openjdak-amd64' und 'java-7-openjdk-amd64' whi ch einer von ihnen kann ich für Pfad verwenden? Ich benutze alle von ihnen, aber ich bekomme den Fehler erneut und versuchen Sie alle Ihren Weg außer 'uninstall' und' install' nltk! wie du sagst, dass ich deinstalliere und wieder installiere? – Kasramvd

+0

@Kasra java-1.7.0-openjdak-amd64 Ich glaube, –

+0

wieder in den Code in einer neuen '.py' Datei umgeschrieben und ausgeführt, dann bekomme ich diesen Fehler' print (stderr.decode (sys.stdout.encoding)) TypeError: decode() Argument 1 muss String sein, nicht None "kennen Sie? es ist für 'nltk/internals.py' Datei! – Kasramvd