Nltk: corenlp.py CoreNLPServer lève l'exception TypeError

Créé le 22 juin 2017  ·  21Commentaires  ·  Source: nltk/nltk

Bonjour,

Voici le code :

>>> 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'

La fonction max lève cette exception.

Je pense que ce qui se passe, c'est que key=lambda model_name: re.match(self._JAR, model_name) renvoie NoneType car il ne correspond à rien. Il remplit donc la liste de NoneType et max ne parvient pas à le trier. J'ai trouvé que self._JAR et model_name évalués à ce qui suit :

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

Merci,

pleaseverify resolved stanford api

Commentaire le plus utile

Bon sang, maintenant ça marche.

Donc, dans l'ensemble, j'ai dû changer re.match en re.search.group et tuer un serveur corenlp flottant en arrière-plan.

Peut-être qu'il devrait y avoir du code pour détecter s'il y a d'autres corenlpservers en cours d'exécution ? Je ne sais même pas si cela en vaut la peine.

Tous les 21 commentaires

La fonction max est-elle censée être des noms de fichiers de flux et non des chemins complets ?

J'ai essayé de transmettre le dossier à CoreNLPServer à la place et nltk n'a pas pu le trouver pour une raison quelconque.

Salut,

Je pense que oui, que sont les jars ?

Les pots sont situés à `/usr/local/share/stanford'

Voici les ls du répertoire concerné :

(.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

Je ne comprends pas pourquoi il ne parvient pas à trouver le pot dans le dossier.

Pourriez-vous définir la variable env classpath avant de démarrer le serveur :

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

une autre solution pourrait être :

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

dans ma configuration locale, j'ai défini les trois variables.

J'ai ajouté les trois à mon zsh et je rencontre toujours les mêmes problèmes.

De plus, lorsque je lance des tests de toxicité, je vois exactement les mêmes erreurs.

Je ne sais pas à quel point cela est utile, mais j'ai ajouté une ligne pour imprimer la liste des fichiers jar auxquels il se compare.

['/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 ne parvient pas à faire correspondre _JAR avec les fichiers jar trouvés.
```>>> importer nltk

importation 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 (appel le plus récent en dernier) :
Déposer " ", ligne 1, dans
s = nltk.parse.corenlp.CoreNLPServer()
Fichier "/Users/adiep/feedback-sentiment/.env/src/nltk/nltk/parse/corenlp.py", ligne 70, dans __init__
key=lambda model_name: re.match(self._JAR, model_name)
TypeError : '>' non pris en charge entre les instances de 'NoneType' et 'NoneType'
jar = '/usr/local/share/stanford/stanford-corenlp-3.8.0.jar'
r_jar = nltk.parse.corenlp.CoreNLPServer._JAR
re.match(r_jar, pot)

```

On dirait que ce qui se passe, c'est que re.match alimente le chemin complet, il recherche le fichier jar au début de la chaîne et échoue toujours. Je pense qu'il est supposé alimenter uniquement les noms des fichiers jar.

Bon le correctif est assez simple.

J'ai changé re.match(...) en re.search(...).group() donc au lieu de ne regarder que le début de la chaîne, il regarde partout.

J'ai rencontré un autre problème.

Je pense que cela est lié au problème que j'ai eu auparavant avec CoreNLPParse en utilisant le serveur 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, donc c'était le problème du proxy. J'ai trouvé que vous pouvez définir NO_PROXY='localhost' .

Maintenant, j'ai le problème avec le serveur qui refuse de se connecter.

Je ne sais pas pourquoi, mais lorsque j'initialise l'objet serveur, il démarre un serveur sur le port 9000.
Edit : Il s'avère que j'avais un serveur corenlp flottant en arrière-plan. Je viens de le tuer et maintenant il envoie un ping au port 9000.
```>>> importer nltk

