Привет,
Вот код:
>>> 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'
Функция max
генерирует это исключение.
Я думаю, что происходит то, что key=lambda model_name: re.match(self._JAR, model_name)
возвращает NoneType, потому что он ничего не соответствует. Таким образом, он заполняет список NoneType
а max
не может его отсортировать. Я обнаружил, что self._JAR
и model_name
оцениваются следующим образом:
>>> type(re.match(r'stanford-corenlp-(\d+)\.(\d+)\.(\d+)\.jar', '/usr/local/share/stanford/stanford-corenlp-3.8.0.jar'))
<class 'NoneType'>
Спасибо,
Должна ли функция max
быть именами файлов каналов, а не полными путями?
Я попытался передать папку CoreNLPServer, но по какой-то причине nltk не смог ее найти.
Привет,
я так думаю, что такое jars
?
Банки расположены в / usr / local / share / stanford.
Вот ls соответствующего каталога:
(.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
Я не понимаю, почему не удается найти банку в папке.
Не могли бы вы установить переменную env пути к классам перед запуском сервера:
os.environ['CLASSPATH'] = '/usr/local/share/stanford'
другое решение может быть:
os.environ['STANFORD_PARSER'] = '/usr/local/share/stanford'
os.environ['STANFORD_MODELS'] = '/usr/local/share/stanford'
в моей локальной настройке я установил все три переменные.
Я добавил все три в свой zsh, и у меня все еще возникают те же проблемы.
Кроме того, когда я запускаю тесты на токсичность, я вижу те же самые ошибки.
Не знаю, насколько это помогает, но я добавил строку для печати списка файлов jar, с которыми он сравнивается.
['/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 не может сопоставить _JAR с найденными файлами jar.
`` >>> import nltk
импорт ре
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']
Отслеживание (последний вызов последний):
Файл " ", строка 1, в
s = nltk.parse.corenlp.CoreNLPServer ()
Файл "/Users/adiep/feedback-sentiment/.env/src/nltk/nltk/parse/corenlp.py", строка 70, в __init__
key = лямбда имя_модели: re.match (self._JAR, имя_модели)
TypeError: '>' не поддерживается между экземплярами 'NoneType' и 'NoneType'
jar = '/usr/local/share/stanford/stanford-corenlp-3.8.0.jar'
r_jar = nltk.parse.corenlp.CoreNLPServer._JAR
re.match (r_jar, jar)`` ''
Похоже, что происходит то, что re.match загружает полный путь, он ищет файл jar в начале строки и всегда терпит неудачу. Я думаю, что предполагается, что нужно кормить только именами файлов jar.
Хорошо, исправить довольно просто.
Я изменил re.match (...) на re.search (...). Group (), поэтому вместо того, чтобы смотреть только на начало строки, он смотрит везде.
Пробежался по другому вопросу.
Я думаю, это связано с проблемой, с которой я сталкивался раньше с CoreNLPParse с использованием прокси-сервера.
>>> 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.
Хорошо, значит, это проблема прокси. Я обнаружил, что вы можете установить NO_PROXY='localhost'
.
Теперь у меня проблема с отказом сервера в подключении.
Я не уверен, почему, но когда я инициализирую объект сервера, он запускает сервер на порту 9000.
Изменить: Оказывается, у меня был сервер corenlp, плавающий в фоновом режиме. Я его только что убил и теперь пингуется порт 9000.
`` >>> import nltk
s = nltk.parse.corenlp.CoreNLPServer (verbose = True)
[Найдено stanford-corenlp - (\ d +). (\ D +). (\ D +). Jar: /usr/local/share/stanford/stanford-corenlp-3.8.0.jar]
[Найдено stanford-corenlp - (\ d +). (\ D +). (\ D +). Jar: /usr/local/share/stanford/stanford-corenlp-3.8.0.jar]
[Найдено stanford-corenlp - (\ d +). (\ D +). (\ D +) - models.jar: /usr/local/share/stanford/stanford-corenlp-3.8.0-models.jar]
s.start ()
[Найдено java: / usr / bin / java]
[Найдено java: / usr / bin / java]
HTTPConnectionPool (host = 'localhost', port = 59023): превышено максимальное количество повторных попыток с url: / live (вызвано NewConnectionError (': Не удалось установить новое соединение: [Errno 61] В соединении отказано ',))
HTTPConnectionPool (host = 'localhost', port = 59023): превышено максимальное количество повторных попыток с url: / live (вызвано NewConnectionError (': Не удалось установить новое соединение: [Errno 61] В соединении отказано ',))
HTTPConnectionPool (host = 'localhost', port = 59023): превышено максимальное количество повторных попыток с url: / live (вызвано NewConnectionError (': Не удалось установить новое соединение: [Errno 61] В соединении отказано ',))
HTTPConnectionPool (host = 'localhost', port = 59023): превышено максимальное количество повторных попыток с url: / live (вызвано NewConnectionError (': Не удалось установить новое соединение: [Errno 61] В соединении отказано ',))
HTTPConnectionPool (host = 'localhost', port = 59023): превышено максимальное количество повторных попыток с url: / live (вызвано NewConnectionError (': Не удалось установить новое соединение: [Errno 61] В соединении отказано ',))
HTTPConnectionPool (host = 'localhost', port = 59023): превышено максимальное количество повторных попыток с url: / live (вызвано NewConnectionError (': Не удалось установить новое соединение: [Errno 61] В соединении отказано ',))
HTTPConnectionPool (host = 'localhost', port = 59023): превышено максимальное количество повторных попыток с url: / live (вызвано NewConnectionError (': Не удалось установить новое соединение: [Errno 61] В соединении отказано ',))
HTTPConnectionPool (host = 'localhost', port = 59023): превышено максимальное количество повторных попыток с url: / live (вызвано NewConnectionError (': Не удалось установить новое соединение: [Errno 61] В соединении отказано ',))
HTTPConnectionPool (host = 'localhost', port = 59023): превышено максимальное количество повторных попыток с url: / live (вызвано NewConnectionError (': Не удалось установить новое соединение: [Errno 61] В соединении отказано ',))
HTTPConnectionPool (host = 'localhost', port = 59023): превышено максимальное количество повторных попыток с url: / live (вызвано NewConnectionError (': Не удалось установить новое соединение: [Errno 61] В соединении отказано ',))
HTTPConnectionPool (host = 'localhost', port = 59023): превышено максимальное количество повторных попыток с url: / live (вызвано NewConnectionError (': Не удалось установить новое соединение: [Errno 61] В соединении отказано ',))
HTTPConnectionPool (host = 'localhost', port = 59023): превышено максимальное количество повторных попыток с url: / live (вызвано NewConnectionError (': Не удалось установить новое соединение: [Errno 61] В соединении отказано ',))
HTTPConnectionPool (host = 'localhost', port = 59023): превышено максимальное количество повторных попыток с url: / live (вызвано NewConnectionError (': Не удалось установить новое соединение: [Errno 61] В соединении отказано ',))
HTTPConnectionPool (host = 'localhost', port = 59023): превышено максимальное количество повторных попыток с url: / live (вызвано NewConnectionError (': Не удалось установить новое соединение: [Errno 61] В соединении отказано ',))
HTTPConnectionPool (host = 'localhost', port = 59023): превышено максимальное количество повторных попыток с url: / live (вызвано NewConnectionError (': Не удалось установить новое соединение: [Errno 61] В соединении отказано ',))
HTTPConnectionPool (host = 'localhost', port = 59023): превышено максимальное количество повторных попыток с url: / live (вызвано NewConnectionError (': Не удалось установить новое соединение: [Errno 61] В соединении отказано ',))
HTTPConnectionPool (host = 'localhost', port = 59023): превышено максимальное количество повторных попыток с url: / live (вызвано NewConnectionError (': Не удалось установить новое соединение: [Errno 61] В соединении отказано ',))
HTTPConnectionPool (host = 'localhost', port = 59023): превышено максимальное количество повторных попыток с url: / live (вызвано NewConnectionError (': Не удалось установить новое соединение: [Errno 61] В соединении отказано ',))
HTTPConnectionPool (host = 'localhost', port = 59023): превышено максимальное количество повторных попыток с url: / live (вызвано NewConnectionError (': Не удалось установить новое соединение: [Errno 61] В соединении отказано ',))
HTTPConnectionPool (host = 'localhost', port = 59023): превышено максимальное количество повторных попыток с url: / live (вызвано NewConnectionError (': Не удалось установить новое соединение: [Errno 61] В соединении отказано ',))
HTTPConnectionPool (host = 'localhost', port = 59023): превышено максимальное количество повторных попыток с url: / live (вызвано NewConnectionError (': Не удалось установить новое соединение: [Errno 61] В соединении отказано ',))
HTTPConnectionPool (host = 'localhost', port = 59023): превышено максимальное количество повторных попыток с url: / live (вызвано NewConnectionError (': Не удалось установить новое соединение: [Errno 61] В соединении отказано ',))
HTTPConnectionPool (host = 'localhost', port = 59023): превышено максимальное количество повторных попыток с url: / live (вызвано NewConnectionError (': Не удалось установить новое соединение: [Errno 61] В соединении отказано ',))
HTTPConnectionPool (host = 'localhost', port = 59023): превышено максимальное количество повторных попыток с url: / live (вызвано NewConnectionError (': Не удалось установить новое соединение: [Errno 61] В соединении отказано ',))
HTTPConnectionPool (host = 'localhost', port = 59023): превышено максимальное количество повторных попыток с url: / live (вызвано NewConnectionError (': Не удалось установить новое соединение: [Errno 61] В соединении отказано ',))
HTTPConnectionPool (host = 'localhost', port = 59023): превышено максимальное количество повторных попыток с url: / live (вызвано NewConnectionError (': Не удалось установить новое соединение: [Errno 61] В соединении отказано ',))
HTTPConnectionPool (host = 'localhost', port = 59023): превышено максимальное количество повторных попыток с url: / live (вызвано NewConnectionError (': Не удалось установить новое соединение: [Errno 61] В соединении отказано ',))
HTTPConnectionPool (host = 'localhost', port = 59023): превышено максимальное количество повторных попыток с url: / live (вызвано NewConnectionError (': Не удалось установить новое соединение: [Errno 61] В соединении отказано ',))
HTTPConnectionPool (host = 'localhost', port = 59023): превышено максимальное количество повторных попыток с url: / live (вызвано NewConnectionError (': Не удалось установить новое соединение: [Errno 61] В соединении отказано ',))
HTTPConnectionPool (host = 'localhost', port = 59023): превышено максимальное количество повторных попыток с url: / live (вызвано NewConnectionError (': Не удалось установить новое соединение: [Errno 61] В соединении отказано ',))
Отслеживание (последний вызов последний):
Файл " ", строка 1, в
s.start ()
Файл "/Users/adiep/feedback-sentiment/.env/src/nltk/nltk/parse/corenlp.py", строка 150, в начале
'Не удалось установить соединение с сервером.'
nltk.parse.corenlp.CoreNLPServerError: не удалось подключиться к серверу.
`` ''
Господи, теперь это работает.
В общем, мне пришлось изменить re.match на re.search.group и убить плавающий corenlpserver в фоновом режиме.
Может быть, должен быть какой-то код, чтобы определить, работают ли другие corenlpservers? Не знаю, стоит ли это вообще делать.
Похоже, что если вы не используете предложения with, создаете объекты серверов и не останавливаете их, python удаляет объект, но не фактический сервер. Что я делал, так это то, что я запускал серверы в своем интерпретаторе и забывал запустить s.stop()
.
Нам нужно каким-то образом задокументировать, как работает Stanford CoreNLP API, чтобы мы говорили людям не запускать сервер внутри Python.
В качестве альтернативы, я думаю, что если мы воспользуемся трюком __all__
, возможно, мы сможем разрешить ограниченный доступ к тому, что находится внутри nltk.parse.corenlp
и запретить пользователям доступ к CoreNLPServer
. Объект самого нижнего уровня, который должен использовать пользователь, - это GenericCoreNLPParser
.
Кстати, @dimazest - это CoreNLPServer
только для тестовой среды?
Да, используется только в тестах.
Здравствуйте! Я думаю, что у меня проблема, связанная с тем, что здесь указано.
Я недавно начал использовать этот пакет и использую StanfordNERTagger, который возвращает ошибку устаревания.
/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.
Обратите внимание: я думаю, что в этом предупреждении есть опечатка. Мне пришлось импортировать из nltk.tag.stanford
чтобы найти CoreNLPNERTagger
.
Итак, я попытался переключиться на новую функцию, но не могу заставить ее работать.
Раньше у меня было:
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)
Который я теперь изменил на
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)
Однако этот код возвращает эту ошибку: CoreNLPServerError: Could not connect to the server.
Я нигде не могу найти документацию о том, как я должен вызывать CoreNLPNERTagger
и чем этот вызов отличается от устаревшего StanfordNERTagger
.
Любая помощь горячо приветствуется. Спасибо!
Привет, извини, что нет документации. API изменился, вот что вам нужно сделать. Обратитесь к # 1510, он содержит длинное обсуждение того, как запустить сервер.
Главное изменение: NLTK не запускает сервер CoreNLP, его нужно запустить. Обратитесь к https://stanfordnlp.github.io/CoreNLP/corenlp-server.html для подробного объяснения, но команда должна быть примерно такой:
# 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
Откройте http: // localhost : 9000 /, чтобы убедиться, что сервер работает.
Теперь вы готовы использовать клиент NLTK corenlp:
tagger = CoreNLPNERTagger(url='http://localhost:9000')
tokens = tagger.tag(text)
Пожалуйста, дайте мне знать, если это сработает.
Да! Это работает. Огромное спасибо за помощь.
Спасибо @dimazest , @alvations
По какой-то причине не могу подключиться к серверу. Может кто-нибудь мне помочь? Вот код, который я запускаю.
из nltk.parse.corenlp импортировать CoreNLPServer
server = CoreNLPServer ("stanford-corenlp-4.0.0.jar", "stanford-corenlp-4.0.0-models.jar", verbose = True)
server.start ()
из nltk.parse.corenlpnltk.pa импортировать CoreNLPParser
parser = CoreNLPParser ()
parse = next (parser.raw_parse («Я положил книгу в коробку на стол.»))
server.stop ()
Я запускаю его в файле внутри папки, которую я загрузил для CoreNLP, так что мне не нужно беспокоиться о путях abs или о чем-то еще.
Вот что он выводит:
[Найдено java: / usr / bin / java]
[Найдено java: / usr / bin / java]
Отслеживание (последний вызов последний):
Файл "/Users/benstevens/Desktop/Bernstein2/Ben/stanford-corenlp-4.0.0/BenTest.py", строка 4, в
server.start ()
Файл "/Users/benstevens/Library/Python/3.8/lib/python/site-packages/nltk/parse/corenlp.py", строка 153, в начале
поднять CoreNLPServerError («Не удалось подключиться к серверу.»)
nltk.parse.corenlp.CoreNLPServerError: не удалось подключиться к серверу.
Буду очень признателен за любую помощь.
Самый полезный комментарий
Господи, теперь это работает.
В общем, мне пришлось изменить re.match на re.search.group и убить плавающий corenlpserver в фоновом режиме.
Может быть, должен быть какой-то код, чтобы определить, работают ли другие corenlpservers? Не знаю, стоит ли это вообще делать.