Как я могу извлечь 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/