NLTK无法找到Java可执行文件

时间:2011-09-13 15:46:27

标签: java python tags config nltk

我正在使用NLTK的nltk.tag.stanford,它需要调用java可执行文件。

我将JAVAHOME设置为安装了jdk的C:\ Program Files \ Java \ jdk1.6.0_25,但是在运行程序时出现错误

"NLTK was unable to find the java executable! Use the config_java() or set the JAVAHOME variable"

然后我花了3个小时来调试它并尝试

config_java("C:/Program Files/Java/jdk1.6.0_25/")

config_java("C:/Program Files/Java/jdk1.6.0_25/bin/")
and those without the ending "/". 

但是nltk仍然无法找到它。

任何人都知道出了什么问题?谢谢你的支持!

14 个答案:

答案 0 :(得分:54)

如果设置JAVA_HOME环境对您没有帮助,请尝试以下操作:

config_java()对我不起作用。我将以下几行添加到我的代码中并且有效:

import os
java_path = "C:/Program Files/Java/jdk1.7.0_11/bin/java.exe"
os.environ['JAVAHOME'] = java_path

我正在运行Windows 7 64位

答案 1 :(得分:6)

我花了大约七个小时来解决这个问题,最后找到了解决方案。您可以将java目录直接写入internals.py文件(build 2.0.4)的第69和72行,如下所示:

##########################################################################
# Java Via Command-Line
##########################################################################

_java_bin = 'C:\Program Files\Java\jdk1.7.0_25\\bin\java.exe'
_java_options = []
# [xx] add classpath option to config_java?
def config_java(bin='C:\Program Files\Java\jdk1.7.0_25\\bin\java.exe', options=None, verbose=True):

这解决了我的问题。 (我在32位Windows环境下工作)

答案 2 :(得分:5)

protos1210的提示对我有用,只做了一些小改动。完整的答案是:

import nltk
nltk.internals.config_java("C:/Program Files/Java/jdk1.6.0_30/bin/java.exe")

重新启动IDLE后,以下代码有效。

import nltk
path_to_model = "C:/Program Files/stanford-postagger-2012-05-22/models/english-bidirectional-distsim.tagger"
path_to_jar = "C:/Program Files/stanford-postagger-2012-05-22/stanford-postagger.jar"
tagger = nltk.tag.stanford.POSTagger(path_to_model, path_to_jar)
tokens = nltk.tokenize.word_tokenize("I hope this works!")
print tagger.tag(tokens)

输出是:[('我','PRP'),('希望','VBP'),('这','DT'),('工作','VBZ'),('! ','。')]。

我永远无法识别我的JAVAHOME环境变量。

答案 3 :(得分:2)

我查看here,文档似乎暗示该论点应该看起来像

config_java("C:/Program Files/Java/jdk1.6.0_25/bin/java")

答案 4 :(得分:2)

根据您的环境,您可能需要尝试重新安装nltk二进制文件。我从二进制安装,然后通过easy_install升级,它错误地安装了nltk的osx版本,当ntlk找不到我的java二进制文件时导致异常。

答案 5 :(得分:1)

我也遇到过这个问题。一直很头疼!

我让这个在我的机器上工作(Win7_x64)

将'jdk1.6.0_30'替换为您的jdk版本。运行此命令:

config_java("C:/Program Files/Java/jdk1.6.0_30/bin/java.exe")
[Found C:/Program Files/Java/jdk1.6.0_30/bin/java.exe: C:/Program Files/Java/jdk1.6.0_30/bin/java.exe]

我不知道为什么这么难以开始工作。希望这有帮助!

答案 6 :(得分:1)

在NLTK中使用stanford软件包时遇到此错误消息的另一种可能性是,如果您使用StanfordTagger而不是PosTaggerNERTagger。根据{{​​3}},有一种设计可以鼓励用户远离普通StanfordTagger课程,并转向两个特定标记之一。

答案 7 :(得分:1)

