【发布时间】:2015-12-18 18:20:22
【问题描述】:
注意:我使用 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 jar 的文件夹、解压缩 slf4j 的位置,甚至是 stanford 文件夹内的 lib 文件夹。我不知道为什么会这样:(
会是窗户吗?我之前遇到过 Windows 路径问题
更新
我拥有的斯坦福 NER 版本是 3.6.0。压缩文件显示
stanford-ner-2015-12-09.zip我也尝试使用
stanford-ner-3.6.0.jar而不是stanford-ner.jar,但仍然遇到同样的错误当我右击
stanford-ner-3.6.0.jar时,我注意到了
我在我提取的所有文件中都看到了这一点,甚至是 slf4j 文件。这会导致问题吗?
- 最后,为什么会出现错误提示
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
这里有什么问题吗?
【问题讨论】:
-
当我运行您的示例脚本时,我收到错误“”“设置 CLASSPATH 环境变量。”“”所以是的,我认为您需要更新它
-
classpath 已经指向解压 stanford 资料的文件夹。我想知道是否还应该在类路径中添加 lib 文件夹的路径
-
lib 文件夹也需要在 CLASSPATH 中。
-
@AbtPst,你让它工作了吗?我在 Mac OS X El Capitan 上遇到了同样的问题。首先它给了我
UnsupportedClassVersionError,这让我将java 7升级到8,然后它给了我这个错误。
标签: python windows nlp nltk stanford-nlp