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