感谢Alvas'回答。我刚刚了解到,以下问题是由“不是最新的”问题引起的。 NLTK自最新的15-12-09 StanfordNLP需要比以前的版本更多的依赖。正如Alvas建议的那样,这个问题的确切解决方案就在这个链接https://github.com/nltk/nltk/issues/1239内。
StackOverflow识别我的问题,类似于这篇文章Stanford Parser and NLTK。我仍然认为这两个问题是不同的,因为最初的问题是关于Standfordnlp的整体正确设置的更多讨论,而我的问题是关注错误本身。毕竟,这并不能解决我的问题。
在我添加这些评论之前,关注是我的帖子。
我已经阅读了Stackoverflow上发布的几乎所有相关主题和可能的解决方案,并在我的计算机上尝试了所有这些。但是,没有取得任何积极成果。每天在java中成熟的学习nlp和新手都会变得令人沮丧,因为这个问题使我无法在一开始就了解nltk。我想再次分享这个问题,再次感谢所有试图提前解决的人。
基本上,我打算解析汉字,但从英语开始。这是我使用的代码(您可能已经看过它,因为我将其复制到其他地方进行测试):
import os
from nltk.parse import stanford
ini_path = 'C:/Users/qubo/jars/stanford-parser/'
os.environ['STANFORD_PARSER'] = ini_path + 'stanford-parser.jar'
os.environ['STANFORD_MODELS'] = ini_path + 'stanford-parser-3.6.0-models.jar'
os.environ['JAVAHOME'] = 'C:/Program Files/Java/jdk1.8.0_73/'
parser = stanford.StanfordParser(ini_path + 'stanford-parser.jar', ini_path + 'stanford-parser-3.6.0-models.jar')
sentences = parser.raw_parse_sents(("Python is fun. We should all date Python in this case."))
print (sentences)
for line in sentences:
for sentence in line:
sentence.draw()
现在我在运行parser.raw_parse_sents
:
java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
at edu.stanford.nlp.parser.common.ParserGrammar.<clinit>(ParserGrammar.java:46)
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)
... 1 more
Exception in thread "main"
Traceback (most recent call last):
File "C:\Users\qubo\Desktop\nltkexample.py", line 33, in <module>
sentences = parser.raw_parse_sents(("Python is fun. We should all date Python in this case."))
File "C:\Users\qubo\Miniconda2\lib\site-packages\nltk\parse\stanford.py", line 146, in raw_parse_sents
return self._parse_trees_output(self._execute(cmd, '\n'.join(sentences), verbose))
File "C:\Users\qubo\Miniconda2\lib\site-packages\nltk\parse\stanford.py", line 212, in _execute
stdout=PIPE, stderr=PIPE)
File "C:\Users\qubo\Miniconda2\lib\site-packages\nltk\internals.py", line 134, in java
raise OSError('Java command failed : ' + str(cmd))
OSError: Java command failed : ['C:/Program Files/Java/jdk1.8.0_73/bin\\java.exe', u'-mx1000m', '-cp', 'C:/Users/qubo/jars/stanford-parser/stanford-parser.jar;C:/Users/qubo/jars/stanford-parser/stanford-parser-3.6.0-models.jar', u'edu.stanford.nlp.parser.lexparser.LexicalizedParser', u'-model', u'edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz', u'-sentences', u'newline', u'-outputFormat', u'penn', u'-encoding', u'utf8', 'c:\\users\\qubo\\appdata\\local\\temp\\tmppz8u6r']
[Finished in 0.7s]
我使用的是Windows 64,Python 2.7.11以及支持nltk和stanford解析器的所有模块都已更新。我也安装了jdk和jre。事实上,我尝试过不同的版本和jdk(旧的或最新的,86或64),没有一个正在运行。
我试图直接在internals.py中设置java路径,或者在standford.py中注释引发错误行,仍然无效。
我试过添加JAVAHOME环境变量,没用。实际上,它与这一行的用途完全相同(有些人可能声称略有不同):
os.environ['JAVAHOME'] = 'C:/Program Files/Java/jdk1.8.0_73/'
有什么想法?再次感谢!!!
答案 0 :(得分:3)
在这个问题上花了太长时间后,我终于找到了这个问题的一个评论中的答案。我认为值得张贴作为一个正确的答案,因为其他人可能会在这里寻找它而不是找到它(我知道我最初错过了它)。
The answer is in this gist,其中还包含有关如何为所有Stanford NLTK接口(即NER tagger,POS tagger和所有Stanford解析器)解决此问题的说明。
基本上,您需要使用以下函数更改Parser对象的classpath属性:
Basket[Banana]
该解决方案的所有功劳归功于alvas,我只是将其重新发布在此处,以便更容易找到。
答案 1 :(得分:0)
您需要从here下载slf4j jar并在路径中添加它。