Nltk: corenlp.py CoreNLPServer löst TypeError-Ausnahme aus

Erstellt am 22. Juni 2017  ·  21Kommentare  ·  Quelle: nltk/nltk

Hallo,

Hier ist der 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'

Die Funktion max löst diese Ausnahme aus.

Ich denke, was passiert ist, dass key=lambda model_name: re.match(self._JAR, model_name) NoneType zurückgibt, weil es mit nichts übereinstimmt. Es füllt also die Liste von NoneType und max nicht sortieren. Ich habe festgestellt, dass self._JAR und model_name wie folgt bewertet werden:

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

Vielen Dank,

pleaseverify resolved stanford api

Hilfreichster Kommentar

Guter Gott, jetzt funktioniert es.

Insgesamt musste ich also re.match in re.search.group ändern und einen schwebenden corenlpserver im Hintergrund töten.

Vielleicht sollte es Code geben, um zu erkennen, ob andere corenlpservers laufen? Weiß nicht ob sich das überhaupt lohnt.

Alle 21 Kommentare

Soll die Funktion max Feed-Dateinamen und keine vollständigen Pfade sein?

Ich habe versucht, CoreNLPServer stattdessen den Ordner zu übergeben, und nltk konnte ihn aus irgendeinem Grund nicht finden.

Hi,

Ich denke schon, was sind jars ?

Die Gläser befinden sich unter `/usr/local/share/stanford'

Hier die ls des entsprechenden Verzeichnisses:

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

Ich verstehe nicht, warum das jar im Ordner nicht gefunden wird.

Könnten Sie die classpath env-Variable setzen, bevor Sie den Server starten:

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

eine andere lösung könnte sein:

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

In meinem lokalen Setup habe ich alle drei Variablen eingestellt.

Ich habe alle drei zu meiner zsh hinzugefügt und stoße immer noch auf die gleichen Probleme.

Auch wenn ich Tox-Tests durchführe, sehe ich genau die gleichen Fehler.

Ich weiß nicht, wie viel Hilfe das ist, aber ich habe eine Zeile hinzugefügt, um die Liste der JAR-Dateien zu drucken, mit denen sie verglichen wird.

['/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 kann _JAR nicht mit den gefundenen JAR-Dateien abgleichen.
```>>> nltk importieren

Importieren
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 (letzter Anruf zuletzt):
Datei " ", Zeile 1, in
s = nltk.parse.corenlp.CoreNLPServer()
Datei "/Users/adiep/feedback-sentiment/.env/src/nltk/nltk/parse/corenlp.py", Zeile 70, in __init__
key=lambda model_name: re.match(self._JAR, model_name)
TypeError: '>' wird zwischen Instanzen von 'NoneType' und 'NoneType' nicht unterstützt
jar = '/usr/local/share/stanford/stanford-corenlp-3.8.0.jar'
r_jar = nltk.parse.corenlp.CoreNLPServer._JAR
re.match(r_jar, jar)

```

Es scheint, als würde re.match den vollständigen Pfad eingeben, nach der JAR-Datei am Anfang der Zeichenfolge suchen und immer fehlschlagen. Ich denke, es soll nur die Namen der JAR-Dateien füttern.

Okay, die Lösung ist ziemlich einfach.

Ich habe re.match(...) in re.search(...).group() geändert, sodass es, anstatt nur den Anfang des Strings zu betrachten, überall hinschaut.

Auf ein anderes Problem gestoßen.

Ich denke, dies hängt mit einem Problem zusammen, das ich zuvor mit CoreNLPParse unter Verwendung des Proxy-Servers hatte.

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

Okay, es war also das Proxy-Problem. Ich habe festgestellt, dass Sie NO_PROXY='localhost' festlegen können.

Jetzt habe ich das Problem, dass der Server keine Verbindungen herstellt.

Ich bin mir nicht sicher warum, aber wenn ich das Serverobjekt initiere, startet es einen Server an Port 9000.
Bearbeiten: Es stellte sich heraus, dass ich einen corenlp-Server im Hintergrund hatte. Ich habe es gerade beendet und jetzt pingt es Port 9000.
```>>> nltk importieren

