2010-04-06 12 views
12

Ich bin auf der Suche nach einer Java-Bibliothek, um den vom Benutzer eingegebenen Text zu analysieren, der einen 'Termin' für eine Kalenderanwendung darstellt. Zum Beispiel:Natural Language Parsing eines Termins?

Mittagessen mit Mike um 11:30 Uhr am Dienstag

oder

05.00 Happy Hour am Freitag

Ich habe einige vielversprechende Leads wie https://github.com/samtingleff/jchronic und http://www.datejs.com/ gefunden, die Daten analysieren kann - aber ich muss auch in der Lage sein, den Titel der Veranstaltung wie "Mittagessen mit Mike" zu extrahieren.

Wenn eine solche API nicht existiert, interessiert mich auch, wie man das Problem aus einer Codierperspektive am besten angehen kann.

+0

möglich Duplikat [Natural Language Datum und Uhrzeit Parser für Java] (http verteilt Freigabe verwenden /stackoverflow.com/questions/1410408/natural-sprach-date-and-time-parser-for-java) – nawfal

Antwort

0

Ich kann an nichts in meinem Kopf denken, dass dies nach Ihren Spezifikationen tun würde. Sie könnten das Stanford NLP Java-Paket oder OpenNLP ausprobieren. Allerdings könnte das eine Vorschlaghammerlösung für das sein, was Sie versuchen zu tun.

Alternativ können Sie versuchen, es selbst zu analysieren. Verwenden Sie JFlex zum Scannen der Eingabe und Tokenize und CUP zum Erstellen einer Grammatik, wenn Sie mehr Eingaben verarbeiten möchten.

9

Erweitern JChronic kann Ihre beste Wette sein. Ich denke, angesichts der Antworten auf this question ist es unwahrscheinlich, dass eine vorgefertigte Bibliothek dafür existiert (obwohl es so aussieht, als könnte so etwas nützlich sein ... Ich nehme an, dass die wichtigsten Anwendungsfälle für das Parsen von Daten natürlicher Sprache dies wären noch nützlicher sein, wenn sie zusätzliche Daten aus vom Benutzer bereitgestellten Strings extrahieren konnten.

Implementations-weise, wahrscheinlich die einfachste Sache zu tun ist, um JChronic zu erweitern, da es einen beträchtlichen Teil Ihres Anwendungsfalles unterstützt, aber mehr als as you can see from the unit test irrelevante Informationen sollten bereits vom Framework ignoriert werden. Zum Glück, auch wenn Sie the main class betrachten, sollte es nicht zu schwer sein, die parse() -Methode zu erweitern/modifizieren/umbrechen, um einen benutzerdefinierten Scanner für einen Ereignistitel zu unterstützen. (Meine eigene Präferenz von diesen würde sein, das Rahmenwerk zu umwickeln und nicht zu forkieren und es zu modifizieren, weil Sie dadurch leichter von irgendwelchen Verbesserungen des zugrunde liegenden Codes profitieren können).

Was am einfachsten ist, ist, einen Regex-Parser zu erzeugen, der das meiste ignoriert, was JChronic zu erfassen versucht (und das würde bedeuten, sich mit dem JChronic-Quellcode vertraut zu machen). Wie bei jedem NLP-Projekt müssen Sie so viele Beispiele wie möglich haben, vorzugsweise als automatisierte Komponententests (letztendlich sogar, wenn die Testfälle die gleiche Funktionalität mehrmals duplizieren) , es ist besser, mehr Beispiele zu haben als weniger). Glücklicherweise sollten solche Testfälle, da wir über natürliche Sprache sprechen, besonders leicht zu bekommen sein, da sogar Nicht-Programmierer-Freunde, Familie usw. in der Lage sein sollten, Ihnen "Ereignisbeschreibungen" (oder was auch immer Sie anrufen möchten) zur Verfügung zu stellen Sie). Sie sollten sich auch besonders auf Edge-Fälle konzentrieren, bei denen das Datum-Parsing-Bit das Ort/Titel-Parsing-Bit stören könnte (zum Beispiel in "sigur rós at 20pm" ist das "at" eindeutig Teil der Zeit, während in "party bei phoebes samstag "ist es eindeutig nicht.

Ich weiß, dass ich ziemlich viel über JChronic gesagt habe, aber ich denke, dass es eine natürliche Wahl für Ihr Problem ist, da es bereits einen Großteil des "harten Teils" der Analyse von natürlichsprachlichen "Terminen" abdeckt, dh die Unschärfe von unsere Sprache, die wir für die Zeit verwenden und die bereits in der Sprache implementiert ist, auf die Sie ausgerichtet sind.

2

Es gibt zwei relativ einfache Möglichkeiten, die Terminnamen zu extrahieren.

Verwenden Sie eine Sequenz Kennzeichnung Paket

Wenn Sie einen markierten Datensatz haben, könnten Sie ein Sequenzmodell trainieren, die Pakete wie CRF++ oder Yamcha verwenden, Termin Titel zu ziehen wie „Lunch mit Mike“.

Verwendung Named Entities und Regeln

Wenn Sie nicht über einen markierten Datensatzes haben, werden Sie wahrscheinlich einige milage aus der Verwendung eines named entity recognizer bekommen konnten alle Menschen, Orte zu markieren, und Organisationen in der Termintext . Als Bonus gibt Ihnen das auch mal & Daten, so dass Sie keinen eigenen Code schreiben müssen, um diese herauszuziehen.

Mit den benannten Entities alle beschriftet, sollte es ziemlich einfach sein, einige Regeln zu schreiben, um Titel für jeden Termin zu extrahieren oder zu konstruieren. /:

Wenn Sie sich für eine Java-basierte NER Tagger suchen, könnten Sie derjenige von Stanford oder die mit OpenNLP

Verwandte Themen