使用stanford nlp查找日期及其在字符串中的位置

时间:2013-07-13 22:12:29

标签: groovy nlp stanford-nlp date-parsing

我需要找到字符串中的日期及其位置。考虑示例字符串

“有趣的日期是从今天开始的4天,是今年7月20日,另一个日期是1997年2月18日”

我需要输出(假设今天是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天 今年7月20日 1997年2月18日

EDIT ::
管理以获取日期部分,并进行以下更改

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

现在的输出是:
2013-07-18来自:今天起4天 2013-07-20来自:今年7月20日 1997-02-18来自:1997年2月18日

现在我需要解决的是找到原始字符串中日期的位置。

1 个答案:

答案 0 :(得分:4)

annotation.get(TimeAnnotations.TimexAnnotations.class)列表中返回的每个CoreMap都是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]