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" )
После этого все сработало.