nltk StanfordNERTagger: NoClassDefFoundError: org / slf4j / LoggerFactory (в Windows)

ПРИМЕЧАНИЕ. Я использую Python 2.7 как часть дистрибутива Anaconda. Надеюсь, это не проблема для nltk 3.1.

Я пытаюсь использовать nltk для NER как

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) 

но я получаю

 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'] 

но я вижу, что байт slf4j присутствует в моей папке lib. мне нужно обновить переменную среды?

редактировать

Спасибо всем за помощь, но я все равно получаю ту же ошибку. Вот что я пробовал в последнее время

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

а также

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

я получил

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

после этого он продолжает печатать ту же стек, что и раньше. java.lang.ClassNotFoundException: org.slf4j.LoggerFactory

любая идея, почему это может произойти? Я также обновил свой CLASSPATH. Я даже добавил все соответствующие папки в свою переменную среды PATH. Например, в папку, где я распаковывал баннеры stanford, место, где я распаковывал файлы slf4j и даже папку lib внутри папки stanford. я понятия не имею, почему это происходит 🙁

Это могут быть окна? У меня были проблемы с Windows-дорожками до

Обновить

  1. Версия Stanford NER у меня – 3.6.0. В zip-файле говорится, что stanford-ner-2015-12-09.zip

  2. Я также попытался использовать stanford-ner-3.6.0.jar вместо stanford-ner.jar но все равно получаю ту же ошибку

  3. Когда я нажимаю правой кнопкой мыши на stanford-ner-3.6.0.jar , я замечаю

свойства банки

Я вижу это для всех файлов, которые я извлечил, даже файлы slf4j. Может ли это вызвать проблему?

  1. Наконец, почему сообщение об ошибке

java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory

я не вижу ни одной папки с именем org где угодно

Обновление: переменные Env

Вот мои переменные env

 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 

ничего плохого здесь?

8 Solutions collect form web for “nltk StanfordNERTagger: NoClassDefFoundError: org / slf4j / LoggerFactory (в Windows)”

РЕДАКТИРОВАНИЕ

Примечание . Следующий ответ будет работать только на:

  • Версия NLTK 3.1
  • Stanford Инструменты собрано с 2015-04-20

Поскольку оба инструмента изменяются довольно быстро, и API может выглядеть совсем по-другому через 3-6 месяцев. Обращайтесь со следующим ответом как временным, а не вечным исправлением.

Всегда обращайтесь к https://github.com/nltk/nltk/wiki/Installing-Third-Party-Software для получения последней инструкции о том, как взаимодействовать с инструментами Stanford NLP с помощью NLTK!


Шаг 1

Сначала обновите свой NLTK до версии 3.1, используя

 pip install -U nltk 

или (для Windows) загрузите последнюю версию NLTK, используя http://pypi.python.org/pypi/nltk

Затем проверьте, что у вас есть версия 3.1, используя:

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

Шаг 2

Затем загрузите zip-файл с http://nlp.stanford.edu/software/stanford-ner-2015-04-20.zip и разархивируйте файл и сохраните его в C:\some\path\to\stanford-ner\ ( В окнах)

Шаг 3

Затем установите переменную окружения для CLASSPATH в C:\some\path\to\stanford-ner\stanford-ner.jar

и переменную окружения для STANFORD_MODELS в C:\some\path\to\stanford-ner\classifiers

Или в командной строке ( ТОЛЬКО для 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 

(См. https://stackoverflow.com/a/17176423/610569 для кликов по графическому интерфейсу для установки переменных среды в Windows)

(См. Stanford Parser и NLTK для получения подробной информации об установке переменных среды в Linux)

Шаг 4

Затем в 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')] 

Без настройки переменных среды вы можете попробовать:

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

См. Более подробные инструкции по Stanford Parser и NLTK

Я столкнулся с той же проблемой, что и вчера.

Есть три вещи, которые вам нужно сделать.

1) Обновите свой NLTK.

 pip install -U nltk 

Ваша версия должна быть> 3.1, и я вижу, что вы используете

 from nltk.tag.stanford import StanfordNERTagger 

Однако вы должны использовать новый модуль:

 from nltk.tag import StanfordNERTagger 

2) Загрузите slf4j и обновите CLASSPATH.

Вот как вы обновляете свой 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 

Как вы видите выше, javapath содержит 2 пути, один из которых – stanford-ner.jar, другой – где вы скачали slf4j-log4j12-1.7.13.jar (его можно скачать здесь: http: //www.slf4j .org / download.html )

3) Не забудьте указать, где вы загрузили 'english.all.3class.distsim.crf.ser.gz' и 'stanford-ner.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()) 

