2015-12-18 7 views
9

HINWEIS: Ich verwende Python 2.7 als Teil der Anaconda-Distribution. Ich hoffe, das ist kein Problem für Nltk 3.1.nltk StanfordNERTagger: NoClassDefFoundError: org/slf4j/LoggerFactory (unter Windows)

Ich versuche, für NER zu verwenden nltk als

import nltk 
from nltk.tag.stanford import StanfordNERTagger 
#st = StanfordNERTagger('stanford-ner/all.3class.distsim.crf.ser.gz', 'stanford-ner/stanford-ner.jar') 
st = StanfordNERTagger('english.all.3class.distsim.crf.ser.gz') 
print st.tag(str) 

aber ich bekomme

Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory 
    at edu.stanford.nlp.io.IOUtils.<clinit>(IOUtils.java:41) 
    at edu.stanford.nlp.ie.AbstractSequenceClassifier.classifyAndWriteAnswers(AbstractSequenceClassifier.java:1117) 
    at edu.stanford.nlp.ie.AbstractSequenceClassifier.classifyAndWriteAnswers(AbstractSequenceClassifier.java:1076) 
    at edu.stanford.nlp.ie.AbstractSequenceClassifier.classifyAndWriteAnswers(AbstractSequenceClassifier.java:1057) 
    at edu.stanford.nlp.ie.crf.CRFClassifier.main(CRFClassifier.java:3088) 
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    ... 5 more 

Traceback (most recent call last): 
    File "X:\jnk.py", line 47, in <module> 
    print st.tag(str) 
    File "X:\Anaconda2\lib\site-packages\nltk\tag\stanford.py", line 66, in tag 
    return sum(self.tag_sents([tokens]), []) 
    File "X:\Anaconda2\lib\site-packages\nltk\tag\stanford.py", line 89, in tag_sents 
    stdout=PIPE, stderr=PIPE) 
    File "X:\Anaconda2\lib\site-packages\nltk\internals.py", line 134, in java 
    raise OSError('Java command failed : ' + str(cmd)) 
OSError: Java command failed : ['X:\\PROGRA~1\\Java\\JDK18~1.0_6\\bin\\java.exe', '-mx1000m', '-cp', 'X:\\stanford\\stanford-ner.jar', 'edu.stanford.nlp.ie.crf.CRFClassifier', '-loadClassifier', 'X:\\stanford\\classifiers\\english.all.3class.distsim.crf.ser.gz', '-textFile', 'x:\\appdata\\local\\temp\\tmpqjsoma', '-outputFormat', 'slashTags', '-tokenizerFactory', 'edu.stanford.nlp.process.WhitespaceTokenizer', '-tokenizerOptions', '"tokenizeNLs=false"', '-encoding', 'utf8'] 

, aber ich kann sehen, dass die slf4j Glas in meinem lib Ordner gibt. Muss ich eine Umgebungsvariable aktualisieren?

bearbeiten

Vielen Dank allen für ihre Hilfe, aber ich immer noch die gleichen Fehler. Hier ist, was ich vor kurzem versucht,

import nltk 
from nltk.tag import StanfordNERTagger 
print(nltk.__version__) 
stanford_ner_dir = 'X:\\stanford\\' 
eng_model_filename= stanford_ner_dir + 'classifiers\\english.all.3class.distsim.crf.ser.gz' 
my_path_to_jar= stanford_ner_dir + 'stanford-ner.jar' 
st = StanfordNERTagger(model_filename=eng_model_filename, path_to_jar=my_path_to_jar) 
print st._stanford_model 
print st._stanford_jar 

st.tag('Rami Eid is studying at Stony Brook University in NY'.split()) 

und auch

import nltk 
from nltk.tag import StanfordNERTagger 
print(nltk.__version__) 
st = StanfordNERTagger('english.all.3class.distsim.crf.ser.gz') 
print st._stanford_model 
print st._stanford_jar 
st.tag('Rami Eid is studying at Stony Brook University in NY'.split()) 

i bekommen

3.1 
X:\stanford\classifiers\english.all.3class.distsim.crf.ser.gz 
X:\stanford\stanford-ner.jar 

