繁体   English   中英

NLTK无法找到Java可执行文件

[英]NLTK fails to find the Java executable

我正在使用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仍然无法找到它。

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

如果设置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位

我花了大约七个小时来解决这个问题,最后找到了解决方案。 您可以将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环境下工作)

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环境变量。

我看了这里 ,文档似乎表明这个论点应该是这样的

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

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

在NLTK中使用stanford包时遇到此错误消息的另一种可能性是使用StanfordTagger而不是PosTaggerNERTagger 根据Google网上论坛的说法,有一种设计可以鼓励用户远离一般的StanfordTagger课程,并转向两个特定的标记之一。

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

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

我实现了这里给出的解决方案:

 "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")

一个kludgey但可行的解决方案。 之后一切都很好。

希望这可以在尝试解决此问题时节省其他人一些时间。 我是编程,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)。 您必须在后面的'internals.py'文件中的第69和72行添加java目录的路径,否则NLTK仍然无法找到它。

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

我已经尝试了所有上述解决方案以及Google网上论坛上的解决方案,但都没有效果。 因此,经过对上述答案的几轮试验和修改后,以下代码对我有用: -

>>>  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位上测试过

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

我让这个在我的机器上工作(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]

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

我实现了一个解决方法,因为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将检查两者,这样就可以找到二进制文件。 显然,您需要在创建标记器之前执行此操作。

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

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

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

这个答案适用于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(“path / to / javadk / bin / java”)

之后一切都很好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM