2010-04-06 12 views
12

Szukam biblioteki Java, aby pomóc w analizie tekstu wprowadzonego przez użytkownika, który reprezentuje "termin" dla aplikacji kalendarza. Na przykład:Analiza składni języka naturalnego podczas spotkania?

obiad z Mike o 11:30 we wtorek

lub

godzina siedemnasta Happy Hour w piątek

Znalazłem kilka obiecujących potencjalnych klientów jak https://github.com/samtingleff/jchronic i http://www.datejs.com/ które można analizować dat - ale muszę też móc wydobyć tytuł wydarzenia, jak "Lunch z Mike'em".

Jeśli takie API nie istnieje, jestem również zainteresowany wszelkimi myślami, jak najlepiej podejść do problemu z perspektywy kodowania.

+0

możliwe duplikat [data języka naturalnego oraz czasu parser dla Java] (http://stackoverflow.com/questions/1410408/natural-language-date-and-time-parser-for-java) – nawfal

Odpowiedz

0

Nie mogę myśleć o niczym na czele mojej głowy, która to zrobi z twoimi specyfikacjami. Możesz wypróbować pakiet Stanford NLP Java lub OpenNLP. Jednak może to być rozwiązanie młota do tego, co próbujesz zrobić.

Alternatywnie możesz spróbować przetworzyć to samodzielnie. Użyj JFlex do przeskanowania wejścia i tokenize i CUP, aby utworzyć gramatykę, jeśli chcesz obsłużyć więcej danych wejściowych.

9

Poszerzenie JChronic może być najlepszym wyborem. Myślę, że biorąc pod uwagę odpowiedzi na this question, jest mało prawdopodobne, że istnieje już wbudowana biblioteka do tego celu (choć wydaje się, że taka rzecz może być przydatna ... Zgaduję, że główne przypadki użycia do analizowania dat w języku naturalnym będą być jeszcze bardziej użytecznym, jeśli mają możliwość wyodrębnienia dodatkowych danych z łańcuchów dostarczonych przez użytkownika).

Wdrożenie, prawdopodobnie najbardziej prostą czynnością jest rozszerzenie JChronic, ponieważ obsługuje on znaczną część twojego przypadku użycia, ale więcej niż ponad as you can see from the unit test dodatkowych informacji powinno już być zignorowanych przez framework. Na szczęście, jeśli spojrzymy na the main class, nie powinno być zbyt trudno rozszerzyć/zmodyfikować/opakować metodę parse(), aby obsługiwać niestandardowy skaner dla tytułu zdarzenia. (Moje własne preferencje będą polegały na owinięciu ramek, a nie ich modyfikowaniu, ponieważ pozwala to łatwiej korzystać z wszelkich ulepszeń podstawowego kodu).

Ostatecznie, najprościej można to zrobić, generując parser-regex, który ignoruje większość tego, co JChronic próbuje przechwycić (a to oznaczałoby, że poznaje się dobrze z JChronicznym kodem źródłowym).

Kluczem do pomyślnego wdrożenia tego, podobnie jak w przypadku każdego projektu typu NLP, jest uzyskanie jak największej liczby przykładów, najlepiej jako automatycznych testów jednostkowych (ostatecznie, nawet jeśli test przypadków testowych powiela tę samą funkcję wiele razy , lepiej mieć więcej przykładów niż mniej). Na szczęście, ponieważ mówimy o języku naturalnym, takie przypadki testowe powinny być szczególnie łatwe do zdobycia, ponieważ nawet znajomi, rodzina itd., Którzy nie są programistami, powinni być w stanie dostarczyć "opisy zdarzeń" (lub cokolwiek chcesz nazwać im). Będziesz także chciał skupić się na przypadkach skrajnych, w których bit przetrawiania daty może zakłócać bitwę analizy położenia/tytułu (na przykład w "sigurosi o 8 wieczorem" "na" jest wyraźnie częścią czasu, podczas gdy w "imprezie" w sobotę fooebe "wyraźnie nie jest).

Zdaję sobie sprawę, że sporo mówiłem o JChronic, ale uważam, że jest to naturalny wybór dla twojego problemu, ponieważ obejmuje on już część "trudnej części" parsowania "spotkań" w języku naturalnym, tj. nasz język, którego używamy o czasie, i jest już zaimplementowany w języku, który celujesz.

2

Istnieją dwa stosunkowo proste sposoby na wyodrębnienie nazw terminów.

Użyj Sequence etykietą

Jeśli masz oznaczony zestaw danych, można trenować model sekwencji, przy użyciu pakietów jak CRF++ lub Yamcha, aby wyciągnąć mianowania tytuły jak „obiad z Mike”.

używać nazwanych Podmioty i Zasady

Jeśli nie masz znakowanego zestawu danych, można prawdopodobnie uzyskać jakiś przebieg z użyciem named entity recognizer oznaczyć wszystkich ludzi, miejsc i organizacji w tekście powołania . Jako bonus daje to również czasy w postaci dat &, więc nie będziesz musiał pisać własnego kodu, aby je wyciągnąć.

Wszystkie nazwane encje oznaczone jako znaczące powinny być dość proste, aby zapisać pewne reguły, aby wyodrębnić lub skonstruować tytuły dla każdego spotkania.

Jeśli szukasz Java NER Taggera można użyć jeden wydany przez Stanford lub jeden rozprowadzany z OpenNLP

Powiązane problemy