Stanford CoreNLP管道coref:解析一些短字符串(很少提到)返回indexoutofbounds异常

时间:2016-01-20 14:19:43

标签: java clojure annotations indexoutofboundsexception stanford-nlp

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

过去(v3.5.1),当我使用以下注释器

创建管道时

"tokenize, ssplit, pos, lemma, ner, parse, depparse, dcoref, quote, entitymentions"

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

“我吃面包”。

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

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

"tokenize, ssplit, pos, lemma, ner, parse, 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 annotator和一个没有,没有coref解析句子,计算提及,然后只有当我看到不止一个提及时才用coref解析...这看起来有点太多了。)

1 个答案:

答案 0 :(得分:1)

3.6.0具有对共享的重大改变。这个问题是Stanford CoreNLP 3.6.0中的一个错误。如果您重新下载该发行版,则应该在网站上的内容中修复此错误。它也应该在即将发布的Maven版本中修复。