nach, dass es weitergeht wie bisher die gleiche Stacktrace zu drucken. java.lang.ClassNotFoundException: org.slf4j.LoggerFactory

eine Idee, warum dies passieren könnte? Ich habe auch meinen CLASSPATH aktualisiert. Ich habe sogar alle relevanten Ordner zu meiner PATH-Umgebungsvariablen hinzugefügt. Zum Beispiel den Ordner, in dem ich die Stanford-Jars entpackt habe, den Ort, an dem ich Slf4j entpackt habe und sogar den lib-Ordner im Stanford-Ordner. Ich habe keine Ahnung, warum dies geschieht :(

Könnte es sein Fenster? Ich habe

aktualisieren

  1. Die Stanford NER Version Ich habe vor Probleme mit Windows-Pfade haben ist 3.6.0 Die Zip-Datei sagt stanford-ner-2015-12-09.zip

  2. Ich versuchte auch mit der stanford-ner-3.6.0.jar anstelle von stanford-ner.jar aber immer noch die gleichen Fehler

  3. Wenn ich nach rechts auf dem stanford-ner-3.6.0.jar klicken, merke ich

jar properties

ich dies sehen für alle Dateien, die ich gewonnen habe, auch die slf4j files.could verursacht das das Problem?

  1. Schließlich warum die Fehlermeldung sagen

java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory

ich sehe keinen Ordner mit dem Namen org überall

Update: Env Variablen

Hier sind meine env Variablen

CLASSPATH 
.; 
X:\jre1.8.0_60\lib\rt.jar; 
X:\stanford\stanford-ner-3.6.0.jar; 
X:\stanford\stanford-ner.jar; 
X:\stanford\lib\slf4j-simple.jar; 
X:\stanford\lib\slf4j-api.jar; 
X:\slf4j\slf4j-1.7.13\slf4j-1.7.13\slf4j-log4j12-1.7.13.jar 

STANFORD_MODELS 
X:\stanford\classifiers 

JAVA_HOME 
X:\PROGRA~1\Java\JDK18~1.0_6 

PATH 
X:\PROGRA~1\Java\JDK18~1.0_6\bin; 
X:\stanford; 
X:\stanford\lib; 
X:\slf4j\slf4j-1.7.13\slf4j-1.7.13 

irgendetwas falsch hier?

+0

Wenn ich Ihr Beispielskript ausgeführt habe, habe ich den Fehler "" "Setzen Sie die CLASSPATH-Umgebungsvariable." "" Also ja, ich würde annehmen, Sie müssen es aktualisieren –

+0

classpath zeigt bereits auf den Ordner, in dem Stanford-Zeug entpackt wurde. Ich frage mich, ob ich auch den Pfad zum lib-Ordner im Klassenpfad – AbtPst

+0

http://www.nltk.org/api/nltk.tag.html#module-nltk.tag.stanford hinzufügen sollte, wenn Sie das nicht überprüft haben noch –

Antwort

11

EDITED

Hinweis: Die folgende Antwort wird nur auf Arbeit:

  • NLTK Version 3.1
  • Stanford-Tools zusammengestellt seit 2015-04-20

Da beide Tools ändern sich ziemlich schnell und die API kann 3-6 Monate später sehr unterschiedlich aussehen. Bitte behandeln Sie die folgende Antwort als zeitliche und nicht als ewige Lösung.

Die neueste Anleitung zur Verbindung von Stanford NLP-Tools mit NLTK finden Sie immer unter https://github.com/nltk/nltk/wiki/Installing-Third-Party-Software.


Schritt 1

Erstes Update Ihre NLTK auf die Version 3.1 mit

oder (für Windows) Laden Sie die neuesten NLTK mit http://pypi.python.org/pypi/nltk

Dann überprüfen Sie, dass Sie Version haben 3.1:

python3 -c "import nltk; print(nltk.__version__)" 

Schritt 2

Dann laden Sie die Zip-Datei aus http://nlp.stanford.edu/software/stanford-ner-2015-04-20.zip und entpacken Sie die Datei und C:\some\path\to\stanford-ner\ (Windows) speichern

Schritt 3

dann die Umgebungsvariable für CLASSPATH zu

und die Umgebungsvariable für STANFORD_MODELS zu C:\some\path\to\stanford-ner\classifiers

oder in der Befehlszeile (NUR für Windows):

set CLASSPATH=%CLASSPATH%;C:\some\path\to\stanford-ner\stanford-ner.jar 
set STANFORD_MODELS=%STANFORD_MODELS%;C:\some\path\to\stanford-ner\classifiers 

(Siehe https://stackoverflow.com/a/17176423/610569 für Klick-Klick GUI Anweisungen für Umgebungsvariablen in Windows Einstellung)

(Siehe Stanford Parser and NLTK Einzelheiten zur Einstellung von Umgebungsvariablen unter Linux)

Schritt 4

Dann in Python:

>>> from nltk.tag import StanfordNERTagger 
>>> st = StanfordNERTagger('english.all.3class.distsim.crf.ser.gz') 
>>> st.tag('Rami Eid is studying at Stony Brook University in NY'.split()) 
[(u'Rami', u'PERSON'), (u'Eid', u'PERSON'), (u'is', u'O'), (u'studying', u'O'), (u'at', u'O'), (u'Stony', u'ORGANIZATION'), (u'Brook', u'ORGANIZATION'), (u'University', u'ORGANIZATION'), (u'in', u'O'), (u'NY', u'O')] 

Ohne die Umgebungsvariablen, können Sie versuchen:

from nltk.tag import StanfordNERTagger 

stanford_ner_dir = 'C:\\some\path\to\stanford-ner\' 
eng_model_filename= stanford_ner_dir + 'classifiers\english.all.3class.distsim.crf.ser.gz' 
my_path_to_jar= stanford_ner_dir + 'stanford-ner.jar' 

st = StanfordNERTagger(model_filename=eng_model_filename, path_to_jar=my_path_to_jar) 
st.tag('Rami Eid is studying at Stony Brook University in NY'.split()) 

Weitere detaillierte Anweisungen zum Stanford Parser and NLTK

+0

danke für die detaillierte Erklärung. Ich habe versucht, Ihren Ansatz, aber ich bekomme immer noch den Fehler.Bitte beachten Sie die Bearbeitung – AbtPst

+1

Haben Sie versucht 'set CLASSPATH =% CLASSPATH%; C: \ einige \ path \ to \ stanford-ner \ stanford-ner.jar' und' set STANFORD_MODELS =% STANFORD_MODELS%; C: \ some \ path \ to \ stanford-ner \ classifiers' – alvas

+0

Siehe http://stackoverflow.com/a/4855685/610569 – alvas

4

ich genau das gleiche Problem aufgetreten, wie Sie beschrieben gestern.

Es gibt 3 Dinge, die Sie tun müssen.

1) Aktualisieren Sie Ihre NLTK.

sollte Ihre Version> 3.1 sein und ich sehe Sie

from nltk.tag.stanford import StanfordNERTagger 

jedoch verwenden, muss Sie das neue Modul verwenden:

from nltk.tag import StanfordNERTagger 

2) Herunterladen slf4j und Aktualisieren Sie Ihren CLASSPATH.

