Nltk: OSError: сбой команды Java при использовании примера синтаксического анализатора Стэнфорда

Созданный на 25 дек. 2015  ·  18Комментарии  ·  Источник: nltk/nltk

Привет,

Я пытаюсь запустить пример стэнфордского парсера. Например

from nltk.parse.stanford import * 
dep_parser=StanfordDependencyParser(model_path="edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz")
[parse.tree() for parse in dep_parser.raw_parse("The quick brown fox jumps over the lazy dog.")]

выполнение последней команды приводит к ошибке:

OSError: Java command failed : [u'/usr/bin/java', u'-mx1000m', '-cp', ....

когда я воспроизводю ту же команду в командной строке, я получаю сообщение об ошибке Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory

Следовательно, после добавления slf4j-api.jar в путь к классам _в командной строке_ синтаксический анализ будет успешным.

Как можно добавить slf4j-api.jar в путь к классам nltk, чтобы синтаксический анализ был успешным?

Спасибо!
Счастливых праздников

Самый полезный комментарий

что такое 'st' в команде 'stanford_dir = st._stanford_jar.rpartition (' / ') [0]'

Все 18 Комментарий

@yuvval Просто чтобы убедиться, что вы используете Stanford Parser версии 2015-12-09? Если да, то эта ошибка возникает из-за того, что новый StanfordNLP использует больше зависимостей, чем раньше. Это похоже на # 1237

Вам придется подождать некоторое время, прежде чем # 1237 будет исправлен, и NLTK догонит инструменты Standford.

Решение быстрого исправления:

  1. используйте предыдущую версию 2015-04-20 из http://nlp.stanford.edu/software/stanford-parser-full-2015-04-20.zip, и API NLTK будет работать, см. http://stackoverflow.com / questions / 13883277 / stanford-parser-and-nltk / 34112695 # 34112695 или
  2. взломать путь к классам парсера stanford:
from nltk.internals import find_jars_within_path
from nltk.parse.stanford import StanfordDependencyParser
dep_parser=StanfordDependencyParser(model_path="edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz")
stanford_dir = st._stanford_jar.rpartition('/')[0]
# or in windows comment the line above and uncomment the one below:
#stanford_dir = st._stanford_jar.rpartition("\\")[0]
stanford_jars = find_jars_within_path(stanford_dir)
st.stanford_jar = ':'.join(stanford_jars)
[parse.tree() for parse in dep_parser.raw_parse("The quick brown fox jumps over the lazy dog.")]

Спасибо! Работает с версией 2015-04-20.

Сработал ли взлом пути к классам?

Не пробовал - просто удалил последнюю версию и скачал версию 2015-04-20.

Привет! Я пытался следить за вашим взломом, но для меня нет StanfordDependencyParser:

print(nltk.__version__)
from nltk.tag import StanfordDependencyParser

3.1
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-7-67bb74c3494a> in <module>()
----> 1 from nltk.tag import StanfordDependencyParser

ImportError: cannot import name 'StanfordDependencyParser'

Есть идеи, как это решить? Я бы очень хотел использовать последнюю версию stanford.

@methodds Простите за опечатку, это from nltk.parse.stanford import StanfordDependencyParser . Подробные объяснения см. На странице https://gist.github.com/alvations/e1df0ba227e542955a8a .

Спасибо за ссылку. К сожалению, я не могу заставить переменные среды работать в моей Linux Mint OS.

Мой bashrc выглядит так:

export JAVA_HOME="/usr/lib/jvm/java-8-oracle/"
export PATH=$JAVA_HOME/bin:$PATH

export CLASSPATH="/home/cs/stanford_nlp/stanford-postagger-full-2015-04-20/stanford-postagger.jar:$CLASSPATH"

export CLASSPATH="/home/cs/stanford_nlp/stanford-ner-2015-04-20/stanford-ner.jar:$CLASSPATH"

export STANFORD_MODELS="/home/cs/stanford_nlp/stanford-ner-2015-04-20/classifiers:$STANFORD_MODELS"

export STANFORD_MODELS="/home/cs/stanford_nlp/stanford-postagger-full-2015-04-20/models:$STANFORD_MODELS"

Повторение переменных выглядит правильно:

echo $CLASSPATH
/home/cs/stanford_nlp/stanford-ner-2015-04-20/stanford-ner.jar:/home/cs/stanford_nlp/stanford-postagger-full-2015-04-20/stanford-postagger.jar

echo $STANFORD_MODELS
/home/cs/stanford_nlp/stanford-postagger-full-2015-04-20/models:/home/cs/stanford_nlp/stanford-ner-2015-04-20/classifiers

Однако (даже после перезагрузки) NLTK все еще не находит теггер:

from nltk.tag.stanford import StanfordPOSTagger
st = StanfordPOSTagger('english-bidirectional-distsim.tagger')
st.tag('What is the airspeed of an unladen swallow ?'.split())

NLTK was unable to find stanford-postagger.jar! Set the CLASSPATH
environment variable.

Сделайте source .bashrc и он будет работать, а пока посмотрите http://apple.stackexchange.com/questions/12993/why-doesnt-bashrc-run-automatically, чтобы узнать, как работает bashrc.

Спасибо за совет, но я заранее сделал исходный код .bashrc, и он не сработал. Я попробовал еще раз, но, к сожалению, все еще не работает.

Какой у вас дистрибутив и версия Linux? Сможете ли вы сделать lsb_release -a ? Или вы работаете с Mac?

Спасибо за расследование. ` lsb_release -a возвращает

No LSB modules are available.
Distributor ID: LinuxMint
Description:    Linux Mint 17.3 Rosa
Release:    17.3
Codename:   rosa
  • Где вы выполняли команды export ? Какой каталог?
  • Где вы запускаете свои скрипты на Python? Какой каталог?

Перейдите в то место, где вы хотите запустить свой скрипт python, сделайте следующее: import os; print os.environ .

Затем перейдите в свой домашний каталог, запустите python и сделайте то же самое: import os; print os.environ

Вы видите, что два набора переменных среды различаются?

Думаю, вы хотели, чтобы я использовал import os; print(os.environ) , который не раскрывает переменные среды, которые я экспортировал в .bashrc . После этого я копирую вставленный контент в .profile (в моей домашней папке), и теперь он отлично работает. Я понятия не имею, почему же = D.

Рад, что .profile работает, я думаю, что это проблема с дистрибутивом ОС. Я бы не рекомендовал хранить переменные среды как статические, лично я перезапускаю их каждый раз, когда запускаю свои скрипты python, чтобы быть уверенным в отсутствии конфликта. Получайте удовольствие от NLTK API и инструментов Стэнфорда!

Спасибо :)

что такое 'st' в команде 'stanford_dir = st._stanford_jar.rpartition (' / ') [0]'

У меня тот же вопрос, что и у hansen7

для немногих, кто искал то, что есть,
st = StanfordNERTagger(os.environ.get('STANFORD_MODELS'))
Ссылка: https://gist.github.com/manashmndl/810db10809cbc1209b34c7d25efe95d5#file -stanfordnertagger-py

Была ли эта страница полезной?
0 / 5 - 0 рейтинги