最近、私はかなり「簡単な」問題に直面しています。 (文字列に保存された)文があり、この文字列に日付があるかどうかを確認する必要があるとします。課題は、日付がさまざまな形式になる可能性があることです。いくつかの例をリストに示します。
これらが1つの文字列に含まれていることは言及する価値があります。したがって、例として、次のようになります。
String s = "This event took place on 13 October 1999.";
この場合の私の質問は、この文字列に日付があることをどのように検出できるかということです。私の最初のアプローチは、「イベント」という単語を検索してから、日付をローカライズすることでした。しかし、日付の可能な形式がますます増えているため、このソリューションはあまり美しくありません。私が試した2番目の解決策は、数か月のリストを作成して検索することです。これは良い結果をもたらしましたが、日付がすべて数字で表されている場合はまだ見逃しています。
これまで試したことのない解決策の1つは、正規表現を設計して、文字列内で一致するものを見つけようとすることです。このソリューションによってパフォーマンスがどの程度低下するかはわかりません。
私がおそらく考慮すべき良い解決策は何でしょうか?以前に同様の問題に直面した人はいますか?また、どのような解決策を見つけましたか?
確かに時間がないので、面白いのは日付だけです。
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
あなたは 固有表現抽出 の後です。 Stanford NLP から始めます。 7クラスモデルには日付が含まれていますが、オンライン デモは苦労しています そして「13」を見逃しています。 :(
上記のNattyは より良い答え を与えます。
私は以前、これをprecision
とrecall
で実行しました。 [〜#〜] gate [〜#〜] とそのANNIE
プラグインが必要です。
GATE UIツールを使用して、.GAPP
を含むprocessing resources
ファイルを作成します。
抽出された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正規表現)のチェーンを使用して、不要な出力(存在する場合)をフィルタリングします。