2014-11-27 12 views
10

Próbuję użyć nltk.tag.stanford module do znakowania zdanie (pierwsza jak np wiki jest), ale wciąż otrzymuję następujący błąd:błąd poz tagger NLTK Stanford: polecenie Java udało

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! 

lub po LookupError błędzie:

LookupError: 

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

jest to kod exapmle:

>>> 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()) 

użyłem również word_tokenize zamiast tego split, ale nie robi to żadnej różnicy.

Zainstalowałem także java ponownie lub jdk! a wszystkie moje wyszukiwania zakończyły się niepowodzeniem! coś jak nltknltk.internals.config_java() lub ...!

Uwaga: Używam linux (Xubuntu)!

Odpowiedz

7

Jeśli przeczytasz wbudowaną dokumentację w nltk/internals.py (wiersze 58 - 175), odpowiedź powinna być dość prosta. NLTK wymaga pełnej ścieżki do pliku binarnego Java.

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.

Masz kilka opcji wierzę w oparciu o trochę badań:

1) Dodaj następujący kod do projektu (nie świetne rozwiązanie)

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

2) Odinstaluj & Ponownie zainstaluj NLTK (najlepiej w wersji virtualenv) (lepiej, ale nadal nie świetnej)

pip uninstall nltk 
sudo -E pip install nltk 

3) Ustaw zmienną środowiskową Java (To jest najbardziej pragmatyczne rozwiązanie IMO)

Edytuj plik Path System/etc/profile

sudo gedit /etc/profile 

Dodaj następujący linii w końcu

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

w 'usr/lib/jvm /' Mam 3 katalogi 'default-java' i' java-1.7.0-openjdak-amd64' oraz 'java-7-openjdk-amd64' whi ch jeden z nich mogę użyć do ścieżki? Używam ich wszystkich, ale otrzymuję błąd ponownie i próbuję na wszystkie sposoby z wyjątkiem 'uninstall' i' install' nltk! jak możesz powiedzieć, że odinstalowuję i instaluję ponownie? – Kasramvd

+0

@Kasra java-1.7.0-openjdak-amd64 Wierzę, że –

+0

ponownie przepisał kod w nowym pliku '.py' i wykonał go, a następnie dostaję ten błąd' print (stderr.decode (sys.stdout.encoding)) TypeError: decode() argument 1 musi być łańcuchem, a nie "None", który znasz? jego dla pliku 'nltk/internals.py'! – Kasramvd