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 jar在我的lib文件夹中。 我需要更新一个环境variables?

编辑

感谢大家的帮助,但我仍然得到同样的错误。 这是我最近试过的

 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环境variables中。例如,解压缩stanford jar文件的文件夹,解压slf4j的位置,甚至是stanford文件夹中的lib文件夹。 我不知道为什么这是发生:(

它可以是Windows 我以前有Windowspath的问题

更新

  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属性

我看到所有我已经提取的文件,即使是slf4j files.could这是造成这个问题?

  1. 最后,为什么错误消息说

java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory

我没有看到任何地方命名org任何文件夹

更新:Envvariables

这是我的envvariables

 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 

这里有什么不对?

Solutions Collecting From Web of "nltk StanfordNERTagger:NoClassDefFoundError:org / slf4j / LoggerFactory(在Windows中)"

EDITED

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

  • NLTK版本3.1
  • 斯坦福工具自2015-04-20编译

由于这两种工具都相当快速地改变,3-6个月之后,API可能会非常不同。 请把下面的答案看作暂时的,而不是一个永恒的解决方案。

请参考https://github.com/nltk/nltk/wiki/Installing-Third-Party-Software ,了解如何使用NLTK连接斯坦福大学NLP工具的最新指令!


步骤1

首先使用更新您的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文件并解压缩文件并保存&#x5230;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中设置环境变量的单击GUI指示信息&#xFF09;

(有关在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()) 

查看关于斯坦福分析器和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()) 

我解决了!

你应该在CLASSPATH中指出slf4j-api.jar的完整路径

而不是添加jar的路径到系统环境变量,你可以这样做在代码中:

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

注意:

下面是一个时间破解工作:

  • NLTK版本3.1
  • 斯坦福大学NER编译于2015-12-09

这个解决方案不是一个永恒的解决方案。

请参考https://github.com/nltk/nltk/wiki/Installing-Third-Party-Software ,了解如何使用NLTK连接斯坦福大学NLP工具的最新指令!

如果你不想使用这个“黑客”,请跟踪这个问题的更新: https : //github.com/nltk/nltk/issues/1237或在2015-04-20请使用NER工具。


简而言之

确保你有:

  • NLTK版本3.1
  • 斯坦福大学NER编译于2015-12-09
  • CLASSPATHSTANFORD_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其他jar。

相反,宁愿使用斯坦福NER Tagger的老版本,它可以像这样完美地工作: http : //nlp.stanford.edu/software/stanford-ner-2015-04-20.zip

对于那些想使用斯坦福NER> = 3.6.0而不是2015-01-30(3.5.1)或其他旧版本的用户,请改为:

  1. 将stanford-ner.jar和slf4j-api.jar放到同一个文件夹中

    例如,我把下面的文件放到/ path-to-libs /

    • 斯坦福大学NER-3.6.0.jar
    • SLF4J-API 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

我正在使用nltk 3.1并使用stanford-parser-full-2015-12-09 。 我唯一的方法,我可以得到它的工作是修改/Library/Python/2.7/site-packages/nltk/parse/stanford.pyslf4j jar添加到self._classpathinit方法。

这解决了它。 原油,但工程。

注意 – 我并不是完全没有尝试过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>') 

据我所说,在你的代码中没有为python设置java environment

你可以通过使用下面的代码来做到这一点:

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

检查这是否解决您的问题。