поиск дат и их положения в строке с использованием stanford nlp

Мне нужно найти даты в строке и их позиции. Рассмотрим пример строки

"Интересная дата - 4 дня от сегодняшнего дня, 20 июля этого года, другая дата - 18 февраля 1997 года"

Мне нужны выходные данные (если сегодня 14 июля 2013 г.)
17 июля 2013 г., позиция 25
20 июля 2013 г., позиция 56
18 февраля 1997 г., позиция 93

Мне удалось написать код для получения различных частей строки, которая распознается как дата. Необходимо улучшить/изменить это, чтобы добиться вышеуказанного результата. Любые подсказки или помощь приветствуются:

    Properties props = new Properties();
    AnnotationPipeline pipeline = new AnnotationPipeline();
    pipeline.addAnnotator(new PTBTokenizerAnnotator(false));
    pipeline.addAnnotator(new WordsToSentencesAnnotator(false));
    pipeline.addAnnotator(new POSTaggerAnnotator(false));
    pipeline.addAnnotator(new TimeAnnotator("sutime", props));

    Annotation annotation = new Annotation("The interesting date is 4 days from today and it is 20th july of this year, another date is 18th Feb 1997");
    annotation.set(CoreAnnotations.DocDateAnnotation.class, "2013-07-14");
    pipeline.annotate(annotation);
    List<CoreMap> timexAnnsAll = annotation.get(TimeAnnotations.TimexAnnotations.class);
    timexAnnsAll.each(){
        println it
    }

С приведенным выше кодом я получаю вывод:
4 дня с сегодняшнего дня
20 июля этого года
18 февраля 1997 г.

РЕДАКТИРОВАТЬ::
Удалось получить часть даты со следующим изменением

timexAnnsAll.each(){it ->  
    Timex timex = it.get(TimeAnnotations.TimexAnnotation.class);  
    println timex.val + " from : $it"  
}

Теперь вывод:
2013-07-18 от : 4 дня с сегодняшнего дня
2013-07-20 от : 20 июля этого года
1997-02-18 от : 18 февраля 1997

Все, что мне нужно решить сейчас, это найти положение даты в исходной строке.


person Shiva    schedule 13.07.2013    source источник
comment
println "pos:${it.beginPosition()} $it" работает?   -  person tim_yates    schedule 14.07.2013
comment
@tim_yates, это не работает. Здесь он имеет тип edu.stanford.nlp.pipeline.Annotation. В нем нет значения смещения позиции.   -  person Shiva    schedule 14.07.2013
comment
Только что удалось заставить работать часть даты, все, что мне нужно сейчас решить, это найти положение соответствующей части даты во входной строке. Редактирование вопроса, чтобы отразить это   -  person Shiva    schedule 14.07.2013


Ответы (1)


Каждый CoreMap, возвращенный в списке из annotation.get(TimeAnnotations.TimexAnnotations.class), является Annotation, и вы можете получить другие его атрибуты, такие как список токенов, каждый из которых хранит информацию о смещении символов. Таким образом, вы можете закончить свой пример следующим образом:

List<CoreMap> timexAnnsAll = annotation.get(TimeAnnotations.TimexAnnotations.class);
for (CoreMap cm : timexAnnsAll) {
  List<CoreLabel> tokens = cm.get(CoreAnnotations.TokensAnnotation.class);
  System.out.println(cm +
          " [from char offset " +
          tokens.get(0).get(CoreAnnotations.CharacterOffsetBeginAnnotation.class) +
          " to " + tokens.get(tokens.size() -1)
          .get(CoreAnnotations.CharacterOffsetEndAnnotation.class) + ']');
  /* -- This shows printing out each token and its character offsets
  for (CoreLabel token : tokens) {
    System.out.println(token +
            ", start: " + token.get(CoreAnnotations.CharacterOffsetBeginAnnotation.class) +
            ", end: " + token.get(CoreAnnotations.CharacterOffsetEndAnnotation.class));
  }
  */
}

Тогда вывод:

4 days from today [from char offset 24 to 41]
20th july of this year [from char offset 52 to 74]
18th Feb 1997 [from char offset 92 to 105]
person Christopher Manning    schedule 14.07.2013