Как я могу извлечь datetime из текста свободной формы?

Я пытаюсь придумать что-то в соответствии с календарями Google (или даже некоторыми сообщениями gmail), где текст свободной формы будет разобран и преобразован в определенные даты/время.

Некоторые примеры (предположим для простоты, что прямо сейчас 01 января 2013 года в 1:00):

"I should call Mom tomorrow to wish her a happy birthday" -> "tomorrow" = "2013-01-02"
"The super bowl is on Feb 3rd at 6:30pm" -> "Feb 3rd at 6:30" => "2013-02-03T06:30:00Z"
"Remind me to take out the trash on Friday" => "Friday" => "2013-01-04"

Прежде всего, я попрошу об этом - есть ли уже существующие библиотеки с открытым исходным кодом, которые это (или часть этого). Если нет, какие подходы, по вашему мнению, я должен взять?

Я имею в виду несколько разных возможностей:

  • Множество регулярных выражений, сколько я могу придумать для каждого варианта использования
  • Какая-то байесовская сеть, которая смотрит на n-граммы и классифицирует их в разных сценариях, таких как "относительная дата", "относительный день недели", "конкретная дата", "дата и время", а затем запускает ее через (возможно, больше регулярных выражений), чтобы определить фактическую дату.
  • Отправка его в поиск Google и попытка извлечь значимую информацию из результатов поиска (эта, вероятно, не реалистична)

Ответ 1

Вы можете использовать эту библиотеку: https://github.com/wanasit/chrono

Демо:

inputs = ["I should call Mom tomorrow to with her a happy birthday",
"The super bowl is on Feb 3rd at 6:30pm", "Remind me to take out the trash on Friday"];

for(var i = 0; i < inputs.length; i++) {
    var input = inputs[i];
    var parsed = chrono.parse(input);
    console.log(input + " parsed as: " + JSON.stringify(parsed.map(function(p) { return [p.text, p.startDate]; })));
}
​

Вывод:

I should call Mom tomorrow to with her a happy birthday parsed as: [["tomorrow","2012-12-31T06:30:00.000Z"]]
The super bowl is on Feb 3rd at 6:30pm parsed as: [["Feb 3rd at 6:30pm","2013-02-03T13:00:00.000Z"]]
Remind me to take out the trash on Friday parsed as: [["Friday","2013-01-04T06:30:00.000Z"]] 

http://jsfiddle.net/TXX3Z/