java - 斯坦福 CoreNLP 管道 coref : parsing some short strings (with few mentions) returns indexoutofbounds exception

标签 java clojure annotations indexoutofboundsexception stanford-nlp

背景:我正在将斯坦福 CoreNLP 库导入到我的 clojure 项目中。我之前使用的是 3.5.1 版本,但最近直接跳到了 3.6.0 版本,绕过了 3.5.2。作为此更新的一部分,因为我使用 dcoref 注释器获取共指信息,所以我需要进行一些小的修改,以便我的程序改用 coref 注释器。

在过去(v3.5.1),当我使用以下注释器创建管道时

“分词、ssplit、pos、引理、ner、解析、depparse、dcoref、引用、entitymentions”,

我可以毫无错误地解析如下句子:

“我吃了面包”。

如果我没记错的话,从结果带注释的文档中提取共指链只会返回一个空值,或者可能是一个空数组。但这无关紧要,因为至少带注释的文档会毫无错误地创建。

现在,当我使用以下注释器创建管道时:

“分词、ssplit、pos、引理、ner、解析、depparse、mention、coref、quote、entitymentions”,

然后我尝试解析同一个句子(或任何其他只有 1 或 0 个“提及”的句子),我得到一个带有以下跟踪的 ​​indexoutofboundsexception:

actual: java.lang.RuntimeException: Error annotating document with coref
 at edu.stanford.nlp.scoref.StatisticalCorefSystem.annotate (StatisticalCorefSystem.java:79)
    edu.stanford.nlp.scoref.StatisticalCorefSystem.annotate (StatisticalCorefSystem.java:62)
    edu.stanford.nlp.pipeline.CorefAnnotator.annotate (CorefAnnotator.java:100)
    edu.stanford.nlp.pipeline.AnnotationPipeline.annotate (AnnotationPipeline.java:68)
    edu.stanford.nlp.pipeline.StanfordCoreNLP.annotate (StanfordCoreNLP.java:491)
    nlp.core$parse_text.invoke (core.clj:199)
    nlp.focus_scorer.process$lexchain_features.invoke (process.clj:63)
    nlp.focus_scorer.process_test/fn (process_test.clj:49)
    clojure.test$test_var$fn__7670.invoke (test.clj:704)
    clojure.test$test_var.invoke (test.clj:704)
    clojure.test$test_vars$fn__7692$fn__7697.invoke (test.clj:722)
    clojure.test$default_fixture.invoke (test.clj:674)
    clojure.test$test_vars$fn__7692.invoke (test.clj:722)
    clojure.test$default_fixture.invoke (test.clj:674)
    clojure.test$test_vars.invoke (test.clj:718)
    clojure.test$test_all_vars.invoke (test.clj:728)
    clojure.test$test_ns.invoke (test.clj:747)
    clojure.core$map$fn__4553.invoke (core.clj:2624)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.Cons.next (Cons.java:39)
    clojure.lang.RT.boundedLength (RT.java:1735)
    clojure.lang.RestFn.applyTo (RestFn.java:130)
    clojure.core$apply.invoke (core.clj:632)
    clojure.test$run_tests.doInvoke (test.clj:762)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    user$eval13163.invoke (form-init7737210093072696705.clj:1)
    clojure.lang.Compiler.eval (Compiler.java:6782)
    clojure.lang.Compiler.eval (Compiler.java:6745)
    clojure.core$eval.invoke (core.clj:3081)
    clojure.main$repl$read_eval_print__7099$fn__7102.invoke (main.clj:240)
    clojure.main$repl$read_eval_print__7099.invoke (main.clj:240)
    clojure.main$repl$fn__7108.invoke (main.clj:258)
    clojure.main$repl.doInvoke (main.clj:258)
    clojure.lang.RestFn.invoke (RestFn.java:1523)
    clojure.tools.nrepl.middleware.interruptible_eval$evaluate$fn__909.invoke (interruptible_eval.clj:58)
    clojure.lang.AFn.applyToHelper (AFn.java:152)
    clojure.lang.AFn.applyTo (AFn.java:144)
    clojure.core$apply.invoke (core.clj:630)
    clojure.core$with_bindings_STAR_.doInvoke (core.clj:1868)
    clojure.lang.RestFn.invoke (RestFn.java:425)
    clojure.tools.nrepl.middleware.interruptible_eval$evaluate.invoke (interruptible_eval.clj:56)
    clojure.tools.nrepl.middleware.interruptible_eval$interruptible_eval$fn__951$fn__954.invoke (interruptible_eval.clj:191)
    clojure.tools.nrepl.middleware.interruptible_eval$run_next$fn__946.invoke (interruptible_eval.clj:159)
    clojure.lang.AFn.run (AFn.java:22)
    java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1142)
    java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:617)
    java.lang.Thread.run (Thread.java:745)
