web-dev-qa-db-ja.com

Java)の文字列から日付を識別する方法

最近、私はかなり「簡単な」問題に直面しています。 (文字列に保存された)文があり、この文字列に日付があるかどうかを確認する必要があるとします。課題は、日付がさまざまな形式になる可能性があることです。いくつかの例をリストに示します。

  • 1956年6月12日
  • ロンドン、2014年10月21日
  • 1999年10月13日
  • 2003年1月11日

これらが1つの文字列に含まれていることは言及する価値があります。したがって、例として、次のようになります。

String s = "This event took place on 13 October 1999.";

この場合の私の質問は、この文字列に日付があることをどのように検出できるかということです。私の最初のアプローチは、「イベント」という単語を検索してから、日付をローカライズすることでした。しかし、日付の可能な形式がますます増えているため、このソリューションはあまり美しくありません。私が試した2番目の解決策は、数か月のリストを作成して検索することです。これは良い結果をもたらしましたが、日付がすべて数字で表されている場合はまだ見逃しています。

これまで試したことのない解決策の1つは、正規表現を設計して、文字列内で一致するものを見つけようとすることです。このソリューションによってパフォーマンスがどの程度低下するかはわかりません。

私がおそらく考慮すべき良い解決策は何でしょうか?以前に同様の問題に直面した人はいますか?また、どのような解決策を見つけましたか?

確かに時間がないので、面白いのは日付だけです。

19
bbakiu

natty.joestelmach.com ライブラリの使用

Nattyは、Javaで記述された自然言語の日付パーサーです。日付式が与えられると、nattyは標準の言語認識および翻訳技術を適用して、オプションの解析および構文情報を含む対応する日付のリストを作成します。

import com.joestelmach.natty.*;

List<Date> dates =new Parser().parse("Start date 11/30/2013 , end date Friday, Sept. 7, 2013").get(0).getDates();
        System.out.println(dates.get(0));
        System.out.println(dates.get(1));

//output:
//Sat Nov 30 11:14:30 BDT 2013
//Sat Sep 07 11:14:30 BDT 2013
21
NightSkyCode

あなたは 固有表現抽出 の後です。 Stanford NLP から始めます。 7クラスモデルには日付が含まれていますが、オンライン デモは苦労しています そして「13」を見逃しています。 :(

上記のNattyは より良い答え を与えます。

文字列が1つしかない場合は、前述のように正規表現を使用できます。さまざまな日付形式の式を見つける必要があります。次にいくつかの例を示します。 正規表現-日付

ドキュメントや大きなテキストの場合は、パーサーが必要になります。 字句解析 アプローチを使用できます。

いくつかの回答で述べられているように、外部ライブラリを使用するプロジェクトによっては、良い考えかもしれません。時々それはオプションではありません。

1
Jelle

私は以前、これをprecisionrecallで実行しました。 [〜#〜] gate [〜#〜] とそのANNIEプラグインが必要です。

  1. GATE UIツールを使用して、.GAPPを含むprocessing resourcesファイルを作成します。

  2. 抽出されたDateアノテーションセットを使用するには、.GAPPファイルを使用します。

ステップ2は次のように実行できます。

Corpus corpus = Factory.newCorpus("Gate Corpus");
Document gateDoc = Factory.newDocument("This event took place on 13 October 1999.");
corpus.add(gateDoc);
File pluginsHome = Gate.getPluginsHome();
File ANNIEPlugin = new File(pluginsHome, "ANNIE");
File AnnieGapp = new File(ANNIEPlugin, "Test.gapp");
AnnieController =(CorpusController) PersistenceManager.loadObjectFromFile(AnnieGapp);
AnnieController.setCorpus(corpus);
AnnieController.execute();

後で、次のように抽出された注釈を確認できます。

AnnotationSetImpl ann = (AnnotationSetImpl) gateDoc.getAnnotations();
System.out.println("Found annotations of the following types: "+ gateDoc.getAnnotations().getAllTypes());

組み込みのアノテーションセットDateを使用すると簡単に実行できると確信しています。それはまた非常に魅力的です。

アノテーションセットを拡張するには、Dateで寛大なアノテーションルールを作成します [〜#〜] jape [〜#〜] 組み込みのANNIEアノテーションDateから 'DateEnhanced'と言います「9/11」などの特定の種類の日付を含め、「DateEnhanced」アノテーションJAPE RULEのRHSでJava正規表現)のチェーンを使用して、不要な出力(存在する場合)をフィルタリングします。

0
Identity1