3

文字列内の日付とその位置を見つける必要があります。例の文字列を考えてみましょう

「興味深い日付は今日から 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 日

編集::
次の変更により、日付部分を取得できました

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


2013-07-18 from : 今日から 4 日間
2013-07-20 from : 今年の 7 月 20 日1997-02-18
from : 1997 年 2 月 18 日

ここで解決する必要があるのは、元の文字列内の日付の位置を見つけることだけです。

4

1 に答える 1

4

からのリストで返される各 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]
于 2013-07-14T22:07:07.643 に答える