2013-07-13 2 views
2

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

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

мне нужен выход (Предполагается, что сегодня 2013-07-14)
2013-07-17, позиция 25
2013-07-20, позиция 56
1997-02-18, позиция 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

EDIT ::
Успели получить часть даты, со следующим изменением

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

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

+0

ли 'Println "Pos: $ {it.beginPosition()} $ это"' работа? –

+0

@tim_yates, это не работает. Здесь он имеет тип edu.stanford.nlp.pipeline.Annotation. Это не имеет никакого значения позиции смещения внутри него. – Shiva

+0

Просто удалось получить работу с датой, все, что мне нужно решить, это найти позицию совпадающей даты в строке ввода. Редактирование вопроса, чтобы отразить это – Shiva

ответ

3

Каждый 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] 
+0

tx, отлично работает. – Shiva

 Смежные вопросы

  • Нет связанных вопросов^_^