Nltk: OSError: o comando Java falhou ao usar o exemplo do analisador Stanford

Criado em 25 dez. 2015  ·  18Comentários  ·  Fonte: nltk/nltk

Oi,

Estou tentando executar o exemplo do analisador Stanford. Por exemplo

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.")]

a execução do último comando resulta com um erro:

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

quando reproduzo o mesmo comando na linha de comando, obtenho o erro Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory

Portanto, após adicionar slf4j-api.jar ao caminho de classe _na linha de comando_, a análise foi bem-sucedida.

Como slf4j-api.jar ser adicionado ao classpath nltk, para que a análise seja bem-sucedida?

Obrigado!
Boas festas

Comentários muito úteis

o que é 'st' no comando 'stanford_dir = st._stanford_jar.rpartition (' / ') [0]'

Todos 18 comentários

@yuvval Só para ter certeza de que você está usando a versão do Stanford Parser 2015-12-09? Nesse caso, esse erro ocorre porque o novo StanfordNLP usa mais dependências do que antes. Isso é semelhante a # 1237

Você teria que esperar um pouco antes que o # 1237 fosse corrigido e o NLTK se atualizasse com as ferramentas Standford.

A solução rápida é:

  1. use a versão anterior 2015-04-20 de http://nlp.stanford.edu/software/stanford-parser-full-2015-04-20.zip e a API NLTK funcionaria, consulte http://stackoverflow.com / questions / 13883277 / stanford-parser-and-nltk / 34112695 # 34112695 ou
  2. hackear o classpath do analisador de 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.")]

Obrigado! Funciona com a versão 2015-04-20.

O hack do classpath também funcionou?

Não tentei - apenas excluí a versão mais recente e baixei a versão 2015-04-20.

Oi! Tentei seguir o seu hack, mas para mim não há `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'

Alguma idéia de como resolver isso? Eu realmente gostaria de usar a versão Stanford mais recente.

@methodds Desculpe meu erro de digitação, é from nltk.parse.stanford import StanfordDependencyParser . Consulte https://gist.github.com/alvations/e1df0ba227e542955a8a para obter explicações detalhadas.

Obrigado pelo link. Infelizmente, não consigo fazer as variáveis ​​de ambiente funcionarem no meu sistema operacional Linux.

Meu bashrc tem esta aparência:

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"

Ecoar as variáveis ​​parece certo:

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

No entanto (mesmo após a reinicialização), o NLTK ainda não encontra o tagger:

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.

Faça source .bashrc e funcionará enquanto isso, dê uma olhada em http://apple.stackexchange.com/questions/12993/why-doesnt-bashrc-run-automatically para aprender como o bashrc funciona.

Obrigado pela sua dica, mas eu criei a fonte .bashrc antes e não funcionou. Tentei novamente e, infelizmente, ainda não está funcionando.

Qual é a sua distribuição e versão do Linux? Você pode fazer um lsb_release -a ? Ou você está trabalhando com um Mac?

Obrigado por investigar. ` lsb_release -a retorna

No LSB modules are available.
Distributor ID: LinuxMint
Description:    Linux Mint 17.3 Rosa
Release:    17.3
Codename:   rosa
  • Onde você executou os comandos export ? Qual diretório?
  • Onde você está executando seus scripts python? Qual diretório?

Vá para o local onde deseja executar o script Python, faça o seguinte: import os; print os.environ .

Em seguida, vá para o diretório inicial, inicie o python e faça o mesmo: import os; print os.environ

Você vê que os 2 conjuntos de variáveis ​​de ambiente são diferentes?

Acho que você queria que eu usasse import os; print(os.environ) , o que não revelou as variáveis ​​de ambiente que exportei em .bashrc . Depois disso, copiei e colei o conteúdo em .profile (na minha pasta de início) e agora funciona perfeitamente. Não tenho ideia do porquê, entretanto = D.

Ainda bem que .profile funciona, acho que é um problema de distribuição do sistema operacional. Eu não recomendaria armazenar as variáveis ​​de ambiente como estáticas, pessoalmente, eu as executo novamente sempre que inicio meus scripts Python, para ter certeza de que não há conflito. Divirta-se com as ferramentas NLTK API e Stanford!

Obrigado :)

o que é 'st' no comando 'stanford_dir = st._stanford_jar.rpartition (' / ') [0]'

Eu tenho a mesma pergunta que hansen7

para poucos que têm procurado o que é st,
st = StanfordNERTagger(os.environ.get('STANFORD_MODELS'))
Ref: https://gist.github.com/manashmndl/810db10809cbc1209b34c7d25efe95d5#file -stanfordnertagger-py

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

Chris00 picture Chris00  ·  3Comentários

talbaumel picture talbaumel  ·  4Comentários

alvations picture alvations  ·  4Comentários

BLKSerene picture BLKSerene  ·  4Comentários

goodmami picture goodmami  ·  4Comentários