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




language-agnostic parsing (4)

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

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

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

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

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

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


Скорее всего, это не так полезно, так как вы говорите c #, но, поскольку никто не упоминал об этом, вы можете попытаться взглянуть на превосходную и абсолютно безумную функцию strtotime php


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

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

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

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



Поиск 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 #, вы можете написать что-то на основе алгоритмов, которые они используют ...

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







time