ПРИМЕЧАНИЕ: я использую 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']

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

Изменить

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

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. Например, в папку, куда я разархивировал стэнфордские банки, место, куда разархивировал slf4j, и даже в папку lib внутри папки stanford. я понятия не имею, почему это происходит :(

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

Обновить

  1. У меня есть версия Стэнфордского 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, я замечаю

jar properties

Я вижу это для всех извлеченных файлов, даже для файлов 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

Что-то здесь не так?

11
AbtPst 18 Дек 2015 в 21:20

8 ответов

Лучший ответ

ИЗМЕНЕНО

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

  • NLTK версия 3.1
  • Stanford Tools составлено с 2015-04-20

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

Всегда обращайтесь к https://github.com/nltk/nltk/wiki / Установка стороннего программного обеспечения для получения последней инструкции о том, как взаимодействовать с инструментами 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\ (в windows)

Шаг 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)

(Подробнее о настройке переменных среды в Linux см. Stanford Parser и NLTK)

Шаг 4

Тогда в питоне:

>>> 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.

11
Community 23 Май 2017 в 12:30

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

Я на nltk 3.1 и использую stanford-parser-full-2015-12-09. Единственный способ заставить его работать - изменить /Library/Python/2.7/site-packages/nltk/parse/stanford.py и добавить банку slf4j в 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>')
1
alvas 14 Янв 2016 в 03:47

Я исправил!

Вы должны указать полный путь файла 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

Вы можете исправить это так:

_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
Dylan Wang 21 Янв 2016 в 06:29

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

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

2
nanarth 26 Фев 2016 в 15:38

По моему мнению 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())   

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

0
Rohan Amrute 22 Дек 2015 в 12:52

Лучше всего просто загрузить последнюю версию тегера NER Stanford, в которой проблема с зависимостями устранена (март 2018 г.).

wget https://nlp.stanford.edu/software/stanford-ner-2018-02-27.zip
0
Claude COULOMBE 30 Мар 2018 в 19:23

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

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

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())
4
Aerin 19 Дек 2015 в 09:03

ПРИМЕЧАНИЕ.

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

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

Это решение НЕ предназначено для вечного решения.

Всегда обращайтесь к https://github.com/nltk/nltk/wiki/ Установка стороннего программного обеспечения для получения последней инструкции о том, как взаимодействовать с инструментами 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')]
3
knanne 21 Янв 2016 в 15:57