Caused by: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
 at java.util.ArrayList$SubList.rangeCheck (ArrayList.java:1217)
    java.util.ArrayList$SubList.get (ArrayList.java:1034)
    edu.stanford.nlp.scoref.Clusterer$State.setClusters (Clusterer.java:349)
    edu.stanford.nlp.scoref.Clusterer$State.<init> (Clusterer.java:322)
    edu.stanford.nlp.scoref.Clusterer.getClusterMerges (Clusterer.java:58)
    edu.stanford.nlp.scoref.ClusteringCorefSystem.runCoref (ClusteringCorefSystem.java:63)
    edu.stanford.nlp.scoref.StatisticalCorefSystem.annotate (StatisticalCorefSystem.java:68)
    edu.stanford.nlp.scoref.StatisticalCorefSystem.annotate (StatisticalCorefSystem.java:62)
    edu.stanford.nlp.pipeline.CorefAnnotator.annotate (CorefAnnotator.java:100)
    edu.stanford.nlp.pipeline.AnnotationPipeline.annotate (AnnotationPipeline.java:68)
    edu.stanford.nlp.pipeline.StanfordCoreNLP.annotate (StanfordCoreNLP.java:491)
    nlp.core$parse_text.invoke (core.clj:199)
    nlp.focus_scorer.process$lexchain_features.invoke (process.clj:63)
    nlp.focus_scorer.process_test/fn (process_test.clj:49)
    clojure.test$test_var$fn__7670.invoke (test.clj:704)
    clojure.test$test_var.invoke (test.clj:704)
    clojure.test$test_vars$fn__7692$fn__7697.invoke (test.clj:722)
    clojure.test$default_fixture.invoke (test.clj:674)
    clojure.test$test_vars$fn__7692.invoke (test.clj:722)
    clojure.test$default_fixture.invoke (test.clj:674)
    clojure.test$test_vars.invoke (test.clj:718)
    clojure.test$test_all_vars.invoke (test.clj:728)
    clojure.test$test_ns.invoke (test.clj:747)
clojure.core$map$fn__4553.invoke (core.clj:2624)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.Cons.next (Cons.java:39)
    clojure.lang.RT.boundedLength (RT.java:1735)
    clojure.lang.RestFn.applyTo (RestFn.java:130)
    clojure.core$apply.invoke (core.clj:632)
    clojure.test$run_tests.doInvoke (test.clj:762)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    user$eval13163.invoke (form-init7737210093072696705.clj:1)
    clojure.lang.Compiler.eval (Compiler.java:6782)
    clojure.lang.Compiler.eval (Compiler.java:6745)
    clojure.core$eval.invoke (core.clj:3081)
    clojure.main$repl$read_eval_print__7099$fn__7102.invoke (main.clj:240)
    clojure.main$repl$read_eval_print__7099.invoke (main.clj:240)
    clojure.main$repl$fn__7108.invoke (main.clj:258)
    clojure.main$repl.doInvoke (main.clj:258)
    clojure.lang.RestFn.invoke (RestFn.java:1523)
    clojure.tools.nrepl.middleware.interruptible_eval$evaluate$fn__909.invoke (interruptible_eval.clj:58)
    clojure.lang.AFn.applyToHelper (AFn.java:152)
    clojure.lang.AFn.applyTo (AFn.java:144)
    clojure.core$apply.invoke (core.clj:630)
    clojure.core$with_bindings_STAR_.doInvoke (core.clj:1868)
    clojure.lang.RestFn.invoke (RestFn.java:425)
    clojure.tools.nrepl.middleware.interruptible_eval$evaluate.invoke (interruptible_eval.clj:56)
clojure.tools.nrepl.middleware.interruptible_eval$interruptible_eval$fn__951$fn__954.invoke (interruptible_eval.clj:191)
    clojure.tools.nrepl.middleware.interruptible_eval$run_next$fn__946.invoke (interruptible_eval.clj:159)
    clojure.lang.AFn.run (AFn.java:22)
    java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1142)
    java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:617)
    java.lang.Thread.run (Thread.java:745)

我可能做错了什么吗?我意识到我使用 clojure 而不是 java 可能会导致一些问题,但我在 3.5.1 版本中从未遇到过问题。看起来错误是从 edu.stanford.nlp.scoref.StatisticalCorefSystem.annotate 中的注释步骤引发的,但我不确定我能对此做什么(除了有两个管道对象,一个带有coref 注释器和一个没有的注释器,在没有 coref 的情况下解析句子,计算提及次数,然后仅当我看到不止一个提及时才使用 coref 进行解析...这似乎有点太多了。)

最佳答案

3.6.0 对共指进行了重大更改。此问题是斯坦福 CoreNLP 3.6.0 中的一个错误。如果您重新下载发行版,该错误应该会在网站上现在的内容中得到修复。它也应该在即将发布的 Maven 版本中得到修复。

关于java - 斯坦福 CoreNLP 管道 coref : parsing some short strings (with few mentions) returns indexoutofbounds exception,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34902540/

相关文章:

java - 如何安排 Callable 在特定时间运行?

java - fragment 通信问题(尝试调用虚拟方法)

java - 用于控制 Web 应用程序的 kinect API

java - 使用 MappedSuperClass 对相关表进行 Hibernate 过滤器

codeigniter - 自动创建日期 - 注释 - Codeigniter 2 和 Doctrine 2

java - 如何更新声明变量的值

join - clojure 中惯用的映射连接?

logging - 如何决定哪些附加程序对 `clojure.tools.logging` 的日志进行操作?

java - 在 Clojure 中获取日期和时间的最佳方法是什么?

java - 这个创建新对象的 REST 方法到底是如何工作的?