2010-04-06 5 views
12

Je suis à la recherche d'une bibliothèque Java pour aider à analyser le texte saisi par l'utilisateur qui représente un 'rendez-vous' pour une application de calendrier. Par exemple:Analyse de langage naturel d'un rendez-vous?

Déjeuner avec Mike à 11h30 le mardi

ou

17:00 Happy hour le vendredi

que j'ai trouvé quelques pistes prometteuses comme https://github.com/samtingleff/jchronic et http://www.datejs.com/ qui peuvent analyser les dates - mais je dois aussi être en mesure d'extraire le titre de l'événement comme "Déjeuner avec Mike".

Si une telle API n'existe pas, je suis également intéressée par toute réflexion sur la meilleure façon d'aborder le problème du point de vue du codage.

+0

double possible [date du langage naturel et analyseur de temps pour java] (http://stackoverflow.com/questions/1410408/latural-language-date-and-time-parser-for-java) – nawfal

Répondre

0

Je ne peux pas penser à quelque chose au sommet de ma tête qui ferait cela selon vos spécifications. Vous pouvez essayer le package Java Stanford NLP ou OpenNLP. Cependant, cela pourrait être une solution de masse à ce que vous essayez de faire.

Vous pouvez également essayer de l'analyser vous-même. Utilisez JFlex pour analyser l'entrée et tokenize et CUP pour créer une grammaire si vous voulez gérer plus d'entrée.

9

Extension JChronic peut être votre meilleur pari. Je pense, donné les réponses à this question, il est peu probable qu'une bibliothèque pré-construite pour cela existe (bien qu'il semble qu'une telle chose pourrait être utile ... Je suppose que les cas d'utilisation majeurs pour l'analyse des dates en langage naturel serait être encore plus utile s'ils avaient la possibilité d'extraire des données supplémentaires à partir de chaînes fournies par l'utilisateur). Du point de vue de l'implémentation, le plus simple est d'étendre JChronic, car il supporte une partie importante de votre cas d'utilisation, mais plus de as you can see from the unit test les informations superflues devraient déjà être ignorées par le framework. Heureusement, aussi, si vous regardez the main class, il ne devrait pas être trop difficile d'étendre/modifier/envelopper la méthode parse() pour prendre en charge un scanner personnalisé pour un titre d'événement. (Ma préférence pour ceux-ci serait d'envelopper le cadre plutôt que de le fourchette et de le modifier, car cela vous permet de bénéficier plus facilement de toute amélioration du code sous-jacent). En fin de compte, ce qui peut s'avérer le moyen le plus direct de le faire est de générer un analyseur d'expressions régulières qui ignore la majeure partie de ce que JChronic essaie de capturer (ce qui signifierait de se familiariser avec le code source de JChronic). La clé de la réussite de cette implémentation, comme pour tout projet de type PNL, est d'avoir autant d'exemples que possible, de préférence sous la forme de tests unitaires automatisés (même si les tests de test reproduisent plusieurs fois la même fonctionnalité). , il vaut mieux avoir plus d'exemples que moins). Heureusement, puisque nous parlons de langage naturel, de tels tests devraient être particulièrement faciles à obtenir, car même les amis non-programmeurs, la famille, etc. devraient être en mesure de vous fournir des «descriptions d'événements» (ou ce que vous voulez appeler leur). Vous voudrez aussi vous concentrer sur les cas où le bit d'analyse de date pourrait interférer avec le bit d'analyse de localisation/titre (par exemple dans "sigur rós at 20:00" le "at" fait clairement partie du temps alors que dans "party" au samedi de Phoebe "ce n'est clairement pas). Je sais que j'ai beaucoup parlé de JChronic, mais je pense que c'est un choix naturel pour votre problème car il couvre déjà une grande partie de la «partie difficile» de l'analyse des «rendez-vous» en langage naturel, c'est-à-dire le flou de notre langue que nous utilisons au sujet du temps, et est déjà implémentée dans la langue que vous ciblez.

2

Il existe deux manières relativement simples d'essayer d'extraire les noms de rendez-vous.

utiliser un paquet d'étiquetage Séquence

Si vous disposez d'un ensemble de données étiquetées, vous pourriez former un modèle de séquence, en utilisant des paquets comme CRF++ ou Yamcha, pour retirer les titres de rendez-vous comme « Déjeuner avec Mike ».

Utilisez des entités nommées et règles

Si vous ne disposez pas d'un ensemble de données étiqueté, vous pourriez probablement obtenir quelques milage sur l'utilisation d'un named entity recognizer pour marquer tous les gens, les lieux et les organisations dans le texte de nomination . En bonus, cela vous donnera aussi des dates, donc vous n'aurez pas besoin d'écrire votre propre code pour les retirer. Avec les entités nommées toutes étiquetées, il devrait être assez simple d'écrire des règles pour extraire ou construire des titres pour chaque rendez-vous.

Si vous êtes à la recherche d'un tagueur NER basé sur Java, vous pouvez utiliser celui publié par Stanford ou celui distribué avec OpenNLP

Questions connexes