2013-09-08 10 views
5

Sto cercando di utilizzare NLTK per l'analisi semantica di navigazione parlato comandi come "andare a San Francisco", "dammi le indicazioni per 123 Main Street", eccanalisi semantica con NLTK

Ciò potrebbe essere fatto con un abbastanza semplice grammatica CFG come

S -> COMMAND LOCATION 
COMMAND -> "go to" | "give me directions to" | ... 
LOCATION -> CITY | STREET | ... 

Il problema è che si tratta di non-atomiche (più di una parola-lungo) letterali, come "andare a", che NLTK non sembra essere impostato per (correggimi se sbaglio). L'attività di analisi ha il tag come prerequisito e tutti i tagger sembrano sempre taggare singole parole. Quindi, le mie opzioni sembrano essere:

a) Definire un tagger personalizzato che può assegnare tag non sintattici alle sequenze di parole anziché a singole parole (ad es. "Vai a": "COMANDO"). b) utilizzare le funzioni per aumentare la grammatica, per esempio, qualcosa come:

COMMAND -> VB[sem='go'] P[sem='to'] | ... 

c) Usare un chunker per estrarre sottostrutture come il comando, quindi applicare un parser per il risultato. NLTK consente il chunker-> parser a cascata?

Alcune di queste opzioni sembrano contorte (hack). C'è un buon modo?

risposta

1

Sembra che vogliate identificare gli imperativi.

This risposta ha guardato in quella e contiene una soluzione simile a vostra opzione (a), ma un po 'diverso in quanto permette al tagger fare la maggior parte del lavoro. (b) sembra davvero un po 'hacky ... ma stai creando un'applicazione abbastanza personalizzata, quindi potrebbe funzionare! Vorrei fare (c) il contrario: analizzare e poi troncare in base al CFG in (a).

Complessivamente, tuttavia, come spiega l'altra risposta, non sembra essere ancora un modo perfetto per farlo ancora.

Si potrebbe anche voler guardare pattern.en. La loro

mood() funzione tenta di identificare una frase analizzato come indicativo, imperativo, condizionale o congiuntivo