Неожиданные строки Date / DateTime вызывают исключение в Stanford CoreNLP

Согласно Git от CoreNLP, проблема была исправлена ​​в некоторой версии CoreNLP, возможно, 3.5.1, по моему мнению, поскольку NER указан в качестве одного из измененных модулей в примечаниях к изменениям. Тем не менее, 3.5.x требует перехода на Java 1.8, и мы не готовы сделать это в настоящее время.

Кроме того, заявление об отказе от ответственности, я также опубликовал эту проблему, но это может не быть замечено, потому что проблема была решена. Учитывая, что SO является официальным форумом для поддержки CoreNLP, я спрашиваю здесь.

Поэтому я спрашиваю, что это за изменение, чтобы это исправить? Существует ли это на самом деле в текущей версии, или есть что-то еще, что нужно сделать. Мне нужно исправить это, не обновляя версию 3.4.1, которую я сейчас использую.

Для записи, строка ниже должна представлять 3 декабря 2009 года в 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 ответа

Решение

Хорошо, позвольте мне сказать, почему проблема существовала. Были две проблемы с extractDay() в 3.4.1:

  1. Integer.valueOf используется в строке 1107. Это создает ошибку, которую мы видим, потому что строка, если бы она была истолкована как число, безусловно, была бы длинной. Long.valueOf используется в более поздних версиях.
  2. Ложь должна быть возвращена из extractDay, потому что она не могла ничего сделать с этой строкой. Однако блок try (строка 1106) находится внутри цикла for (строка 1097), что означает, что после сбоя можно проверить больше токенов, что приведет к тому, что метод в конечном итоге вернет true. Это позволит создавать аннотацию, даже если технически не нужно создавать аннотации, поскольку синтаксический анализ не выполнен. Попытка была перемещена за пределы блока for в более поздних версиях.

Таким образом, единственный ответ - это обновление до более поздней версии (хотя я не могу обновить до более поздней версии в настоящее время).

Я не вижу этой проблемы со Stanford CoreNLP 3.4.1. Я скачал дистрибутив 3.4.1 и выполнил предложение с очень длинным номером, но не получил никакого сбоя.

Можете ли вы дать мне пример предложения, которое вызывает этот сбой?

Другие вопросы по тегам