2010-04-06 16 views
12

Sto cercando una libreria Java che aiuti a analizzare il testo inserito dall'utente che rappresenta un 'appuntamento' per un'applicazione di calendario. Per esempio:Analisi del linguaggio naturale di un appuntamento?

Pranzo con Mike alle 11:30 il Martedì

o

17:00 Happy hour il Venerdì

ho trovato qualche porta promettenti come https://github.com/samtingleff/jchronic e http://www.datejs.com/ che può analizzare date - ma devo anche essere in grado di estrarre il titolo dell'evento come "Lunch with Mike".

Se una tale API non esiste, sono anche interessato a qualsiasi idea sul modo migliore per affrontare il problema da una prospettiva di codifica.

+0

possibile duplicato del [data di linguaggio naturale e l'ora parser per Java] (http://stackoverflow.com/questions/1410408/natural-language-date-and-time-parser-for-java) – nawfal

risposta

0

Non riesco a pensare a qualcosa in cima alla mia testa che possa farlo secondo le vostre specifiche. Potresti provare il pacchetto Java Stanford NLP o OpenNLP. Comunque quella potrebbe essere una soluzione da masticare per quello che stai cercando di fare.

In alternativa puoi provare a analizzarlo da solo. Usa JFlex per scansionare l'input e tokenize e CUP per creare una grammatica se vuoi gestire più input.

9

L'estensione di JChronic potrebbe essere la soluzione migliore. Penso che, date le risposte a this question, è improbabile che esista una libreria pre-costruita (anche se sembra che una cosa del genere possa essere utile ... Immagino che i principali casi d'uso per analizzare le date in linguaggio naturale sarebbero essere ancora più utile se avessero la possibilità di estrarre dati aggiuntivi dalle stringhe fornite dall'utente).

Per quanto riguarda l'implementazione, probabilmente la cosa più semplice da fare è estendere JChronic, poiché supporta una parte piuttosto significativa del caso d'uso, ma più informazioni estranee su as you can see from the unit test devono essere ignorate dal framework. Fortunatamente, se si guarda allo the main class, non dovrebbe essere troppo difficile estendere/modificare/avvolgere il metodo parse() per supportare uno scanner personalizzato per un titolo di evento. (La mia preferenza sarebbe quella di avvolgere il framework piuttosto che fork e modificarlo, in quanto ciò consente di beneficiare più facilmente di eventuali miglioramenti al codice sottostante).

In definitiva, ciò che potrebbe rivelarsi il modo più diretto per farlo è generare un regex-parser che ignori la maggior parte di ciò che JChronic tenta di acquisire (e ciò significherebbe acquisire profonda familiarità con il codice sorgente di JChronic).

La chiave per implementare con successo questo, come con qualsiasi progetto di tipo NLP, è avere tanti esempi che è possibile ottenere, preferibilmente come test di unità automatizzate (in definitiva, anche se i test test duplicano la stessa funzionalità molte volte , è meglio avere più esempi che meno). Fortunatamente, dal momento che stiamo parlando di linguaggio naturale, questi casi di test dovrebbero essere particolarmente facili da ottenere, dal momento che anche gli amici non programmatori, i familiari, ecc. Dovrebbero essere in grado di fornirti "descrizioni degli eventi" (o qualsiasi altra cosa tu voglia chiamare loro). Dovrai anche concentrarti sui casi limite in cui il bit di parsing della data potrebbe interferire con il bit di parsing location/title (ad esempio in "sigur rós alle 8pm" il "at" è chiaramente parte del tempo mentre in "party" al sabato di phoebe "chiaramente non lo è).

Mi rendo conto di aver parlato un po 'di JChronic, ma ritengo che sia una scelta naturale per il tuo problema poiché copre già gran parte della "parte difficile" dell'analisi degli "appuntamenti" in lingua naturale, ovvero la confusione di il nostro linguaggio che usiamo sul tempo, ed è già implementato nella lingua che stai studiando.

2

Esistono due modi relativamente semplici per tentare di estrarre i nomi degli appuntamenti.

utilizzare una sequenza all'etichetta

Se si dispone di un set di dati con l'etichetta, si potrebbe formare un modello di sequenza, utilizzando pacchetti come CRF++ o Yamcha, per tirare fuori i titoli di nomina come "Pranzo con Mike".

utilizzare i Named Enti e regole

Se non si dispone di un set di dati con l'etichetta, probabilmente si potrebbe ottenere alcuni chilometraggio fuori di usare un named entity recognizer per contrassegnare tutte le persone, i luoghi, e le organizzazioni nel testo appuntamento . Come bonus, questo ti darà anche le date &, quindi non dovrai scrivere il tuo codice per tirarle fuori.

Con le entità denominate tutte etichettate, dovrebbe essere abbastanza semplice scrivere alcune regole per estrarre o costruire titoli per ciascun appuntamento.

Se siete alla ricerca di un tagger NER basato su Java, è possibile utilizzare quella rilasciata dai Stanford o quello distribuito con OpenNLP

Problemi correlati