Datetime 意外的日期/日期时间字符串导致Stanford CoreNLP中出现异常

Datetime 意外的日期/日期时间字符串导致Stanford CoreNLP中出现异常,datetime,stanford-nlp,sutime,Datetime,Stanford Nlp,Sutime,根据,这个问题已经在CoreNLP的某个版本中修复了,据我猜测可能是3.5.1,因为NER在变更注释中被列为变更模块之一。但是,3.5.x需要跳转到Java1.8,目前我们还不准备这样做 另外,免责声明,我也曾发布过该问题,但由于该问题已经解决,因此可能未被看到。鉴于这是一个支持CoreNLP的官方论坛,我在此请求 所以我在问,为了解决这个问题,有什么变化?它是否确实存在于当前版本中,或者是否需要执行其他操作。我需要在不升级当前使用的3.4.1的情况下修复此问题 为了便于记录,下面的字符串应该表

根据,这个问题已经在CoreNLP的某个版本中修复了,据我猜测可能是3.5.1,因为NER在变更注释中被列为变更模块之一。但是,3.5.x需要跳转到Java1.8,目前我们还不准备这样做

另外,免责声明,我也曾发布过该问题,但由于该问题已经解决,因此可能未被看到。鉴于这是一个支持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)

请注意,
true
是打印值。

我认为斯坦福CoreNLP 3.4.1没有这个问题。我下载了3.4.1发行版,在一个很长的句子上运行,没有出现任何崩溃


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

我认为斯坦福CoreNLP 3.4.1没有这个问题。我下载了3.4.1发行版,在一个很长的句子上运行,没有出现任何崩溃


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

好的,让我说说为什么会出现这个问题。3.4.1中的extractDay()有两个问题:

  • Integer.valueOf在第1107行中使用。这就产生了我们看到的错误,因为如果将字符串解释为一个数字,那么它肯定是一个长字符串。Long.valueOf在更高版本中使用
  • extractDay应返回False,因为它无法对该字符串执行任何操作。然而,try块(第1106行)位于for循环(第1097行)内,这意味着在失败后,可以检查更多的令牌,从而导致方法最终返回true。这将允许创建注释,即使从技术上讲,由于解析失败,不应创建注释。在以后的版本中,该尝试已移到for块之外

  • 因此,唯一的答案是更新到更高版本(尽管目前我还无法更新到更高版本)。

    好的,让我来说明问题存在的原因。3.4.1中的extractDay()有两个问题:

  • Integer.valueOf在第1107行中使用。这就产生了我们看到的错误,因为如果将字符串解释为一个数字,那么它肯定是一个长字符串。Long.valueOf在更高版本中使用
  • extractDay应返回False,因为它无法对该字符串执行任何操作。然而,try块(第1106行)位于for循环(第1097行)内,这意味着在失败后,可以检查更多的令牌,从而导致方法最终返回true。这将允许创建注释,即使从技术上讲,由于解析失败,不应创建注释。在以后的版本中,该尝试已移到for块之外

  • 因此,唯一的答案是更新到更高版本(虽然我现在还不能更新到更高版本)。

    我不能提供完整的文档,但我希望所讨论的行足够好
    DATETIME\u END:200912031000
    这发生在使用已创建的模型进行测试(分类)时。它被标记为日期实体,然后当它被视为日期实体时(正如您从这个字符串中解析一天所看到的),问题就会出现。同样,我正在实例化
    nerCombiner=new nerclasifiercombiner(applyNumericClassifiers,useSUTime,props,//此参数应包含SUtime属性myClassifierArray)
    我发现如果手动将第一个参数设置为false,则不会发生错误。因此,大多数情况下,我们只是从管道中访问NER,但在某些情况下,我们必须自己构造它,这就是一种情况。我无法真正提供整个文档,但我希望相关行足够好
    DATETIME\u END:200912031000
    在使用已创建的模型进行测试(分类)时会发生这种情况。它被标记为日期实体,然后当它被视为日期实体时就会出现问题(正如您从该字符串中解析一天所看到的那样)。此外,我正在实例化(applyNumericClassifiers,useSUTime,props,//此参数应包含SUtime属性myClassifierArray)我发现,如果第一个参数手动设置为false,则不会发生错误。因此,大多数情况下,我们只是从管道访问NER,但在某些情况下,我们必须自己构造它,这就是一种情况。
        ISODateInstance idi = new ISODateInstance();
        boolean fields = idi.extractFields("200912031000");
        System.out.println(fields);