У Apple в Newton'е был такой assistant, небольшой системный сервис, которому пишешь, например, «fax Bob», и он соображал, что нужно взять текущий документ, найти в адресной книге Боба и отправить ему этот документ по факсу. Принцип там был несложный, детали можно найти в Newton Programmer's Reference v2.0, ch. 18, Intelligent Assistant. (PDF можно найти в Google.)
Если будете сами писать, советую присмотреться к такому методу разбора CYK — это универсальный bottom-up метод разбора, начинающий с выделения токенов в строке, и затем сворачивающий их по правилам грамматики. Целиком CYK вам не потребуется, скорее всего, потому что у вас основная проблема как раз в отсутствии грамматики, но основной принцип можно использовать примерно так:
— Разбираете строку на слова
— Классифицируете каждое слово. Например, пусть «ПН» будет порядковый номер, «ДН» — день недели, «М» месяц, "?" — неопредленное слово. Ваша фраза будет "?-ПН-ДН-М-?-?-?".
— Ищете в строке паттерны (собственно, это как раз фаза свертки и получается). В данном случае паттерн «ПН-ДН-М», он у вас будет зарегистрирован для парсера дат. В другой строке у вас будет, например, «В среду по первому кино» — "?-ДН-?-ПН-?". Паттерна «ДН-?-ПН» в датах у вас не будет (вряд ли такая комбинация может обозначать дату), поэтому парсеру дат пойдет только «ДН», а «ПН» либо проигнорует, либо отдаст, например, парсеру телеканалов.
Такой подход удобен тем, что грамматика не нужна, а подходящие паттерны вы можете определить по мере обработки данных. Я как-то писал такой парсер для адресов — неплохо разбирал, грамотно различая, например, разные «St» в «St Patrick St». Хотя и не со стопроцентной точностью, попадались там двусмысленные паттерны.