NLTK не может найти исполняемый файл Java - PullRequest
20 голосов
/ 13 сентября 2011

Я использую nltk.tag.stanford от NLTK, который должен вызывать исполняемый файл Java.

Я установил JAVAHOME в C: \ Program Files \ Java \ jdk1.6.0_25, где установлен мой jdk, но при запуске программы выдается ошибка

"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 "/". 

Однако нлтк все еще не может его найти.

Кто-нибудь имеет представление о том, что происходит не так? Спасибо, looot!

Ответы [ 14 ]

53 голосов
/ 06 марта 2014

Если настройка среды JAVA_HOME вам не помогает, попробуйте следующее:

config_java() у меня не сработало.Я добавил следующие строки в мой код, и он заработал:

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

Я использую 64-битную Windows 7

6 голосов
/ 23 июня 2013

Я потратил около семи часов на решение этой проблемы и, наконец, нашел решение.Вы можете записать свой каталог java прямо в строки 69 и 72 файла internals.py (сборка 2.0.4) следующим образом:

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

5 голосов
/ 01 июня 2012
Совет

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.

2 голосов
/ 16 ноября 2011

В зависимости от вашей среды вы можете попробовать переустановить двоичный файл nltk.Я установил из двоичного файла, а затем обновил через easy_install, и он неправильно установил версию nltk для OSX, что вызвало исключения, когда ntlk не смог найти мой двоичный файл Java.

2 голосов
/ 13 сентября 2011

Я посмотрел здесь , и документы, похоже, предполагают, что аргумент должен выглядеть как

config_java("C:/Program Files/Java/jdk1.6.0_25/bin/java")
1 голос
/ 22 апреля 2015

Я перепробовал все вышеупомянутые решения, а также те, которые Группы 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-bit

1 голос
/ 11 июля 2013

Надеюсь, это сэкономит кому-то еще время при попытке решить эту проблему. Я довольно новичок в программировании, Python и NLTK, и не понял, когда пытался реализовать решение @ dduhaime, что есть два файла internals.py: один в папке nltk (путь = C: \ nltk -2.0.4 на моем компьютере) и один в моей папке Python27 (путь = C: \ Python27 \ Lib \ site-packages \ nltk-2.0.4-py2.7.egg \ nltk на моем компьютере). Вы должны добавить путь к каталогу java в строках 69 и 72 в последнем файле internals.py, иначе NLTK все равно не сможет его найти.

Мое окружение: 64-разрядная версия Windows 7, сборка NLTK 2.0.4

1 голос
/ 11 июня 2013

Я понимаю, что это старый вопрос, но вот решение, которое работало для меня (работает на 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 голос
/ 22 января 2013

Еще один внятный ответ для этой ситуации - вы используете IDE, например Eclipse.Даже если вы задали переменную окружения JAVA_HOME и даже если вы явно вызвали config_java и получили сообщение [Found ... /bin/java.exe], вам все равно может потребоваться установить среду выполнения для вашей IDE.Причина в том, что когда вы вызываете теггер, config_java вызывается снова как часть процесса, и ваши первоначальные попытки настройки пути могут перезаписать путь к двоичному исполняемому файлу Java.

1 голос
/ 22 января 2013

Еще одна возможность, когда вы сталкиваетесь с этим сообщением об ошибке при использовании пакета stanford в NLTK, это если вы используете StanfordTagger вместо PosTagger или NERTagger. Согласно Группам Google , существовал способ поощрить пользователей отойти от общего класса StanfordTagger и перейти к одному из двух специальных тегов.

...