s = nltk.parse.corenlp.CoreNLPServer(verbose=True)
[Trouvé stanford-corenlp-(\d+).(\d+).(\d+).jar : /usr/local/share/stanford/stanford-corenlp-3.8.0.jar]
[Trouvé stanford-corenlp-(\d+).(\d+).(\d+).jar : /usr/local/share/stanford/stanford-corenlp-3.8.0.jar]
[Trouvé stanford-corenlp-(\d+).(\d+).(\d+)-models.jar : /usr/local/share/stanford/stanford-corenlp-3.8.0-models.jar]
s.start()
[Java trouvé : /usr/bin/java]
[Java trouvé : /usr/bin/java]
HTTPConnectionPool(host='localhost', port=59023) : nombre maximal de tentatives dépassé avec l'url : /live (causé par NewConnectionError(': Échec de l'établissement d'une nouvelle connexion : [Errno 61] Connexion refusée',))
HTTPConnectionPool(host='localhost', port=59023) : nombre maximal de tentatives dépassé avec l'url : /live (causé par NewConnectionError(': Échec de l'établissement d'une nouvelle connexion : [Errno 61] Connexion refusée',))
HTTPConnectionPool(host='localhost', port=59023) : nombre maximal de tentatives dépassé avec l'url : /live (causé par NewConnectionError(': Échec de l'établissement d'une nouvelle connexion : [Errno 61] Connexion refusée',))
HTTPConnectionPool(host='localhost', port=59023) : nombre maximal de tentatives dépassé avec l'url : /live (causé par NewConnectionError(': Échec de l'établissement d'une nouvelle connexion : [Errno 61] Connexion refusée',))
HTTPConnectionPool(host='localhost', port=59023) : nombre maximal de tentatives dépassé avec l'url : /live (causé par NewConnectionError(': Échec de l'établissement d'une nouvelle connexion : [Errno 61] Connexion refusée',))
HTTPConnectionPool(host='localhost', port=59023) : nombre maximal de tentatives dépassé avec l'url : /live (causé par NewConnectionError(': Échec de l'établissement d'une nouvelle connexion : [Errno 61] Connexion refusée',))
HTTPConnectionPool(host='localhost', port=59023) : nombre maximal de tentatives dépassé avec l'url : /live (causé par NewConnectionError(': Échec de l'établissement d'une nouvelle connexion : [Errno 61] Connexion refusée',))
HTTPConnectionPool(host='localhost', port=59023) : nombre maximal de tentatives dépassé avec l'url : /live (causé par NewConnectionError(': Échec de l'établissement d'une nouvelle connexion : [Errno 61] Connexion refusée',))
HTTPConnectionPool(host='localhost', port=59023) : nombre maximal de tentatives dépassé avec l'url : /live (causé par NewConnectionError(': Échec de l'établissement d'une nouvelle connexion : [Errno 61] Connexion refusée',))
HTTPConnectionPool(host='localhost', port=59023) : nombre maximal de tentatives dépassé avec l'url : /live (causé par NewConnectionError(': Échec de l'établissement d'une nouvelle connexion : [Errno 61] Connexion refusée',))
HTTPConnectionPool(host='localhost', port=59023) : nombre maximal de tentatives dépassé avec l'url : /live (causé par NewConnectionError(': Échec de l'établissement d'une nouvelle connexion : [Errno 61] Connexion refusée',))
HTTPConnectionPool(host='localhost', port=59023) : nombre maximal de tentatives dépassé avec l'url : /live (causé par NewConnectionError(': Échec de l'établissement d'une nouvelle connexion : [Errno 61] Connexion refusée',))
HTTPConnectionPool(host='localhost', port=59023) : nombre maximal de tentatives dépassé avec l'url : /live (causé par NewConnectionError(': Échec de l'établissement d'une nouvelle connexion : [Errno 61] Connexion refusée',))
HTTPConnectionPool(host='localhost', port=59023) : nombre maximal de tentatives dépassé avec l'url : /live (causé par NewConnectionError(': Échec de l'établissement d'une nouvelle connexion : [Errno 61] Connexion refusée',))
HTTPConnectionPool(host='localhost', port=59023) : nombre maximal de tentatives dépassé avec l'url : /live (causé par NewConnectionError(': Échec de l'établissement d'une nouvelle connexion : [Errno 61] Connexion refusée',))
HTTPConnectionPool(host='localhost', port=59023) : nombre maximal de tentatives dépassé avec l'url : /live (causé par NewConnectionError(': Échec de l'établissement d'une nouvelle connexion : [Errno 61] Connexion refusée',))
HTTPConnectionPool(host='localhost', port=59023) : nombre maximal de tentatives dépassé avec l'url : /live (causé par NewConnectionError(': Échec de l'établissement d'une nouvelle connexion : [Errno 61] Connexion refusée',))
HTTPConnectionPool(host='localhost', port=59023) : nombre maximal de tentatives dépassé avec l'url : /live (causé par NewConnectionError(': Échec de l'établissement d'une nouvelle connexion : [Errno 61] Connexion refusée',))
HTTPConnectionPool(host='localhost', port=59023) : nombre maximal de tentatives dépassé avec l'url : /live (causé par NewConnectionError(': Échec de l'établissement d'une nouvelle connexion : [Errno 61] Connexion refusée',))
HTTPConnectionPool(host='localhost', port=59023) : nombre maximal de tentatives dépassé avec l'url : /live (causé par NewConnectionError(': Échec de l'établissement d'une nouvelle connexion : [Errno 61] Connexion refusée',))
HTTPConnectionPool(host='localhost', port=59023) : nombre maximal de tentatives dépassé avec l'url : /live (causé par NewConnectionError(': Échec de l'établissement d'une nouvelle connexion : [Errno 61] Connexion refusée',))
HTTPConnectionPool(host='localhost', port=59023) : nombre maximal de tentatives dépassé avec l'url : /live (causé par NewConnectionError(': Échec de l'établissement d'une nouvelle connexion : [Errno 61] Connexion refusée',))
HTTPConnectionPool(host='localhost', port=59023) : nombre maximal de tentatives dépassé avec l'url : /live (causé par NewConnectionError(': Échec de l'établissement d'une nouvelle connexion : [Errno 61] Connexion refusée',))
HTTPConnectionPool(host='localhost', port=59023) : nombre maximal de tentatives dépassé avec l'url : /live (causé par NewConnectionError(': Échec de l'établissement d'une nouvelle connexion : [Errno 61] Connexion refusée',))
HTTPConnectionPool(host='localhost', port=59023) : nombre maximal de tentatives dépassé avec l'url : /live (causé par NewConnectionError(': Échec de l'établissement d'une nouvelle connexion : [Errno 61] Connexion refusée',))
HTTPConnectionPool(host='localhost', port=59023) : nombre maximal de tentatives dépassé avec l'url : /live (causé par NewConnectionError(': Échec de l'établissement d'une nouvelle connexion : [Errno 61] Connexion refusée',))
HTTPConnectionPool(host='localhost', port=59023) : nombre maximal de tentatives dépassé avec l'url : /live (causé par NewConnectionError(': Échec de l'établissement d'une nouvelle connexion : [Errno 61] Connexion refusée',))
HTTPConnectionPool(host='localhost', port=59023) : nombre maximal de tentatives dépassé avec l'url : /live (causé par NewConnectionError(': Échec de l'établissement d'une nouvelle connexion : [Errno 61] Connexion refusée',))
HTTPConnectionPool(host='localhost', port=59023) : nombre maximal de tentatives dépassé avec l'url : /live (causé par NewConnectionError(': Échec de l'établissement d'une nouvelle connexion : [Errno 61] Connexion refusée',))
HTTPConnectionPool(host='localhost', port=59023) : nombre maximal de tentatives dépassé avec l'url : /live (causé par NewConnectionError(': Échec de l'établissement d'une nouvelle connexion : [Errno 61] Connexion refusée',))
Traceback (appel le plus récent en dernier) :
Déposer " ", ligne 1, dans
s.start()
Fichier "/Users/adiep/feedback-sentiment/.env/src/nltk/nltk/parse/corenlp.py", ligne 150, au début
'Ne peut se connecter au serveur.'
nltk.parse.corenlp.CoreNLPServerError : impossible de se connecter au serveur.
```

Bon sang, maintenant ça marche.

Donc, dans l'ensemble, j'ai dû changer re.match en re.search.group et tuer un serveur corenlp flottant en arrière-plan.

Peut-être qu'il devrait y avoir du code pour détecter s'il y a d'autres corenlpservers en cours d'exécution ? Je ne sais même pas si cela en vaut la peine.

On dirait que si vous n'utilisez pas de clauses with, créez des objets serveurs et ne les arrêtez pas, python supprime l'objet mais pas le serveur réel. Ce que je faisais, c'est que je démarrais des serveurs dans mon interpréteur et que j'oubliais d'exécuter s.stop() .

Nous devons en quelque sorte documenter le fonctionnement de l'API Stanford CoreNLP afin de dire aux gens de ne pas démarrer le serveur à l'intérieur de Python.

Alternativement, je pense que si nous utilisons l'astuce __all__ , nous pouvons peut-être autoriser un accès limité à ce qu'il y a à l'intérieur du nltk.parse.corenlp et empêcher les utilisateurs d'accéder au CoreNLPServer . L'objet de niveau le plus bas qu'un utilisateur doit utiliser est GenericCoreNLPParser .

BTW, @dimazest est le CoreNLPServer utilisé uniquement pour l'environnement de test ?

Oui, il est utilisé uniquement dans les tests.

Bonjour - Je pense que j'ai un problème lié à celui noté ici.

J'ai récemment commencé à utiliser ce package et j'utilise StanfordNERTagger, qui renvoie une erreur de dépréciation.

/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.

Notez que je pense qu'il y a une faute de frappe dans cet avertissement. J'ai dû importer de nltk.tag.stanford pour trouver le CoreNLPNERTagger .

J'ai donc essayé de passer à la nouvelle fonction et je n'arrive pas à la faire fonctionner.
Auparavant j'avais :

    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 j'ai maintenant changé en

    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)

Cependant, ce code renvoie cette erreur : CoreNLPServerError: Could not connect to the server.

Je ne trouve nulle part de documentation sur la façon dont je suis censé appeler CoreNLPNERTagger et en quoi cet appel diffère du StanfordNERTagger obsolète.

Toute aide est très appréciée. Merci!

Bonjour, je suis désolé qu'il n'y ait pas de documentation. L'API a changé, voici ce que vous devez faire. Référez-vous à #1510, il contient une longue discussion sur la façon de démarrer un serveur.

Le principal changement : NLTK ne démarre pas le serveur CoreNLP, vous devez le démarrer. Reportez-vous à https://stanfordnlp.github.io/CoreNLP/corenlp-server.html pour une explication détaillée, mais la commande devrait ressembler à :

# 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

Ouvrez http://localhost :9000/ pour vous assurer que le serveur est en cours d'exécution.

Vous êtes maintenant prêt à utiliser le client NLTK corenlp :

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

S'il vous plaît laissez-moi savoir si cela fonctionne.

Oui! Cela marche. Merci beaucoup pour l'aide.

Merci @dimazest , @alvations

Pour une raison quelconque, je ne peux pas me connecter au serveur. Quelqu'un peut m'aider? Voici le code que j'exécute.

à partir de nltk.parse.corenlp importer CoreNLPServer
serveur = CoreNLPServer("stanford-corenlp-4.0.0.jar","stanford-corenlp-4.0.0-models.jar",verbose=True)
serveur.start()

de nltk.parse.corenlpnltk.pa importer CoreNLPParser
analyseur = CoreNLPParser()
parse = next(parser.raw_parse("J'ai mis le livre dans la boite sur la table."))

serveur.stop()

Je l'exécute dans un fichier à l'intérieur du dossier que j'ai téléchargé pour CoreNLP afin que je n'aie pas à me soucier des chemins abs ou quoi que ce soit.
Voici ce qu'il sort :

[Java trouvé : /usr/bin/java]
[Java trouvé : /usr/bin/java]
Traceback (appel le plus récent en dernier) :
Fichier "/Users/benstevens/Desktop/Bernstein2/Ben/stanford-corenlp-4.0.0/BenTest.py", ligne 4, dans
serveur.start()
Fichier "/Users/benstevens/Library/Python/3.8/lib/python/site-packages/nltk/parse/corenlp.py", ligne 153, au début
raise CoreNLPServerError("Impossible de se connecter au serveur.")
nltk.parse.corenlp.CoreNLPServerError : impossible de se connecter au serveur.

J'apprécierais grandement toute aide.

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

chaseireland picture chaseireland  ·  3Commentaires

Chris00 picture Chris00  ·  3Commentaires

mwess picture mwess  ·  5Commentaires

zdog234 picture zdog234  ·  3Commentaires

alvations picture alvations  ·  4Commentaires