Nltk: corenlp.py CoreNLPServer 抛出 TypeError 异常

创建于 2017-06-22  ·  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._JARmodel_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

我不明白为什么在文件夹中找不到 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 文件匹配。
```>>> 导入 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__ 中
键 = lambda 模型名称:重新匹配(self._JAR,模型名称)
类型错误:“NoneType”和“NoneType”的实例之间不支持“>”
jar = '/usr/local/share/stanford/stanford-corenlp-3.8.0.jar'
r_jar = nltk.parse.corenlp.CoreNLPServer._JAR
重新匹配(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 服务器漂浮在后台。 我刚刚杀死了它,现在它正在 ping 端口 9000。
```>>> 导入 nltk

s = nltk.parse.corenlp.CoreNLPServer(详细=真)
[找到 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()

我们需要以某种方式记录斯坦福 CoreNLP API 的工作原理,以便我们告诉人们不要在 Python 中启动服务器。

或者,我认为如果我们使用__all__技巧,也许我们可以允许有限访问nltk.parse.corenlp并阻止用户访问CoreNLPServer 。 用户应该使用的最低级别的对象是GenericCoreNLPParser

顺便说一句, @dimazestCoreNLPServer仅用于测试环境吗?

是的,它仅用于测试。

您好 - 我想我遇到了与此处提到的问题相关的问题。

我最近开始使用这个包并且正在使用 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)
服务器启动()

从 nltk.parse.corenlpnltk.pa 导入 CoreNLPParser
解析器 = CoreNLPParser()
parse = next(parser.raw_parse("我把书放在桌子上的盒子里。"))

服务器停止()

我在为 CoreNLP 下载的文件夹内的一个文件中运行它,这样我就不必担心 abs 路径或任何东西。
这是它的输出:

[找到java:/usr/bin/java]
[找到java:/usr/bin/java]
回溯(最近一次调用最后一次):
文件“/Users/benstevens/Desktop/Bernstein2/Ben/stanford-corenlp-4.0.0/BenTest.py”,第 4 行,在
服务器启动()
文件“/Users/benstevens/Library/Python/3.8/lib/python/site-packages/nltk/parse/corenlp.py”,第 153 行,在开始
引发 CoreNLPServerError("无法连接到服务器。")
nltk.parse.corenlp.CoreNLPServerError: 无法连接到服务器。

我将不胜感激任何帮助。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

alvations picture alvations  ·  3评论

talbaumel picture talbaumel  ·  4评论

DavidNemeskey picture DavidNemeskey  ·  4评论

alvations picture alvations  ·  4评论

stevenbird picture stevenbird  ·  4评论