Привет,
Я пытаюсь запустить пример стэнфордского парсера. Например
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, чтобы синтаксический анализ был успешным?
Спасибо!
Счастливых праздников
@yuvval Просто чтобы убедиться, что вы используете Stanford Parser версии 2015-12-09? Если да, то эта ошибка возникает из-за того, что новый StanfordNLP использует больше зависимостей, чем раньше. Это похоже на # 1237
Вам придется подождать некоторое время, прежде чем # 1237 будет исправлен, и NLTK догонит инструменты Standford.
Решение быстрого исправления:
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, сделайте следующее: 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
Самый полезный комментарий
что такое 'st' в команде 'stanford_dir = st._stanford_jar.rpartition (' / ') [0]'