corenlp.py正在引发"未创建Java虚拟机错误"



我正在尝试使用stanford corenlp python包装器来实现依赖关系解析器。

由于我使用的是Windows平台,它在执行时会给pexpect包带来错误,所以我花了一些时间安装了wexpect for Windows,并按照这里的步骤完成了安装。现在,当我试图再次执行corenlp.py时,我得到了以下错误,程序被终止了。请帮我做这个。

Traceback (most recent call last):
File "corenlp.py", line 258, in <module>
nlp = StanfordCoreNLP()
File "corenlp.py", line 169, in __init__
self.corenlp.expect("done.", timeout=20) # Load pos tagger model (~5sec)
File "/cygdrive/f/Masters-Spring2015/Natural Language Processing/Project/stanford-corenlp-python/wexpect.py", line 1356, in expect
return self.expect_list(compiled_pattern_list, timeout, searchwindowsize)
File "/cygdrive/f/Masters-Spring2015/Natural Language Processing/Project/stanford-corenlp-python/wexpect.py", line 1370, in expect_list
return self.expect_loop(searcher_re(pattern_list), timeout, searchwindowsize)
File "/cygdrive/f/Masters-Spring2015/Natural Language Processing/Project/stanford-corenlp-python/wexpect.py", line 1441, in expect_loop
raise EOF (str(e) + 'n' + str(self))
wexpect.EOF: End Of File (EOF) in read_nonblocking(). Empty string style platform.
<wexpect.spawn_unix object at 0x7fdad40c>
version: 2.3 ($Revision: 399 $)
command: /cygdrive/c/Windows/system32/java
args: ['/cygdrive/c/Windows/system32/java', '-Xmx1800m', '-cp', './stanford-corenlp-full-2014-08-27/stanford-corenlp-3.4.1.jar:./stanford-corenlp-full-2014-08-27/stanford-corenlp-3.4.1-models.jar:./stanford-corenlp-full-2014-08-27/joda-time.jar:./stanford-corenlp-full-2014-08-27/xom.jar:./stanford-corenlp-full-2014-08-27/jollyday.jar', 'edu.stanford.nlp.pipeline.StanfordCoreNLP', '-props', 'default.properties']
searcher: searcher_re:
0: re.compile("done.")
buffer (last 100 chars):
before (last 100 chars):  not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
after: <class 'wexpect.EOF'>
match: None
match_index: None
exitstatus: None
flag_eof: True
pid: 7104
child_fd: 3
closed: False
timeout: 30
delimiter: <class 'wexpect.EOF'>
logfile: None
logfile_read: None
logfile_send: None
maxread: 2000
ignorecase: False
searchwindowsize: None
delaybeforesend: 0.05
delayafterclose: 0.1
delayafterterminate: 0.1

stanford-corenlp-python包装器启动一个服务器,该服务器为CoreNLP生成一个命令行接口实例,在HTTP上接收语句,通过stdin将语句管道传输到生成的CLI实例,获取stdout结果,对其进行解析,并通过HTTP发回语句,然后在最初发送请求的过程中再次进行解析。

您看到的错误——wexpect得到了一个意外的EOF——看起来像是CoreNLP CLI的派生实例正在崩溃。这可能是因为你在Cygwin运行这个。Cygwin看起来像unix,但当它需要做真正的unix-y事情时,比如运行其他程序,需要与操作系统进行真正交互的事情,它就会开始变成垃圾。

我猜你选择Cygwin是因为你不能在Windows命令行上使用pexpect,而stanford-corenlp-python包装器使用它

Pexpect仅适用于POSIX系统,其中pty模块存在于标准库中。使用Cygwin可以在Windows上运行它。

它认为我们在这里看到了一个pexpect在Cygwin上失败的例子。

我的建议是:不要使用stanford-corenlp-python包装器;它又慢又脏。即使在你完成了这项工作之后,其他事情也会出错,即使在你运行了它之后,它也会极大地拖延处理。

相反,直接从命令行运行CoreNLP。如果要执行批处理作业,请使用文件列表。输出是XML;您可以解析/grep-it,然后就可以上路了。从CoreNLP主页:

如果您想处理文件列表,请使用以下命令行:

java -cp stanford-corenlp-VV.jar:stanford-corenlp-VV-models.jar:xom.jar:joda-time.jar:jollyday.jar:ejml-VV.jar -Xmx2g edu.stanford.nlp.pipeline.StanfordCoreNLP [ -props <YOUR CONFIGURATION FILE> ] -filelist <A FILE CONTAINING YOUR LIST OF FILES>

让我告诉你我自己使用包装器的经验。上次我使用stanford-corenlp-python包装器时,处理17800个文档需要两周时间。那是在对代码进行了一两周的调整以处理我即将通过的大量新闻文章之后

后来,我买了一台新电脑,直接通过命令行运行CoreNLP,除了一些python和shell脚本之外,没有任何包装器来帮助创建批处理作业的目标文件列表。24000份文件花了15个小时处理。新电脑起了作用,但我预计新硬件的性能可能会提高4倍。另一个26x是因为包装掉了。

考虑到stanford-corenlp-python包装器是如何编写的,它的速度慢且有缺陷也就不足为奇了。在所有疯狂的处理层之间,我很惊讶他们能让它发挥作用。不过,你最好只在命令行上运行,尤其是因为你不必在Cygwin中运行它。

最新更新