运行NLTK StanfordParser

时间:2016-02-25 10:12:05

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

EDITED

感谢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/'

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

2 个答案:

答案 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并在路径中添加它。