这种情况的另一个明显答案是您正在使用Eclipse等IDE。即使您已设置JAVA_HOME环境变量,即使您显式调用config_java并且返回了[Found ... /bin/java.exe]消息,您仍可能必须为IDE设置运行时环境。原因是当您调用标记器时,作为进程的一部分再次调用config_java,因此可以覆盖原始尝试设置java二进制可执行文件的路径。

答案 8 :(得分:1)

我意识到这是一个老问题,但这里是适合我的解决方案(在Windows 7-64位上运行)。希望它可以节省一些时间。

我实施了here给出的解决方案:

 "I have been able to get it working by commenting out two lines in the batch_tag function in     
 \nltk\tag\stanford.py

  The lines are line 59 and 85.

 config_java(options=self.java_options, verbose=False)
 and 
 config_java(options=default_options, verbose=False)
 respectively."

在注释掉这些行后,我按照其他答案中提到的相同方式设置了Java可执行文件的路径:

 nltk.internals.config_java("path/to/javadk/bin/java.exe")

一种可行的解决方案。之后一切都很好。

答案 9 :(得分:1)

希望在尝试解决此问题时,可以节省其他人一些时间。我是编程,Python和NLTK的新手,并没有意识到当我试图实现@dduhaime的解决方案时,有两个'internals.py'文件:一个在nltk文件夹中(path = C:\ nltk在我的计算机上的-2.0.4和我的Python27文件夹中的一个(我的计算机上的路径= C:\ Python27 \ Lib \ site-packages \ nltk-2.0.4-py2.7.egg \ nltk)。您必须在第69行和第69行添加java目录的路径。后面的'internals.py'文件中的72,或者NLTK仍然无法找到它。

我的环境:Windows 7 64位,NLTK build 2.0.4

答案 10 :(得分:1)

我已尝试过上面提到的所有解决方案以及Google Groups上的解决方案,但都没有效果。因此,在对上述答案进行了几轮试验和修改后,以下代码对我有用: -

>>>  import os

>>>  os.environ['JAVAHOME'] = "C:/Program Files/Java/jdk1.8.0_31/bin" #insert approriate version of jdk

然后我尝试了NERTagger代码: -

>>> from nltk.tag.stanford import NERTagger

>>> st = NERTagger('stanford-ner-2014-06-16/classifiers/english.all.3class.distsim.crf.ser.gz','stanford-ner-2014-06-16/stanford-ner.jar')

>>> st.tag('John has refused the offer from Facebook. He will work for Google'.split())

以下是我收到的输出

'John', u'PERSON'), (u'has', u'O'), (u'refused', u'O'), (u'the', u'O'), (u'offer', u'O'), (u'from', u'O'), (u'Facebook', u'ORGANIZATION'), (u'.', u'O')]

在Windows 7 64位上进行测试

答案 11 :(得分:0)

我为此实现了一种解决方法,因为NLTK误解了JAVA_HOME变量的含义:

import os
if os.environ.get("JAVA_HOME") is not None and "/bin" not in os.environ["JAVA_HOME"]:
    os.environ["JAVAHOME"] = os.path.normpath(os.path.join(os.environ["JAVA_HOME"], "bin"))

这基本上采用了JAVA_HOME中的正确值,并创建了NLTK友好版本并将其存储在JAVAHOME中。 NLTK将检查两者,这样就可以找到二进制文件。您需要在创建标记器之前执行此操作。显然。

答案 12 :(得分:0)

我遇到了同样的问题,这对我来说非常简单。当您设置JavaHome变量时,在您的机器中设置jdk文件夹的路径,如下所示:

C:\ Program Files \ Java \ jdk \ - 这确实有效

C:\ Program Files \ Java \ jdk - 这不起作用

答案 13 :(得分:-1)

这个答案适用于ubuntu 14.04。

\ nltk \ tag \ stanford.py

中的batch_tag函数中注释掉两行

这些行是59行和85行。

config_java(options = self.java_options,verbose = False) config_java(options = default_options,verbose = False)

在注释掉行后,我以与其他答案中提到的相同方式设置Java可执行文件的路径: 的 nltk.internals.config_java("路径/到/ javadk / bin中/ JAVA&#34)

之后一切正常。