Nltk: corenlp.py CoreNLPServer выдает исключение TypeError

Созданный на 22 июн. 2017  ·  21Комментарии  ·  Источник: nltk/nltk

Привет,

Вот код:

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

Спасибо,

pleaseverify resolved stanford api

Самый полезный комментарий

Господи, теперь это работает.

В общем, мне пришлось изменить re.match на re.search.group и убить плавающий corenlpserver в фоновом режиме.

Может быть, должен быть какой-то код, чтобы определить, работают ли другие corenlpservers? Не знаю, стоит ли это вообще делать.

Все 21 Комментарий

Должна ли функция 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: не удалось подключиться к серверу.

Буду очень признателен за любую помощь.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги