编辑
多亏了阿尔瓦斯的回答。我刚刚了解到,由于最近的15-12-09 StanfordNLP比以前的版本需要更多的依赖关系,所以以下问题是由“不最新”的NLTK引起的。正如Alvas所建议的,这个问题的确切解决方案就在这个链接https://github.com/nltk/nltk/issues/1239中。
StackOverflow发现我的问题类似于这个帖子斯坦福Parser和NLTK。我仍然认为这两个问题是不同的,因为最初的问题更多地讨论了Standfordnlp的总体正确设置,而我的问题则集中在错误本身上。毕竟,这并不能解决我的问题。
以下是我在添加这些评论之前的帖子。
我已经阅读了几乎所有相关的主题和可能的解决方案,张贴在Stackoverflow上,并在我的计算机上进行了所有的尝试。然而,没有取得任何积极成果。对于一个在java学习nlp和菜鸟的A成熟人来说,每天都很沮丧,因为这个问题使我无法在一开始就了解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、Python2.7.11和所有支持nltk和斯坦福解析器的模块。我也安装了jdk和jre。事实上,我尝试过不同的版本和jdk (旧的或最新的,86或64),都没有工作。
我尝试在internals.py中直接设置java路径,或者在standford.py中注释引发错误行,但仍然无法工作。
我尝试添加JAVAHOME环境变量,没有用。事实上,它的目的与这一行完全相同(有些人可能会声称略有不同):
os.environ['JAVAHOME'] = 'C:/Program Files/Java/jdk1.8.0_73/'有什么想法吗?再次感谢!
发布于 2016-06-29 14:38:51
在这个问题上花了很长时间之后,我终于找到了这个问题的答案。我认为这是值得张贴作为一个正确的答案,因为其他人可能会在这里寻找,但找不到它(我知道我错过了它在一开始)。
答案就在这个要点里,它还包含关于如何解决所有Stanford接口(即NER、POS标记器和所有斯坦福解析器)的这个问题的说明。
基本上,您需要用以下函数更改Parser对象的类路径属性:
from nltk.internals import find_jars_within_path
from nltk.parse.stanford import StanfordParser
parser = StanfordParser(model_path="path/to/englishPCFG.ser.gz")
parser._classpath = tuple(find_jars_within_path(stanford_dir))解决方案的所有功劳都归于阿尔瓦斯,我只是在这里重新发布,这样就更容易找到了。
发布于 2016-02-25 10:15:34
您需要从slf4j下载这里 jar并将其添加到路径中。
https://stackoverflow.com/questions/35624245
复制相似问题