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
@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 é:
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
export
? 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
Comentários muito úteis
o que é 'st' no comando 'stanford_dir = st._stanford_jar.rpartition (' / ') [0]'