Nltk: corenlp.py CoreNLPServer lança exceção TypeError

Criado em 22 jun. 2017  ·  21Comentários  ·  Fonte: nltk/nltk

Olá,

Aqui está o código:

>>> s = nltk.parse.corenlp.CoreNLPServer(path_to_jar='/usr/local/share/stanford/stanford-corenlp-3.8.0.jar', path_to_models_jar='/usr/local/share/stanford/stanford-english-corenlp-2017-06-09-models.jar')
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    s = nltk.parse.corenlp.CoreNLPServer(path_to_jar='/usr/local/share/stanford/stanford-corenlp-3.8.0.jar', path_to_models_jar='/usr/local/share/stanford/stanford-english-corenlp-2017-06-09-models.jar')
  File "/Users/adiep/feedback-sentiment/.env/src/nltk/nltk/parse/corenlp.py", line 69, in __init__
    key=lambda model_name: re.match(self._JAR, model_name)
TypeError: '>' not supported between instances of 'NoneType' and 'NoneType'

A função max está lançando esta exceção.

Acho que o que está acontecendo é que key=lambda model_name: re.match(self._JAR, model_name) está retornando NoneType porque não corresponde a nada. Portanto, ele preenche a lista de NoneType e max não consegue classificá-lo. Descobri que self._JAR e model_name avaliados como o seguinte:

>>> type(re.match(r'stanford-corenlp-(\d+)\.(\d+)\.(\d+)\.jar', '/usr/local/share/stanford/stanford-corenlp-3.8.0.jar'))
<class 'NoneType'>

Obrigado,

pleaseverify resolved stanford api

Comentários muito úteis

Meu Deus, agora está funcionando.

Portanto, no geral, tive que mudar re.match para re.search.group e matar um corenlpserver flutuante em segundo plano.

Talvez deva haver algum código para detectar se há outros corenlpservers em execução? Não sei se vale a pena fazer.

Todos 21 comentários

A função max deve ser nomes de arquivos de feed e não caminhos completos?

Tentei passar a pasta ao CoreNLPServer e nltk não conseguiu encontrá-la por algum motivo.

Oi,

eu acho que sim, o que são jars ?

Os jars estão localizados em `/ usr / local / share / stanford '

Aqui está o ls do diretório relevante:

(.env) ➜  stanford l
total 2794816
-rwxr-xr-x   1 adiep  admin   5.3K Jun 21 17:20 CoreNLP-to-HTML.xsl*
-rw-r--r--   1 adiep  admin   1.6K Jun 21 17:20 LIBRARY-LICENSES
-rw-r--r--   1 adiep  admin    34K Jun 21 17:20 LICENSE.txt
-rw-r--r--   1 adiep  admin   769B Jun 21 17:20 Makefile
-rw-r--r--   1 adiep  admin   3.6K Jun 21 17:20 README.txt
-rw-r--r--   1 adiep  admin   2.3K Jun 21 17:20 SemgrexDemo.java
-rw-r--r--   1 adiep  admin   1.8K Jun 21 17:20 ShiftReduceDemo.java
-rw-r--r--   1 adiep  admin   5.7K Jun 21 17:20 StanfordCoreNlpDemo.java
-rw-r--r--   1 adiep  admin   195K Jun 21 17:20 StanfordDependenciesManual.pdf
-rw-r--r--   1 adiep  admin   3.9K Jun 21 17:20 build.xml
-rwxr-xr-x   1 adiep  admin   871B Jun 21 17:20 corenlp.sh*
-rw-r--r--   1 adiep  admin   1.2M Jun 21 17:20 ejml-0.23-src.zip
-rw-r--r--   1 adiep  admin   207K Jun 21 17:20 ejml-0.23.jar
-rw-r--r--   1 adiep  admin    89B Jun 21 17:20 input.txt
-rw-r--r--   1 adiep  admin    19K Jun 21 17:20 input.txt.xml
-rw-r--r--   1 adiep  admin    54K Jun 21 17:20 javax.json-api-1.0-sources.jar
-rw-r--r--   1 adiep  admin    83K Jun 21 17:20 javax.json.jar
-rw-r--r--   1 adiep  admin   756K Jun 21 17:20 joda-time-2.9-sources.jar
-rw-r--r--   1 adiep  admin   615K Jun 21 17:20 joda-time.jar
-rw-r--r--   1 adiep  admin   192K Jun 21 17:20 jollyday-0.4.9-sources.jar
-rw-r--r--   1 adiep  admin   209K Jun 21 17:20 jollyday.jar
drwxr-xr-x  10 adiep  admin   340B Jun 21 17:20 patterns/
-rw-r--r--   1 adiep  admin   5.3K Jun 21 17:20 pom.xml
-rw-r--r--   1 adiep  admin   1.3M Jun 21 17:20 protobuf.jar
-rw-r--r--   1 adiep  admin    31K Jun 21 17:20 slf4j-api.jar
-rw-r--r--   1 adiep  admin    10K Jun 21 17:20 slf4j-simple.jar
-rw-r--r--   1 adiep  admin   9.6M Jun 21 17:20 stanford-corenlp-3.8.0-javadoc.jar
-rw-r--r--   1 adiep  admin   346M Jun 21 17:20 stanford-corenlp-3.8.0-models.jar
-rw-r--r--   1 adiep  admin   5.0M Jun 21 17:20 stanford-corenlp-3.8.0-sources.jar
-rw-r--r--   1 adiep  admin   7.6M Jun 21 17:20 stanford-corenlp-3.8.0.jar
-rw-r--r--   1 adiep  admin   991M Jun 21 17:37 stanford-english-corenlp-2017-06-09-models.jar
drwxr-xr-x   5 adiep  admin   170B Jun 21 17:20 sutime/
drwxr-xr-x   6 adiep  admin   204B Jun 21 17:20 tokensregex/
-rw-r--r--   1 adiep  admin   656K Jun 21 17:20 xom-1.2.10-src.jar
-rw-r--r--   1 adiep  admin   306K Jun 21 17:20 xom.jar

Não entendo por que não está conseguindo encontrar jar na pasta.

Você poderia definir a variável env do classpath antes de iniciar o servidor:

os.environ['CLASSPATH'] = '/usr/local/share/stanford'

outra solução poderia ser:

os.environ['STANFORD_PARSER'] = '/usr/local/share/stanford'
os.environ['STANFORD_MODELS'] = '/usr/local/share/stanford'

na minha configuração local, defino todas as três variáveis.

Eu adicionei todos os três ao meu zsh e ainda estou tendo os mesmos problemas.

Além disso, quando executo testes toxicológicos, vejo exatamente os mesmos erros.

Não sei o quanto isso é útil, mas adicionei uma linha para imprimir a lista de arquivos jar comparados.

['/usr/local/share/stanford/stanford-corenlp-3.8.0.jar', '/usr/local/share/stanford/stanford-corenlp-3.8.0.jar']
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    s = nltk.parse.corenlp.CoreNLPServer()
  File "/Users/adiep/feedback-sentiment/.env/src/nltk/nltk/parse/corenlp.py", line 70, in __init__
    key=lambda model_name: re.match(self._JAR, model_name)
TypeError: '>' not supported between instances of 'NoneType' and 'NoneType'

re.match não consegue corresponder _JAR aos arquivos jar encontrados.
`` `>>> importar nltk

importar re
s = nltk.parse.corenlp.CoreNLPServer ()
['/usr/local/share/stanford/stanford-corenlp-3.8.0.jar', '/usr/local/share/stanford/stanford-corenlp-3.8.0.jar']
Traceback (última chamada mais recente):
Arquivo " ", linha 1, em
s = nltk.parse.corenlp.CoreNLPServer ()
Arquivo "/Users/adiep/feedback-sentiment/.env/src/nltk/nltk/parse/corenlp.py", linha 70, em __init__
key = lambda model_name: re.match (self._JAR, model_name)
TypeError: '>' não é suportado entre instâncias de 'NoneType' e 'NoneType'
jar = '/usr/local/share/stanford/stanford-corenlp-3.8.0.jar'
r_jar = nltk.parse.corenlp.CoreNLPServer._JAR
re.match (r_jar, jar)

`` `

Parece que o que está acontecendo é que o re.match está sendo alimentado pelo caminho completo, ele procura o arquivo jar no início da string e sempre falha. Acho que devemos alimentar apenas os nomes dos arquivos jar.

Tudo bem, a correção é muito simples.

Eu mudei re.match (...) para re.search (...). Group () então ao invés de olhar apenas para o início da string, ele olha em todos os lugares.

Encontrei outro problema.

Acho que isso está relacionado ao problema que tive antes com CoreNLPParse usando o servidor proxy.

>>> s = nltk.parse.corenlp.CoreNLPServer()
>>> s.url
'http://localhost:9000'
>>> s.start()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    s.start()
  File "/Users/adiep/feedback-sentiment/.env/src/nltk/nltk/parse/corenlp.py", line 149, in start
    'Could not connect to the server.'
nltk.parse.corenlp.CoreNLPServerError: Could not connect to the server.

Ok, então era o problema do proxy. Descobri que você pode definir NO_PROXY='localhost' .

Agora estou com o problema de o servidor recusar conexões.

Não tenho certeza do porquê, mas quando eu inicio o objeto do servidor, ele inicia um servidor na porta 9000.
Edit: Acontece que eu tinha um servidor corenlp flutuando em segundo plano. Acabei de matá-lo e agora ele está executando o ping na porta 9000.
`` `>>> importar nltk

