Неожиданные строки 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:
- Integer.valueOf используется в строке 1107. Это создает ошибку, которую мы видим, потому что строка, если бы она была истолкована как число, безусловно, была бы длинной. Long.valueOf используется в более поздних версиях.
- Ложь должна быть возвращена из extractDay, потому что она не могла ничего сделать с этой строкой. Однако блок try (строка 1106) находится внутри цикла for (строка 1097), что означает, что после сбоя можно проверить больше токенов, что приведет к тому, что метод в конечном итоге вернет true. Это позволит создавать аннотацию, даже если технически не нужно создавать аннотации, поскольку синтаксический анализ не выполнен. Попытка была перемещена за пределы блока for в более поздних версиях.
Таким образом, единственный ответ - это обновление до более поздней версии (хотя я не могу обновить до более поздней версии в настоящее время).
Я не вижу этой проблемы со Stanford CoreNLP 3.4.1. Я скачал дистрибутив 3.4.1 и выполнил предложение с очень длинным номером, но не получил никакого сбоя.
Можете ли вы дать мне пример предложения, которое вызывает этот сбой?