编程语言
首页 > 编程语言> > 运行NLTK StanfordParser时Java命令失败

运行NLTK StanfordParser时Java命令失败

作者:互联网

已编辑

感谢Alvas的回答.我刚刚了解到以下问题是由“最新” NLTK引起的,因为最新的StanfordNLP 15-12-09比以前的版本需要更多的依赖项.如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/'

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

解决方法:

在这个问题上花费了太长时间之后,我终于找到了答案,该答案掩盖在该问题的评论之一中.我认为值得将其发布为一个正确的答案,因为其他人可能会在这里寻找它而找不到它(我知道我一开始错过了它).

The answer is in this gist,其中还包含有关如何为所有Stanford NLTK接口(即NER标记器,POS标记器和所有Stanford解析器)解决此问题的说明.

基本上,您需要使用以下函数来更改Parser对象的classpath属性:

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,我只是将其重新发布在这里,以便于查找.

标签:stanford-nlp,python-2-7,error-handling,nltk,java
来源: https://codeday.me/bug/20191119/2032647.html