Comment identifier une date à partir D'une chaîne de caractères en Java

récemment, je suis mis au défi par un problème assez "facile". Supposons qu'il y ait des phrases (sauvegardées dans une chaîne), et j'ai besoin de savoir s'il y a une date dans cette chaîne. Le défi est que la date peut être dans un grand nombre de formats différents. Certains exemples sont montrés dans la liste:

  • 12 juin 1956
  • Londres, 21 octobre 2014
  • 13 octobre 1999
  • 01/11/2003

il est intéressant de mentionner que ceux-ci sont contenus dans une chaîne de caractères. Ainsi, à titre d'exemple, il peut être de la forme:

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

Ma question serait dans ce cas comment puis-je détecter qu'il y a une date dans cette chaîne. Ma première approche a été de chercher le mot "événement", puis d'essayer de localiser la date. Mais avec des formats de plus en plus possibles de la date Cette solution n'est pas très belle. La deuxième solution que j'ai essayé est de créer une liste pour des mois et la recherche. Cela a eu de bons résultats, mais manque encore les cas où la date est exprimée tout en chiffre.

Une solution que je n'ai pas essayé jusqu'à maintenant est de concevoir des expressions régulières, et essayer de trouver une correspondance dans la chaîne. Pas sûr combien cette solution pourrait diminuer les performances.

Qu'est-ce qui pourrait être une bonne solution que je devrais probablement envisager? Est-ce que quelqu'un a déjà fait face à un problème semblable et quelles solutions avez-vous trouvées?

Une chose est sûre qu'il n'y a pas de temps, donc la seule partie intéressante est la date.

18
demandé sur Tunaki 2015-11-05 17:30:56

4 réponses

en utilisant le natty.joestelmach.com bibliothèque

Natty est un langage naturel date parser écrit en Java. Avec une expression de date, natty appliquera les techniques standard de reconnaissance de langue et de traduction pour produire une liste de dates correspondantes avec des informations d'analyse et de syntaxe facultatives.

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
18
répondu NightSkyCode 2015-11-05 14:40:01

Vous êtes après Reconnaissance D'Entité Nommée. Je commencerais par Stanford NLP. Le modèle 7 class inclut la date, mais le démo luttes

Natty mentionné ci-dessus donne un répondre.

3
répondu Michael Lloyd Lee mlk 2015-11-05 15:06:24

si ce N'est qu'une chaîne, vous pouvez utiliser L'Expression régulière comme vous l'avez mentionné. Devoir trouver les différentes expressions de format de date. Voici quelques exemples: expressions régulières-dates

Dans le cas où c'est un document ou un texte, vous aurez besoin d'un analyseur. Vous pouvez utiliser un analyse Lexicale approche.

selon le projet, l'utilisation d'une bibliothèque externe comme mentionné dans certaines réponses pourrait être une bonne idée. Parfois, il n'est pas une option.

1
répondu Jelle 2015-11-05 14:48:59

j'ai déjà fait ça avec good precision et recall. Vous aurez besoin GATE et son ANNIE plugin.

  1. utilisez GATE UI tool pour créer un .GAPP fichier qui contiendra votre processing resources.

  2. .GAPP le fichier à utiliser l'extrait Date ensemble d'annotation.

Étape 2 peut être fait comme suit:

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();

plus tard, vous pouvez voir les annotations extraites comme ceci:

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

je suis sûr que vous pouvez le faire facilement avec le jeu d'annotation intégré Date. Il est également très enhancable.

pour améliorer le jeu d'annotation Date créer une règle d'annotation clémente dans JAPE dire "DateEnhanced" de intégré ANNIE annotation Date pour inclure certains types de dates comme "9/11" et d'utiliser une chaîne de Java regex, R. H. S. de la "DateEnhanced' annotations JAPE RÈGLE, à filtrer certains indésirables sorties (le cas échéant).

0
répondu Identity1 2015-12-15 10:31:38