So aktualisieren Sie Ihren CLASSPATH.

javapath = "/Users/aerin/Downloads/stanford-ner-2014-06-16/stanford-ner.jar:/Users/aerin/java/slf4j-1.7.13/slf4j-log4j12-1.7.13.jar" 
os.environ['CLASSPATH'] = javapath 

Wie Sie oben sehen, enthält die javapath 2 Pfade, ist man in dem Stanford-ner.jar, das andere ist, wo Sie slf4j-log4j12-1.7.13.jar (Es heruntergeladen hier heruntergeladen werden kann: http://www.slf4j.org/download.html)

3) vergessen Sie nicht, wo Sie heruntergeladen 'english.all.3class.distsim.crf.ser.gz' & ‚Stanford-ner angeben.‚Jar

st = StanfordNERTagger('/Users/aerin/Downloads/stanford-ner-2014-06-16/classifiers/english.all.3class.distsim.crf.ser.gz','/Users/aerin/Downloads/stanford-ner-2014-06-16/stanford-ner.jar') 

st.tag("Doneyo lab did such an awesome job!".split()) 
+0

danke für die detaillierte Erklärung. Ich habe versucht, Ihren Ansatz, aber ich bekomme immer noch den Fehler. Bitte beachten Sie die Bearbeitung – AbtPst

