NLTK не может найти исполняемый файл Java

Я использую NLTK nltk.tag.stanford, которому нужно вызвать исполняемый файл 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 "/". 

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

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

Ответы

Ответ 1

Если настройка среды 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

Ответ 2

Я провел около семи часов, работая над этой проблемой, и, наконец, нашел решение. Вы можете написать свой каталог 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)

Ответ 3

protos1210 tip работал у меня с небольшими изменениями. Полный ответ:

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.

Ответ 4

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

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

Ответ 5

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

Ответ 6

У меня тоже проблемы с этим. Это была такая головная боль!

Я получил это для работы на моей машине (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]

Я не знаю, почему так трудно работать. Надеюсь, это поможет!

Ответ 7

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

Ответ 8

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

Ответ 9

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

A kludgey, но работоспособное решение. После этого все сработало.

Ответ 10

Надеюсь, это поможет кому-то еще некоторое время, пытаясь исправить эту проблему. Я новичок в программировании, 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 все равно не сможет его найти.

Моя среда: Windows 7 64 бит, NLTK build 2.0.4

Ответ 11

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

Протестировано на 64-разрядной версии Windows 7

Ответ 12

Я применил обходное решение для этого, потому что 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 проверит оба варианта, чтобы найти двоичный файл. Вы должны сделать это до создания тегатора, очевидно.

Ответ 13

Я столкнулся с той же проблемой, и это то, что сработало для меня, что очень просто. Когда вы настраиваете переменную JavaHome, установите путь к папке jdk на вашем компьютере, как показано ниже:

C:\Program Files\Java\ jdk\ - это действительно работало

C:\Program Files\Java\jdk - Это не сработало

Ответ 14

Этот ответ для ubuntu 14.04.

комментирует две строки в функции batch_tag в \nltk\tag\stanford.py

Линии - это строки 59 и 85.

config_java (options = self.java_options, verbose = False) и config_java (options = default_options, verbose = False) соответственно.

После комментирования строк я устанавливаю путь к исполняемому файлу Java так же, как упоминается в других ответах: nltk.internals.config_java ( "путь/к/javadk/бен/Java" )

После этого все сработало.