Я исправил!

u должен указать полный путь slf4j-api.jar в CLASSPATH

вместо добавления jar-path в переменную системной среды, вы можете сделать это в коде:

 _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' 

важно , в nltk / * / stanford.py сбросит путь к классам следующим образом:

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

например. \ Python34 \ Lib \ site-packages \ nltk \ tokenize \ stanford.py строка: 90

u может исправить это следующим образом:

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

ЗАМЕТКА:

Ниже приведен временный взлом для работы с:

  • Версия NLTK 3.1
  • Stanford NER составлен в 2015-12-09

Это решение НЕ должно быть вечным решением.

Всегда обращайтесь к https://github.com/nltk/nltk/wiki/Installing-Third-Party-Software для получения последней инструкции о том, как взаимодействовать с инструментами Stanford NLP с помощью NLTK!

Пожалуйста, отслеживайте обновления по этой проблеме, если вы не хотите использовать этот «взломать»: https://github.com/nltk/nltk/issues/1237 или, пожалуйста, используйте компилятор инструмента NER в 2015-04-20.


Вкратце

Убедитесь, что у вас есть:

  • Версия NLTK 3.1
  • Stanford NER составлен в 2015-12-09
  • Установите переменные среды для CLASSPATH и STANFORD_MODELS

Чтобы установить переменные среды в 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 

Чтобы установить переменные среды в Linux:

 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 

Затем:

 >>> 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')] 

Текущая версия тестера Стэнфорда NER несовместима с nltk потому что для нее требуются дополнительные банки, которые nltk не может добавить в CLASSPATH .

Вместо этого предпочитайте более старую версию Stanford NER Tagger, которая будет работать отлично, как эта: http://nlp.stanford.edu/software/stanford-ner-2015-04-20.zip

Для тех, кто хочет использовать Stanford NER> = 3.6.0 вместо 2015-01-30 (3.5.1) или другую старую версию, сделайте это вместо этого:

  1. Поместите stanford-ner.jar и slf4j-api.jar в ту же папку

    Например, я поместил следующие файлы в / path-to-libs /

    • Стэнфорд-нер-3.6.0.jar
    • SLF4J-апи-1.7.18.jar
  2. Затем:

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

Я думаю, проблема slf4j с тем, как использовался slf4j .

Я на nltk 3.1 и использую stanford-parser-full-2015-12-09 . Я только способ заставить его работать, это изменить /Library/Python/2.7/site-packages/nltk/parse/stanford.py и добавить slf4j jar в self._classpath в методе init .

Это решило. Сырой – но – работает.

Примечание. Я точно не пытался NER. Я пытался что-то вроде ниже

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

По моему мнению, java environment не установлена ​​для python в вашем коде.

Вы можете сделать это, используя следующий код:

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

Проверьте, устраняет ли это вашу проблему.

  • git не может выполнить скрипт python как hook
  • Почему я не могу обработать KeyboardInterrupt в python?
  • Почему virtualenv на Windows не связывает файлы .py / .pyw / .pyo / .pyc с версией исполняемых файлов на виртуальном языке версии Python?
  • Python, pinax, django, windows AttributeError: объект 'module' не имеет атрибута 'call_subprocess'
  • Каков наилучший способ сделать грамотное программирование на Python в Windows?
  • Получено задание печати Python
  • Unicode в PowerShell с Python? Альтернативные оболочки в Windows?
  • Как активировать среду conda в jenkins build
  •  
    Interesting Posts for Van-Lav

    Tornado Получить ссылку на переменную Instance в RequestHandler

    Кэш Django связан с полями ForeignKey и ManyToManyField после их обращения?

    Можно ли получить k-й элемент комбинации m-символьной длины в O (1)?

    Запись в самой верхней строке файла CSV

    Функция трансформирования / распаковки (инверсия zip)?

    Buildozer не выполнил последнюю команду

    pandas + dataframe – выбор по частичной строке

    Почему я могу получить доступ к объекту во время его сообщения post_save, но не тогда, когда я запускаю код внутри этого сигнала, который вызывает его в другом процессе

    Python – текстовое изображение распознавания

    python3 –version показывает «NameError: имя« python3 »не определен»

    moment.calendar () без времени

    Производительность соединения строки python

    Запуск медианы значений y в диапазоне x

    Ошибка памяти в python с использованием массива numpy

    Как выбрать все местоположения уникальных элементов в массиве numpy 2d с ограничивающей рамкой вокруг них?

    Python - лучший язык программирования в мире.