+0

Bitte beachten Sie die Bearbeitung, ich habe Details über meine env-Variablen hinzugefügt. – AbtPst

+0

danke für deine Hilfe @doneyo, aber es sieht aus wie das Problem war mit der Stanford ner Version, die ich benutzte. – AbtPst

2

HINWEIS:

Im Folgenden eine zeitliche Hack ist, mit zu arbeiten:

  • NLTK Version 3.1
  • Stanford NER auf 2015.12.09
  • zusammengestellt

Diese Lösung ist NICHT soll eine ewige Lösung sein.

Eine aktuelle Anleitung zur Verbindung von Stanford NLP-Werkzeugen mit NLTK finden Sie immer unter https://github.com/nltk/nltk/wiki/Installing-Third-Party-Software.

Bitte verfolgen Sie Updates zu diesem Problem, wenn Sie diesen "hack" nicht verwenden möchten: https://github.com/nltk/nltk/issues/1237 oder verwenden Sie bitte das NER-Tool compield am 2015-04-20.


Im Kurzen

Stellen Sie sicher, dass Sie haben:

  • NLTK Version 3.1
  • Stanford NER zusammengestellt auf 2015-12-09
  • die Umgebungsvariablen für CLASSPATH Set und STANFORD_MODELS

Um Umgebungsvariablen in Windows festgelegt:

set CLASSPATH=%CLASSPATH%;C:\some\path\to\stanford-ner\stanford-ner.jar 
set STANFORD_MODELS=%STANFORD_MODELS%;C:\some\path\to\stanford-ner\classifiers 

Um Umgebungsvariablen in Linux gesetzt:

export STANFORDTOOLSDIR=/home/some/path/to/stanfordtools/ 
export CLASSPATH=$STANFORDTOOLSDIR/stanford-ner-2015-12-09/stanford-ner.jar 
export STANFORD_MODELS=$STANFORDTOOLSDIR/stanford-ner-2015-12-09/classifiers 

Dann:

>>> from nltk.internals import find_jars_within_path 
>>> from nltk.tag import StanfordNERTagger 
>>> st = StanfordNERTagger('english.all.3class.distsim.crf.ser.gz') 
# Note this is where your stanford_jar is saved. 
# We are accessing the environment variables you've 
# set through the NLTK API. 
>>> print st._stanford_jar 
/home/alvas/stanford-ner-2015-12-09/stanford-ner.jar 
>>> stanford_dir = st._stanford_jar.rpartition("\\")[0] # windows 
# Note in linux you do this instead: 
>>> stanford_dir = st._stanford_jar.rpartition('/')[0] # linux 
# Use the `find_jars_within_path` function to get all the 
# jar files out from stanford NER tool under the libs/ dir. 
>>> stanford_jars = find_jars_within_path(stanford_dir) 
# Put the jars back into the `stanford_jar` classpath. 
>>> st._stanford_jar = ':'.join(stanford_jars) # linux 
>>> st._stanford_jar = ';'.join(stanford_jars) # windows 
>>> st.tag('Rami Eid is studying at Stony Brook University in NY'.split()) 
[(u'Rami', u'PERSON'), (u'Eid', u'PERSON'), (u'is', u'O'), (u'studying', u'O'), (u'at', u'O'), (u'Stony', u'ORGANIZATION'), (u'Brook', u'ORGANIZATION'), (u'University', u'ORGANIZATION'), (u'in', u'O'), (u'NY', u'O')] 
0

die java environment mir Nach ist für Python nicht gesetzt in dein Code.

könnten Sie tun, dass Sie den folgenden Code unter Verwendung von:

from nltk.tag.stanford import NERTagger 
import os 
java_path = "/Java/jdk1.8.0_45/bin/java.exe" 
os.environ['JAVAHOME'] = java_path 
st = NERTagger('../ner-model.ser.gz','../stanford-ner.jar') 
tagging = st.tag(text.split()) 