s = nltk.parse.corenlp.CoreNLPServer(verbose=True)
[Gefunden stanford-corenlp-(\d+).(\d+).(\d+).jar: /usr/local/share/stanford/stanford-corenlp-3.8.0.jar]
[Gefunden stanford-corenlp-(\d+).(\d+).(\d+).jar: /usr/local/share/stanford/stanford-corenlp-3.8.0.jar]
[Gefunden stanford-corenlp-(\d+).(\d+).(\d+)-models.jar: /usr/local/share/stanford/stanford-corenlp-3.8.0-models.jar]
s.start()
[Java gefunden: /usr/bin/java]
[Java gefunden: /usr/bin/java]
HTTPConnectionPool(host='localhost', port=59023): Max. Wiederholungen überschritten mit URL: /live (Verursacht durch NewConnectionError(': Neue Verbindung konnte nicht aufgebaut werden: [Errno 61] Verbindung verweigert',))
HTTPConnectionPool(host='localhost', port=59023): Max. Wiederholungen überschritten mit URL: /live (Verursacht durch NewConnectionError(': Neue Verbindung konnte nicht aufgebaut werden: [Errno 61] Verbindung verweigert',))
HTTPConnectionPool(host='localhost', port=59023): Max. Wiederholungen überschritten mit URL: /live (Verursacht durch NewConnectionError(': Neue Verbindung konnte nicht aufgebaut werden: [Errno 61] Verbindung verweigert',))
HTTPConnectionPool(host='localhost', port=59023): Max. Wiederholungen überschritten mit URL: /live (Verursacht durch NewConnectionError(': Neue Verbindung konnte nicht aufgebaut werden: [Errno 61] Verbindung verweigert',))
HTTPConnectionPool(host='localhost', port=59023): Max. Wiederholungen überschritten mit URL: /live (Verursacht durch NewConnectionError(': Neue Verbindung konnte nicht aufgebaut werden: [Errno 61] Verbindung verweigert',))
HTTPConnectionPool(host='localhost', port=59023): Max. Wiederholungen überschritten mit URL: /live (Verursacht durch NewConnectionError(': Neue Verbindung konnte nicht aufgebaut werden: [Errno 61] Verbindung verweigert',))
HTTPConnectionPool(host='localhost', port=59023): Max. Wiederholungen überschritten mit URL: /live (Verursacht durch NewConnectionError(': Neue Verbindung konnte nicht aufgebaut werden: [Errno 61] Verbindung verweigert',))
HTTPConnectionPool(host='localhost', port=59023): Max. Wiederholungen überschritten mit URL: /live (Verursacht durch NewConnectionError(': Neue Verbindung konnte nicht aufgebaut werden: [Errno 61] Verbindung verweigert',))
HTTPConnectionPool(host='localhost', port=59023): Max. Wiederholungen überschritten mit URL: /live (Verursacht durch NewConnectionError(': Neue Verbindung konnte nicht aufgebaut werden: [Errno 61] Verbindung verweigert',))
HTTPConnectionPool(host='localhost', port=59023): Max. Wiederholungen überschritten mit URL: /live (Verursacht durch NewConnectionError(': Neue Verbindung konnte nicht aufgebaut werden: [Errno 61] Verbindung verweigert',))
HTTPConnectionPool(host='localhost', port=59023): Max. Wiederholungen überschritten mit URL: /live (Verursacht durch NewConnectionError(': Neue Verbindung konnte nicht aufgebaut werden: [Errno 61] Verbindung verweigert',))
HTTPConnectionPool(host='localhost', port=59023): Max. Wiederholungen überschritten mit URL: /live (Verursacht durch NewConnectionError(': Neue Verbindung konnte nicht aufgebaut werden: [Errno 61] Verbindung verweigert',))
HTTPConnectionPool(host='localhost', port=59023): Max. Wiederholungen überschritten mit URL: /live (Verursacht durch NewConnectionError(': Neue Verbindung konnte nicht aufgebaut werden: [Errno 61] Verbindung verweigert',))
HTTPConnectionPool(host='localhost', port=59023): Max. Wiederholungen überschritten mit URL: /live (Verursacht durch NewConnectionError(': Neue Verbindung konnte nicht aufgebaut werden: [Errno 61] Verbindung verweigert',))
HTTPConnectionPool(host='localhost', port=59023): Max. Wiederholungen überschritten mit URL: /live (Verursacht durch NewConnectionError(': Neue Verbindung konnte nicht aufgebaut werden: [Errno 61] Verbindung verweigert',))
HTTPConnectionPool(host='localhost', port=59023): Max. Wiederholungen überschritten mit URL: /live (Verursacht durch NewConnectionError(': Neue Verbindung konnte nicht aufgebaut werden: [Errno 61] Verbindung verweigert',))
HTTPConnectionPool(host='localhost', port=59023): Max. Wiederholungen überschritten mit URL: /live (Verursacht durch NewConnectionError(': Neue Verbindung konnte nicht aufgebaut werden: [Errno 61] Verbindung verweigert',))
HTTPConnectionPool(host='localhost', port=59023): Max. Wiederholungen überschritten mit URL: /live (Verursacht durch NewConnectionError(': Neue Verbindung konnte nicht aufgebaut werden: [Errno 61] Verbindung verweigert',))
HTTPConnectionPool(host='localhost', port=59023): Max. Wiederholungen überschritten mit URL: /live (Verursacht durch NewConnectionError(': Neue Verbindung konnte nicht aufgebaut werden: [Errno 61] Verbindung verweigert',))
HTTPConnectionPool(host='localhost', port=59023): Max. Wiederholungen überschritten mit URL: /live (Verursacht durch NewConnectionError(': Neue Verbindung konnte nicht aufgebaut werden: [Errno 61] Verbindung verweigert',))
HTTPConnectionPool(host='localhost', port=59023): Max. Wiederholungen überschritten mit URL: /live (Verursacht durch NewConnectionError(': Neue Verbindung konnte nicht aufgebaut werden: [Errno 61] Verbindung verweigert',))
HTTPConnectionPool(host='localhost', port=59023): Max. Wiederholungen überschritten mit URL: /live (Verursacht durch NewConnectionError(': Neue Verbindung konnte nicht aufgebaut werden: [Errno 61] Verbindung verweigert',))
HTTPConnectionPool(host='localhost', port=59023): Max. Wiederholungen überschritten mit URL: /live (Verursacht durch NewConnectionError(': Neue Verbindung konnte nicht aufgebaut werden: [Errno 61] Verbindung verweigert',))
HTTPConnectionPool(host='localhost', port=59023): Max. Wiederholungen überschritten mit URL: /live (Verursacht durch NewConnectionError(': Neue Verbindung konnte nicht aufgebaut werden: [Errno 61] Verbindung verweigert',))
HTTPConnectionPool(host='localhost', port=59023): Max. Wiederholungen überschritten mit URL: /live (Verursacht durch NewConnectionError(': Neue Verbindung konnte nicht aufgebaut werden: [Errno 61] Verbindung verweigert',))
HTTPConnectionPool(host='localhost', port=59023): Max. Wiederholungen überschritten mit URL: /live (Verursacht durch NewConnectionError(': Neue Verbindung konnte nicht aufgebaut werden: [Errno 61] Verbindung verweigert',))
HTTPConnectionPool(host='localhost', port=59023): Max. Wiederholungen überschritten mit URL: /live (Verursacht durch NewConnectionError(': Neue Verbindung konnte nicht aufgebaut werden: [Errno 61] Verbindung verweigert',))
HTTPConnectionPool(host='localhost', port=59023): Max. Wiederholungen überschritten mit URL: /live (Verursacht durch NewConnectionError(': Neue Verbindung konnte nicht aufgebaut werden: [Errno 61] Verbindung verweigert',))
HTTPConnectionPool(host='localhost', port=59023): Max. Wiederholungen überschritten mit URL: /live (Verursacht durch NewConnectionError(': Neue Verbindung konnte nicht aufgebaut werden: [Errno 61] Verbindung verweigert',))
HTTPConnectionPool(host='localhost', port=59023): Max. Wiederholungen überschritten mit URL: /live (Verursacht durch NewConnectionError(': Neue Verbindung konnte nicht aufgebaut werden: [Errno 61] Verbindung verweigert',))
Traceback (letzter Anruf zuletzt):
Datei " ", Zeile 1, in
s.start()
Datei "/Users/adiep/feedback-sentiment/.env/src/nltk/nltk/parse/corenlp.py", Zeile 150, in start
'Konnte keine Verbindung zum Server herstellen.'
nltk.parse.corenlp.CoreNLPServerError: Es konnte keine Verbindung zum Server hergestellt werden.
```

Guter Gott, jetzt funktioniert es.

Insgesamt musste ich also re.match in re.search.group ändern und einen schwebenden corenlpserver im Hintergrund töten.

Vielleicht sollte es Code geben, um zu erkennen, ob andere corenlpservers laufen? Weiß nicht ob sich das überhaupt lohnt.

Scheint so, als ob Python das Objekt löscht, aber nicht den tatsächlichen Server, wenn Sie keine with-Klauseln verwenden, Serverobjekte erstellen und sie nicht stoppen. Was ich tat, war, dass ich Server in meinem Interpreter startete und vergaß, s.stop() auszuführen.

Wir müssen irgendwie dokumentieren, wie die Stanford CoreNLP-API funktioniert, damit wir den Leuten sagen, dass sie den Server nicht in Python starten sollen.

Alternativ denke ich, wenn wir den Trick __all__ , können wir vielleicht eingeschränkten Zugriff auf das, was sich in nltk.parse.corenlp zulassen und Benutzer daran hindern, auf CoreNLPServer zuzugreifen. Das niedrigste Objekt, das ein Benutzer verwenden sollte, ist GenericCoreNLPParser .

Übrigens , CoreNLPServer nur für die Testumgebung?

Ja, es wird nur in Tests verwendet.

Hallo, ich glaube, ich habe ein Problem im Zusammenhang mit dem hier angegebenen.

Ich habe vor kurzem mit der Verwendung dieses Pakets begonnen und verwende den StanfordNERTagger, der einen veralteten Fehler zurückgibt.

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

Beachten Sie, dass diese Warnung meiner Meinung nach einen Tippfehler enthält. Ich musste von nltk.tag.stanford importieren, um die CoreNLPNERTagger .

Also habe ich versucht, auf die neue Funktion zu wechseln, und ich kann sie nicht zum Laufen bringen.
Vorher hatte ich:

    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)

zu dem ich jetzt gewechselt habe

    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)

Dieser Code gibt jedoch diesen Fehler zurück: CoreNLPServerError: Could not connect to the server.

Ich kann nirgendwo eine Dokumentation finden, wie ich CoreNLPNERTagger aufrufen soll und wie sich dieser Aufruf von dem veralteten StanfordNERTagger .

Jede Hilfe wird sehr geschätzt. Vielen Dank!

Hallo, es tut mir leid, dass es keine Dokumentation gibt. Die API hat sich geändert, hier ist, was Sie tun müssen. Siehe #1510, es enthält eine lange Diskussion darüber, wie man einen Server startet.

Die wichtigste Änderung: NLTK startet den CoreNLP-Server nicht, Sie müssen ihn starten. Eine detaillierte Erklärung finden Sie unter https://stanfordnlp.github.io/CoreNLP/corenlp-server.html , aber der Befehl sollte in etwa so lauten:

# 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

Öffnen Sie http://localhost :9000/, um sicherzustellen, dass der Server läuft.

Jetzt können Sie den NLTK corenlp-Client verwenden:

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

Bitte lassen Sie mich wissen, ob es funktioniert.

Jawohl! Das funktioniert. Vielen Dank für die Hilfe.

Danke @dimazest , @alvations

Aus irgendeinem Grund kann ich keine Verbindung zum Server herstellen. Kann mir jemand helfen? Hier ist der Code, den ich ausführe.

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

von nltk.parse.corenlpnltk.pa importieren CoreNLPParser
Parser = CoreNLPParser()
parse = next(parser.raw_parse("Ich habe das Buch in die Schachtel auf den Tisch gelegt."))

server.stop()

Ich führe es in einer Datei in dem Ordner aus, den ich für CoreNLP heruntergeladen habe, damit ich mich nicht um ABS-Pfade oder ähnliches kümmern muss.
Folgendes wird ausgegeben:

[Java gefunden: /usr/bin/java]
[Java gefunden: /usr/bin/java]
Traceback (letzter Anruf zuletzt):
Datei "/Users/benstevens/Desktop/Bernstein2/Ben/stanford-corenlp-4.0.0/BenTest.py", Zeile 4, in
server.start()
Datei "/Users/benstevens/Library/Python/3.8/lib/python/site-packages/nltk/parse/corenlp.py", Zeile 153, in start
raise CoreNLPServerError("Verbindung zum Server konnte nicht hergestellt werden.")
nltk.parse.corenlp.CoreNLPServerError: Es konnte keine Verbindung zum Server hergestellt werden.

Ich würde mich sehr über jede Hilfe freuen.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen