[英]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
而不是PosTagger
或NERTagger
。 根据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.