意外日期/日期时间字符串导致斯坦福CoreNLP中的异常

时间:2016-01-21 14:40:30

标签: datetime stanford-nlp sutime

根据CoreNLP's Git,根据我的猜测,在某些版本的CoreNLP中修复了该问题,可能是3.5.1,因为NER被列为更改注释中已更改的模块之一。但是,3.5.x需要跳转到Java 1.8,我们目前还没准备这样做。

此外,免责声明,我也发布了该问题,但可能没有看到,因为问题已经解决。鉴于SO是支持CoreNLP的官方论坛,我在这里问。

所以我在问,解决这个问题有什么变化?它实际上是存在于当前版本中,还是还有其他需要完成的东西。我需要解决这个问题,而不是从我目前正在使用的3.4.1升级。

对于记录,下面的字符串应该代表2009年12月3日10:00(该字符串中没有给出秒数,因此我们假设为00)。

这是堆栈跟踪。

java.lang.NumberFormatException: For input string: "200912031000"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:583)
at java.lang.Integer.valueOf(Integer.java:766)
at edu.stanford.nlp.ie.pascal.ISODateInstance.extractDay(ISODateInstance.java:1107)
at edu.stanford.nlp.ie.pascal.ISODateInstance.extractFields(ISODateInstance.java:398)
at edu.stanford.nlp.ie.pascal.ISODateInstance.<init>(ISODateInstance.java:82)
at edu.stanford.nlp.ie.QuantifiableEntityNormalizer.normalizedDateString(QuantifiableEntityNormalizer.java:363)
at edu.stanford.nlp.ie.QuantifiableEntityNormalizer.normalizedDateString(QuantifiableEntityNormalizer.java:338)
at edu.stanford.nlp.ie.QuantifiableEntityNormalizer.processEntity(QuantifiableEntityNormalizer.java:1018)
at edu.stanford.nlp.ie.QuantifiableEntityNormalizer.addNormalizedQuantitiesToEntities(QuantifiableEntityNormalizer.java:1320)
at edu.stanford.nlp.ie.NERClassifierCombiner.classifyWithGlobalInformation(NERClassifierCombiner.java:145)
at edu.stanford.nlp.ie.AbstractSequenceClassifier.classifySentenceWithGlobalInformation(AbstractSequenceClassifier.java:322)
at edu.stanford.nlp.pipeline.NERCombinerAnnotator.doOneSentence(NERCombinerAnnotator.java:148)
at edu.stanford.nlp.pipeline.SentenceAnnotator.annotate(SentenceAnnotator.java:95)
at edu.stanford.nlp.pipeline.NERCombinerAnnotator.annotate(NERCombinerAnnotator.java:137)
at edu.stanford.nlp.pipeline.AnnotationPipeline.annotate(AnnotationPipeline.java:67)
at edu.stanford.nlp.pipeline.StanfordCoreNLP.annotate(StanfordCoreNLP.java:847)

修改

我再次关注这个问题,因为我正在解决当前代码中的一些时间问题,我可以通过简单的方式重现:

    ISODateInstance idi = new ISODateInstance();
    boolean fields = idi.extractFields("200912031000");
    System.out.println(fields);

请注意,true是打印值。

2 个答案:

答案 0 :(得分:0)

我没有看到Stanford CoreNLP 3.4.1的这个问题。我下载了3.4.1发行版并运行了一个非常长的句子,并且不会发生任何类型的崩溃。

你能给我一个导致这次崩溃的样本句子吗?

答案 1 :(得分:0)

好的,请允许我说明问题存在的原因。在3.4.1中,extractDay()存在两个问题:

  1. Integer.valueOf在第1107行中使用。这会产生我们看到的错误,因为String如果被解释为数字,肯定会是Long。 Long.valueOf用于更高版本。
  2. 应该从extractDay返回False,因为它无法对该字符串执行任何操作。然而,try块(行1106)在for循环内(行1097),这意味着在失败之后,可以检查更多令牌,导致该方法最终返回true。这将允许创建注释,即使在解析失败时技术上也不应创建注释。在以后的版本中,try被移到了for块之外。
  3. 所以唯一的答案是更新到更高版本(虽然我现在还不能更新到更高版本)。