注意:我使用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.(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 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.zip文件说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
在任何地方
更新: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
这里有什么问题?
注意:以下答案仅适用于:
NLTK版本3.1
斯坦福工具自2015-04-20开始编制
由于这两种工具变化相当快,因此API可能在3-6个月后看起来非常不同.请将以下答案视为时间而非永恒的解决方案.
请参阅https://github.com/nltk/nltk/wiki/Installing-Third-Party-Software以获取有关如何使用NLTK连接Stanford 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__)"第2步
然后从http://nlp.stanford.edu/software/stanford-ner-2015-04-20.zip下载zip文件并解压缩该文件并保存到C:\some\path\to\stanford-ner\
(在Windows中)
然后将环境变量设置CLASSPATH
为C:\some\path\to\stanford-ner\stanford-ner.jar
以及STANFORD_MODELS
to
的环境变量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说明,请参阅/sf/ask/17360801/)
(有关在Linux中设置环境变量的详细信息,请参阅Stanford Parser和NLTK)
第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的更多详细说明