我需要找到字符串中的日期及其位置。考虑示例字符串
“有趣的日期是从今天开始的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日
现在我需要解决的是找到原始字符串中日期的位置。
答案 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]