2013-09-08 20 views
5

Próbuję użyć NLTK do parsowania semantycznego mówionego nawigacji poleceń takich jak „udać się do San Francisco”, „daj mi wskazówki do 123 Main Street”, itpsemantyczna parsowania z NLTK

Można to zrobić z dość prostej gramatyki CFG takich jak

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

problemem jest to, że wiąże się to non-atomowej (więcej niż jedno słowo-long) literały takich jak „idź do”, które nie wydają się NLTK należy skonfigurować dla (popraw mnie jeśli się mylę). Zadanie analizowania ma wstępne oznaczenie, a wszyscy taggerzy zawsze tagują poszczególne słowa. Tak więc, moje opcje wydają się być:

a) Zdefiniuj niestandardowy tagger, który może przypisać nie-syntaktyczne znaczniki do sekwencji słów zamiast pojedynczych słów (np. "Idź do": "COMMAND"). b) Za pomocą funkcji do zwiększenia gramatykę, na przykład, podobnie jak:

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

c) Za pomocą Chunker wyodrębnić podstruktury jak polecenie, a następnie stosuje się analizator do wyniku. Czy NLTK pozwala na kaskadowanie parowania kaskadowego?

Niektóre z tych opcji wydają się zawiłe (hacki). Czy istnieje dobry sposób?

Odpowiedz

1

Wygląda na to, że chcesz zidentyfikować imperatywy.

This odpowiedź na to pytanie wygląda i zawiera rozwiązanie podobne do twojej opcji (a), ale nieco inaczej, ponieważ pozwala znacznikowi wykonać większość pracy. (B) rzeczywiście wydaje się nieco odurzający ... ale tworzysz całkiem niestandardową aplikację, więc może działać! Zrobiłbym (c) na odwrót - parsowanie, a następnie dzielenie na kawałki w oparciu o CFG w (a).

Ogólnie jednak, jak wyjaśnia inna odpowiedź, wydaje się, że nie jest to doskonały sposób na zrobienie tego po prostu.

Możesz również chcieć spojrzeć na pattern.en. Ich

mood() funkcja próbuje zidentyfikować sparsowaną Zdanie jako orientacyjne, imperatyw, warunkowe lub subjunctive