【问题标题】:Java command failed when running NLTK StanfordParser运行 NLTK StanfordParser 时 Java 命令失败
【发布时间】:2016-02-25 10:12:04
【问题描述】:

已编辑

感谢阿尔瓦斯的回答。我刚刚了解到以下问题是由“不那么最新”的 NLTK 引起的,因为最新的 15-12-09 StanfordNLP 比以前的版本需要更多的依赖项。正如 Alvas 建议的那样,此问题的确切解决方案在此链接 https://github.com/nltk/nltk/issues/1239 中。

StackOverflow 发现我的问题类似于这篇文章Stanford Parser and NLTK。我仍然认为这两个问题是不同的,因为最初的问题更多地讨论了 Standfordnlp 的整体正确设置,而我的问题集中在错误本身。毕竟,这并不能解决我的问题。

Follows 是我添加这些 cmets 之前的帖子。

我已经阅读了 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/'

有什么想法吗?再次感谢!!!

【问题讨论】:

  • Stanford Parser and NLTK的可能重复
  • 是的,那里有很多讨论。我已经尝试了所有解决方案,但仍然没有任何效果......我想我可能会尝试重新打开这个问题。
  • 不要复制答案,了解解决方案。
  • 我很确定您还没有尝试过find_jars_within_path 的解决方案。
  • 不确定您指的是哪个答案...您能否提供答案的直接链接?谢谢!

标签: java python-2.7 error-handling nltk stanford-nlp


【解决方案1】:

在这个问题上花了太长时间,我终于在这个问题的一个 cmets 中找到了答案。我认为值得将其作为正确答案发布,因为其他人可能会在这里寻找它但找不到它(我知道我一开始错过了它)。

The answer is in this gist,其中还包含有关如何为所有斯坦福 NLTK 接口(即 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))

解决方案的所有功劳归于 alvas,我只是在此处重新发布,以便更容易找到。

【讨论】:

    【解决方案2】:

    您需要从here 下载 slf4j jar 并将其添加到路径中。

    【讨论】:

    • 您能详细说明一下吗?我已经下载了 slf4j-1.7.17.zip。您介意就如何正确设置它提供一些指导吗?谢谢!
    • 使用 CLASSPATH 变量并将其指向 slf4j jar 路径。或者,您也可以关注this guide 使用带有 nltk 的 stanford jars。
    猜你喜欢
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 2015-04-02
    • 2020-04-24
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多