s = nltk.parse.corenlp.CoreNLPServer (verbose = True)
[Encontrado stanford-corenlp - (\ d +). (\ D +). (\ D +). Jar: /usr/local/share/stanford/stanford-corenlp-3.8.0.jar]
[Encontrado stanford-corenlp - (\ d +). (\ D +). (\ D +). Jar: /usr/local/share/stanford/stanford-corenlp-3.8.0.jar]
[Encontrado stanford-corenlp - (\ d +). (\ D +). (\ D +) - models.jar: /usr/local/share/stanford/stanford-corenlp-3.8.0-models.jar]
s.start ()
[Java encontrado: / usr / bin / java]
[Java encontrado: / usr / bin / java]
HTTPConnectionPool (host = 'localhost', port = 59023): Máximo de tentativas excedido com url: / live (causado por NewConnectionError (': Falha ao estabelecer uma nova conexão: [Errno 61] Conexão recusada ',))
HTTPConnectionPool (host = 'localhost', port = 59023): Máximo de tentativas excedido com url: / live (causado por NewConnectionError (': Falha ao estabelecer uma nova conexão: [Errno 61] Conexão recusada ',))
HTTPConnectionPool (host = 'localhost', port = 59023): Máximo de tentativas excedido com url: / live (causado por NewConnectionError (': Falha ao estabelecer uma nova conexão: [Errno 61] Conexão recusada ',))
HTTPConnectionPool (host = 'localhost', port = 59023): Máximo de tentativas excedido com url: / live (causado por NewConnectionError (': Falha ao estabelecer uma nova conexão: [Errno 61] Conexão recusada ',))
HTTPConnectionPool (host = 'localhost', port = 59023): Máximo de tentativas excedido com url: / live (causado por NewConnectionError (': Falha ao estabelecer uma nova conexão: [Errno 61] Conexão recusada ',))
HTTPConnectionPool (host = 'localhost', port = 59023): Máximo de tentativas excedido com url: / live (causado por NewConnectionError (': Falha ao estabelecer uma nova conexão: [Errno 61] Conexão recusada ',))
HTTPConnectionPool (host = 'localhost', port = 59023): Máximo de tentativas excedido com url: / live (causado por NewConnectionError (': Falha ao estabelecer uma nova conexão: [Errno 61] Conexão recusada ',))
HTTPConnectionPool (host = 'localhost', port = 59023): Máximo de tentativas excedido com url: / live (causado por NewConnectionError (': Falha ao estabelecer uma nova conexão: [Errno 61] Conexão recusada ',))
HTTPConnectionPool (host = 'localhost', port = 59023): Máximo de tentativas excedido com url: / live (causado por NewConnectionError (': Falha ao estabelecer uma nova conexão: [Errno 61] Conexão recusada ',))
HTTPConnectionPool (host = 'localhost', port = 59023): Máximo de tentativas excedido com url: / live (causado por NewConnectionError (': Falha ao estabelecer uma nova conexão: [Errno 61] Conexão recusada ',))
HTTPConnectionPool (host = 'localhost', port = 59023): Máximo de tentativas excedido com url: / live (causado por NewConnectionError (': Falha ao estabelecer uma nova conexão: [Errno 61] Conexão recusada ',))
HTTPConnectionPool (host = 'localhost', port = 59023): Máximo de tentativas excedido com url: / live (causado por NewConnectionError (': Falha ao estabelecer uma nova conexão: [Errno 61] Conexão recusada ',))
HTTPConnectionPool (host = 'localhost', port = 59023): Máximo de tentativas excedido com url: / live (causado por NewConnectionError (': Falha ao estabelecer uma nova conexão: [Errno 61] Conexão recusada ',))
HTTPConnectionPool (host = 'localhost', port = 59023): Máximo de tentativas excedido com url: / live (causado por NewConnectionError (': Falha ao estabelecer uma nova conexão: [Errno 61] Conexão recusada ',))
HTTPConnectionPool (host = 'localhost', port = 59023): Máximo de tentativas excedido com url: / live (causado por NewConnectionError (': Falha ao estabelecer uma nova conexão: [Errno 61] Conexão recusada ',))
HTTPConnectionPool (host = 'localhost', port = 59023): Máximo de tentativas excedido com url: / live (causado por NewConnectionError (': Falha ao estabelecer uma nova conexão: [Errno 61] Conexão recusada ',))
HTTPConnectionPool (host = 'localhost', port = 59023): Máximo de tentativas excedido com url: / live (causado por NewConnectionError (': Falha ao estabelecer uma nova conexão: [Errno 61] Conexão recusada ',))
HTTPConnectionPool (host = 'localhost', port = 59023): Máximo de tentativas excedido com url: / live (causado por NewConnectionError (': Falha ao estabelecer uma nova conexão: [Errno 61] Conexão recusada ',))
HTTPConnectionPool (host = 'localhost', port = 59023): Máximo de tentativas excedido com url: / live (causado por NewConnectionError (': Falha ao estabelecer uma nova conexão: [Errno 61] Conexão recusada ',))
HTTPConnectionPool (host = 'localhost', port = 59023): Máximo de tentativas excedido com url: / live (causado por NewConnectionError (': Falha ao estabelecer uma nova conexão: [Errno 61] Conexão recusada ',))
HTTPConnectionPool (host = 'localhost', port = 59023): Máximo de tentativas excedido com url: / live (causado por NewConnectionError (': Falha ao estabelecer uma nova conexão: [Errno 61] Conexão recusada ',))
HTTPConnectionPool (host = 'localhost', port = 59023): Máximo de tentativas excedido com url: / live (causado por NewConnectionError (': Falha ao estabelecer uma nova conexão: [Errno 61] Conexão recusada ',))
HTTPConnectionPool (host = 'localhost', port = 59023): Máximo de tentativas excedido com url: / live (causado por NewConnectionError (': Falha ao estabelecer uma nova conexão: [Errno 61] Conexão recusada ',))
HTTPConnectionPool (host = 'localhost', port = 59023): Máximo de tentativas excedido com url: / live (causado por NewConnectionError (': Falha ao estabelecer uma nova conexão: [Errno 61] Conexão recusada ',))
HTTPConnectionPool (host = 'localhost', port = 59023): Máximo de tentativas excedido com url: / live (causado por NewConnectionError (': Falha ao estabelecer uma nova conexão: [Errno 61] Conexão recusada ',))
HTTPConnectionPool (host = 'localhost', port = 59023): Máximo de tentativas excedido com url: / live (causado por NewConnectionError (': Falha ao estabelecer uma nova conexão: [Errno 61] Conexão recusada ',))
HTTPConnectionPool (host = 'localhost', port = 59023): Máximo de tentativas excedido com url: / live (causado por NewConnectionError (': Falha ao estabelecer uma nova conexão: [Errno 61] Conexão recusada ',))
HTTPConnectionPool (host = 'localhost', port = 59023): Máximo de tentativas excedido com url: / live (causado por NewConnectionError (': Falha ao estabelecer uma nova conexão: [Errno 61] Conexão recusada ',))
HTTPConnectionPool (host = 'localhost', port = 59023): Máximo de tentativas excedido com url: / live (causado por NewConnectionError (': Falha ao estabelecer uma nova conexão: [Errno 61] Conexão recusada ',))
HTTPConnectionPool (host = 'localhost', port = 59023): Máximo de tentativas excedido com url: / live (causado por NewConnectionError (': Falha ao estabelecer uma nova conexão: [Errno 61] Conexão recusada ',))
Traceback (última chamada mais recente):
Arquivo " ", linha 1, em
s.start ()
Arquivo "/Users/adiep/feedback-sentiment/.env/src/nltk/nltk/parse/corenlp.py", linha 150, no início
'Não pôde conectar-se ao servidor.'
nltk.parse.corenlp.CoreNLPServerError: Não foi possível conectar ao servidor.
`` `

Meu Deus, agora está funcionando.

Portanto, no geral, tive que mudar re.match para re.search.group e matar um corenlpserver flutuante em segundo plano.

Talvez deva haver algum código para detectar se há outros corenlpservers em execução? Não sei se vale a pena fazer.

Parece que, se você não usar com cláusulas, criar objetos de servidores e não os interromper, o python exclui o objeto, mas não o servidor real. O que eu estava fazendo é iniciar os servidores em meu intérprete e esquecendo de executar s.stop() .

Precisamos documentar de alguma forma como a API Stanford CoreNLP funciona para que possamos dizer às pessoas para não iniciarem o servidor dentro do Python.

Alternativamente, acho que se usarmos o truque __all__ , talvez possamos permitir acesso limitado ao que está dentro de nltk.parse.corenlp e impedir que usuários acessem CoreNLPServer . O objeto de nível mais baixo que um usuário deve usar é GenericCoreNLPParser .

BTW, @dimazest é o CoreNLPServer usado apenas para o ambiente de teste?

Sim, é usado apenas em testes.

Olá - Acho que estou tendo um problema relacionado ao observado aqui.

Recentemente, comecei a usar este pacote e estou usando o StanfordNERTagger, que retorna um erro de reprovação.

/usr/local/lib/python2.7/dist-packages/nltk/tag/stanford.py:183: DeprecationWarning: 
The StanfordTokenizer will be deprecated in version 3.2.5.
Please use nltk.tag.corenlp.CoreNLPPOSTagger or nltk.tag.corenlp.CoreNLPNERTagger instead.

Observe que acho que há um erro de digitação neste aviso. Tive que importar de nltk.tag.stanford para encontrar CoreNLPNERTagger .

Tentei mudar para a nova função e não consigo fazê-la funcionar.
Anteriormente eu tinha:

    stanfordClassifier = '/root/stanford-ner-2017-06-09/classifiers/english.muc.7class.distsim.crf.ser.gz'
    stanfordNerPath = '/root/stanford-ner-2017-06-09/stanford-ner.jar'
    st = StanfordNERTagger(stanfordClassifier, stanfordNerPath, encoding='utf8')
    tokens = nltk.tokenize.word_tokenize(text) 
    ner_tags = st.tag(tokens)

Que agora mudei para

    stanfordClassifier = '/root/stanford-ner-2017-06-09/classifiers/english.muc.7class.distsim.crf.ser.gz'
    stanfordNerPath = '/root/stanford-ner-2017-06-09/stanford-ner.jar'
    with CoreNLPServer(stanfordNerPath, stanfordClassifier) as server:
        st = CoreNLPNERTagger(url=server.url)
        tokens = nltk.tokenize.word_tokenize(text) 
        ner_tags = st.tag(tokens)

No entanto, este código retorna este erro: CoreNLPServerError: Could not connect to the server.

Não consigo encontrar documentação em nenhum lugar sobre como devo chamar CoreNLPNERTagger e como essa chamada difere do obsoleto StanfordNERTagger .

Qualquer ajuda é muito apreciada. Obrigado!

Olá, lamento que não haja documentação. A API mudou, aqui está o que você precisa fazer. Consulte # 1510, ele contém uma longa discussão sobre como iniciar um servidor.

A principal mudança: o NLTK não inicia o servidor CoreNLP, você precisa iniciá-lo. Consulte https://stanfordnlp.github.io/CoreNLP/corenlp-server.html para uma explicação detalhada, mas o comando deve ser algo como:

# Run the server using all jars in the current directory (e.g., the CoreNLP home directory)
java -mx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer -port 9000 -timeout 15000

Abra http: // localhost : 9000 / para certificar-se de que o servidor está funcionando.

Agora você está pronto para usar o cliente NLTK corenlp:

tagger = CoreNLPNERTagger(url='http://localhost:9000')
tokens = tagger.tag(text)

Por favor deixe-me saber se isto funciona.

Sim! Isso funciona. Muito obrigado pela ajuda.

Obrigado @dimazest , @alvations

Por algum motivo, não consigo me conectar ao servidor. Alguém pode me ajudar? Aqui está o código que estou executando.

de nltk.parse.corenlp import CoreNLPServer
server = CoreNLPServer ("stanford-corenlp-4.0.0.jar", "stanford-corenlp-4.0.0-models.jar", verbose = True)
server.start ()

de nltk.parse.corenlpnltk.pa import CoreNLPParser
parser = CoreNLPParser ()
parse = next (parser.raw_parse ("Coloquei o livro na caixa da mesa."))

server.stop ()

Estou executando em um arquivo dentro da pasta que baixei para CoreNLP para que não tenha que me preocupar com caminhos de abs ou qualquer coisa.
Aqui está o resultado:

[Java encontrado: / usr / bin / java]
[Java encontrado: / usr / bin / java]
Traceback (última chamada mais recente):
Arquivo "/Users/benstevens/Desktop/Bernstein2/Ben/stanford-corenlp-4.0.0/BenTest.py", linha 4, em
server.start ()
Arquivo "/Users/benstevens/Library/Python/3.8/lib/python/site-packages/nltk/parse/corenlp.py", linha 153, no início
raise CoreNLPServerError ("Não foi possível conectar ao servidor.")
nltk.parse.corenlp.CoreNLPServerError: Não foi possível conectar ao servidor.

Eu apreciaria muito qualquer ajuda.

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