web-dev-qa-db-ja.com

NLTKはJava実行可能ファイルを見つけることができません

Java実行可能ファイルを呼び出す必要があるNLTKのnltk.tag.stanfordを使用しています。

JdkがインストールされているC:\ Program Files\Java\jdk1.6.0_25にJAVAHOMEを設定しましたが、プログラムを実行するとエラーが発生します

"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はまだそれを見つけることができません。

誰が何が悪いのか考えていますか?戦利品をありがとう!

22
Thomas Chu

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 764ビットを実行しています

54
Alan

私はこの問題に約7時間費やし、ついに解決策を見つけました。次のように、Javaディレクトリをinternals.pyファイル(ビルド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環境で作業しています)

8
duhaime

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)

出力は次のとおりです:[( 'I'、 'PRP')、( 'hope'、 'VBP')、( 'this'、 'DT')、( 'works'、 'VBZ')、( '!'、 ' 。 ')]。

JAVAHOME環境変数を認識させることができませんでした。

6

私は ここ を見ました、そしてドキュメントは議論が次のように見えるべきであることを示唆しているようです

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

環境によっては、nltkバイナリを再インストールしてみてください。バイナリからインストールした後、easy_installでアップグレードしたところ、osxバージョンのnltkが正しくインストールされなかったため、ntlkが私のJavaバイナリを見つけられなかったときに例外が発生しました。

2
Tyler

うまくいけば、これにより、この問題を修正しようとするときに他の誰かの時間を節約できます。私はプログラミングにかなり慣れていません、PythonとNLTK、そして@dduhaimeのソリューションを実装しようとしたときに、2つの「internals.py」ファイルがあることに気づきませんでした。 nltkフォルダー(コンピューター上のpath = C:\ nltk-2.0.4)とPython27フォルダー内の1つ(path = C:\ Python27\Lib\site-packages\nltk-2.0.4-py2.7.Egg\nltk後者の「internals.py」ファイルの69行目と72行目のJavaディレクトリにパスを追加する必要があります。そうしないと、NLTKはそれを見つけることができません。 。

私の環境:Windows 7 64ビット、NLTKビルド2.0.4

1
mariera

上記のすべての解決策と 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 764ビットでテスト済み

1
K R Anushree

私もこれで問題にぶつかっています。とても頭痛の種でした!

私はこれを私のマシン(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]

なぜこんなに仕事が難しいのかわかりません。お役に立てれば!

1
protoss1210

NLTKでスタンフォードパッケージを使用しているときにこのエラーメッセージが表示される別の可能性は、StanfordTaggerまたはPosTaggerの代わりにNERTaggerを使用する場合です。 Google Groups によると、ユーザーが一般的なStanfordTaggerクラスから離れて、2つの特定のタガーの1つに向かうように促す設計がありました。

1
demongolem

この状況に対するもう1つの明確な答えは、EclipseなどのIDEを使用していることです。Java_HOME環境変数を設定した場合でも、明示的にconfig_Javaを呼び出した場合でも[Found ... /bin/Java.exe]メッセージが返されても、IDEのランタイム環境を設定する必要がある場合があります。その理由は、タガーを呼び出すと、プロセスの一部としてconfig_Javaが再度呼び出されてしたがって、Javaバイナリ実行可能ファイルへのパスを設定しようとした元の試みは、上書きされる可能性があります。

1
demongolem

これは古い質問だと思いますが、これが私のために働いた解決策です(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")

厄介ですが実行可能なソリューション。その後、すべてが正常に機能しました。

1
Renklauf

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は両方をチェックするので、これはバイナリを見つけます。明らかに、タガーを作成する前にこれを行う必要があります。

0
Kylotan

私は同じ問題に遭遇しました、そしてこれは本当に簡単な私のために働いたものです。 JavaHome変数を設定するときは、次のようにマシンのjdkフォルダーへのパスを設定します。

C:\ Program Files\Java\jdk \-これは機能しました

C:\ Program Files\Java\jdk-これは機能しませんでした

0
Thili