python - nltk StanfordNERTagger : NoClassDefFoundError: org/slf4j/LoggerFactory (In Windows)

标签 python windows nlp nltk stanford-nlp

注意:我使用 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 jar 位于我的 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 jars 的文件夹,我解压 slf4j 的地方,甚至是 stanford 文件夹中的 lib 文件夹。我不知道为什么会这样:(

会不会是windows?我之前遇到过 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 时,我注意到

jar properties

我在提取的所有文件中都看到了这一点,甚至是 slf4j 文件。这会导致问题吗?

  1. 最后,为什么报错信息说

java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory

我在任何地方都没有看到任何名为 org 的文件夹

更新:环境变量

这是我的环境变量

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

这里有什么问题吗?

最佳答案

已编辑

注意:以下答案仅适用于:

  • NLTK 3.1 版
  • Stanford Tools 自 2015 年 4 月 20 日起编译

因为这两种工具都变化得相当快,而且 API 可能在 3-6 个月后看起来非常不同。请将以下答案视为暂时的而非永恒的解决方案。

总是引用https://github.com/nltk/nltk/wiki/Installing-Third-Party-Software有关如何使用 NLTK 连接斯坦福 NLP 工具的最新说明!


第一步

首先将您的 NLTK 更新到版本 3.1,使用

pip install -U nltk

或(对于 Windows)使用 http://pypi.python.org/pypi/nltk 下载最新的 NLTK

然后使用以下命令检查您的版本是否为 3.1:

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

第二步

然后从http://nlp.stanford.edu/software/stanford-ner-2015-04-20.zip下载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

(有关在 Windows 中设置环境变量的单击 GUI 说明,请参阅 https://stackoverflow.com/a/17176423/610569)

(有关在 Linux 中设置环境变量的详细信息,请参阅 Stanford Parser and NLTK)

第四步

然后在 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 and NLTK

关于python - nltk StanfordNERTagger : NoClassDefFoundError: org/slf4j/LoggerFactory (In Windows),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34361725/

相关文章:

python - 重写 haystack build_page() 函数

Python/PyHive - 从异常中提取特定的错误消息

python - 删除重音符号并保留在 Python 中的点下

node.js - 在 Node.js 上训练分类器(自然 - NLP)以查找意外句子

python - 检查集合是否仅包含另一个集合中的元素的最佳方法?

python - Django Python unique=True 表达式

windows - 在最终用户系统上调试 "application configuration is incorrect"问题的好方法?

c++ - 什么是 CString::StringTraits?它是做什么用的?好像没有文档

Windows 应用程序可以选择保持连接到控制台

python - 将文档分类