Überprüfen Sie, ob das Ihr Problem löst.

+0

Ich denke, das ist nicht das Problem. Denn wenn Java nicht richtig initialisiert wird, wäre die Java-Ausnahme nicht erschienen. – alvas

1

Ich denke, das Problem ist, wie slf4j verwendet wurde.

Ich bin auf Nltk 3.1 und mit stanford-parser-full-2015-12-09. Ich konnte es nur zur Arbeit bekommen, indem ich /Library/Python/2.7/site-packages/nltk/parse/stanford.py ändere und das slf4j Gefäß zu self._classpath innerhalb der Methode init hinzufüge.

Das hat es gelöst. Grob - aber - funktioniert.

Hinweis - Ich habe NER nicht genau versucht.Ich habe versucht, etwas wie unten

import os 
from nltk.parse import stanford 
os.environ['STANFORD_PARSER'] = '/Users/run2/stanford-parser-full-2015-12-09' 
os.environ['STANFORD_MODELS'] = '/Users/run2/stanford-parser-full-2015-12-09' 
parser = stanford.StanfordParser(model_path='/Users/run2/stanford-parser-full-2015-12-09/englishPCFG.ser.gz') 
sentences = parser.raw_parse_sents('<some sentence from my corpus>') 
+0

hat diese Lösung funktioniert? http://stackoverflow.com/a/34403741/610569 Es sollte. – alvas

+0

Nein - das funktioniert nicht, weil stanford.py die Klassenpfad-Gläser fest codiert – Run2

+0

Versuchen Sie den "Hack" von hier: https://github.com/nltk/nltk/issues/1239#issuecomment-167224937 – alvas

2

ich repariert!

u sollte zeigen den vollständigen Pfad von slf4j-api.jar in CLASSPATH

statt add jar-Pfad in Systemumgebungsvariable, u kann in Code wie folgt tun:

_CLASS_PATH = "."  
if os.environ.get('CLASSPATH') is not None: 
    _CLASS_PATH = os.environ.get('CLASSPATH') 
os.environ['CLASSPATH'] = _CLASS_PATH + ';F:\Python\Lib\slf4j\slf4j-api-1.7.13.jar' 

wichtig, in nltk/*/stanford.py wird zurückgesetzt die classpath wie folgt aus:

stdout, stderr = java(cmd, classpath=self._stanford_jar, stdout=PIPE, stderr=PIPE) 

z. \ Python34 \ Lib \ site-packages \ nltk \ tokenize \ stanford.py line: 90

u es wie dieses Problem beheben:

_CLASS_PATH = "." 
if os.environ.get('CLASSPATH') is not None: 
    _CLASS_PATH = os.environ.get('CLASSPATH') 
stdout, stderr = java(cmd, classpath=(self._stanford_jar, _CLASS_PATH), stdout=PIPE, stderr=PIPE) 
2

Aktuelle Stanford NER Tagger-Version nicht kompatibel mit nltk ist, weil es erfordert zusätzliche Gläser, die nltk nicht zu der CLASSPATH hinzufügen können.

Statt eine ältere Version von Stanford NER Tagger bevorzugen, das wird so perfekt funktioniert gut ein: http://nlp.stanford.edu/software/stanford-ner-2015-04-20.zip

2

Für alle, die Stanford NER> = 3.6.0 statt der 2015.01.30 (3.5 verwenden möchten 0,1) oder andere alte Version, tun Sie stattdessen:

  1. setzen Sie die Stanford-ner.jar und slf4j-api.jar in den gleichen Ordner

    Zum Beispiel habe ich die folgenden Dateien zu /Pfad-zu-libs/

    • Stanford-Ner-3.6.0.jar
    • slf4j-api-1.7.18.jar
  2. Dann:

    classpath = "/path-to-libs/*" 
    
    st = nltk.tag.StanfordNERTagger(
        "/path-to-model/ner-model.ser.gz", 
        "/path-to-libs/stanford-ner-3.6.0.jar" 
    ) 
    st._stanford_jar = classpath 
    result = st.tag(["Hello"])