language-agnostic - Как анализировать относительное время?




parsing time (5)

Этот вопрос является другой стороной вопроса: « Как рассчитать относительное время? ».

Учитывая некоторый вклад человека в относительное время, как вы можете его разобрать? По умолчанию вы будете отступать от DateTime.Now() , но могут быть необязательно смещены от другого DateTime .

(Предпочитаю ответы на C #)

Пример ввода:

  • "через 20 мин"
  • "5 часов назад"
  • "3h 2m"
  • "Следующая неделя"

Изменить: предположим, что мы можем определить некоторые ограничения на вход. Этот вид кода будет полезной вещью, которая должна быть доступна в Интернете.


Answers

Рубины пытались решить эту проблему парсером Chronic .

Недавно я просмотрел информативную видео презентацию о том, как автор решил решить эту проблему.


Поиск Google включает библиотеку parsedatetime (связанную с проектом Chandler ), которая предназначена именно для этого. Это открытый исходный код (Apache License) и написан на Python. Кажется, он довольно сложный - с домашней страницы:

parsedatetime может анализировать, например, следующее:

* Aug 25 5pm
* 5pm August 25
* next saturday
...
* tomorrow
* next thursday at 4pm
* at 4pm
* eod
* in 5 minutes
* 5 minutes from now
* 5 hours before now
* 2 days from tomorrow

Поскольку он реализован в чистом Python и не использует ничего интересного, есть хороший шанс, что он совместим с IronPython , поэтому вы можете использовать его с .net. Если вы хотите специально решить C #, вы можете написать что-то на основе алгоритмов, которые они используют ...

Он также поставляется с целым куском модульных тестов.


Это: http://www.codeproject.com/KB/edit/dateparser.aspx Достаточно близко к тому, что вы пытаетесь выполнить. Не самое изящное решение, но, безусловно, может сэкономить вам некоторую работу.


Это построение DSL (для конкретного домена) для обработки даты. Я не знаю, кто-то сделал это для .NET, но построение DSL довольно просто:

  1. Определите язык точно, какие формы ввода вы примете и что вы будете делать с двусмысленностями
  2. Построить грамматику для языка
  3. Постройте конечный автомат, который анализирует ваш язык в действующем AST

Вы можете сделать все это самостоятельно (например, с помощью книги Дракона ) или с помощью инструментов, как показано в этой ссылке .

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


Без использования библиотеки вы можете использовать eval - единственный раз, когда вы должны использовать. Однако безопаснее использовать библиотеку.

например...

var response = '{"result":true , "count":1}';

var parsedJSON = eval('('+response+')');

var result=parsedJSON.result;
var count=parsedJSON.count;

alert('result:'+result+' count:'+count);




language-agnostic parsing time