Анализатор даты / времени на естественном языке для .NET? [закрыто]

Кто-нибудь знает парсер даты / времени .NET, похожий на Chronic для Ruby (работает с такими вещами, как «завтра» или «3 часа ночи следующего четверга»)?

Примечание: я пишу Ruby (как я знаю о Chronic), но этот проект должен использовать .NET.

22.08.2008 22:45:10
См. Ответ о NChronic stackoverflow.com/questions/14583285/…
Michael Freidgeim 2.07.2016 13:56:49
Поскольку я не могу добавить дополнительный ответ здесь, по-видимому, я буду комментировать. Я использовал Microsoft.Recognizer.Text с большим эффектом.
starbeamrainbowlabs 24.11.2018 11:44:27
9 ОТВЕТОВ
РЕШЕНИЕ

Мы разработали именно то, что вы ищете на внутреннем проекте. Мы думаем о том, чтобы сделать это публичным, если в этом есть достаточная потребность. Взгляните на этот блог для более подробной информации: http://precisionsoftwaredesign.com/blog.php .

Не стесняйтесь связаться со мной, если вы заинтересованы: contact@precisionsoftware.us

Эта библиотека теперь является проектом SourceForge. Страница находится по адресу:

http://www.SourceForge.net/p/naturaldate

Сборка находится в разделе загрузок, а исходный код доступен в Mercurial.

11
9.06.2011 00:14:34
Вы сделали это публично в конце?
Ian Ringrose 4.03.2011 15:15:56

Я не знаю ни одного, но это звучало как крутая проблема, поэтому вот мой удар по этому (VB.NET):

Private Function ConvertDateTimeToStringRelativeToNow(ByVal d As DateTime) As String
    Dim diff As TimeSpan = DateTime.Now().Subtract(d)
    If diff.Duration.TotalMinutes < 1 Then Return "Now"

    Dim str As String
    If diff.Duration.TotalDays > 365 Then
        str = CInt(diff.Duration.TotalDays / 365).ToString() & " years"
    ElseIf diff.Duration.TotalDays > 30 Then
        str = CInt(diff.TotalDays / 30).ToString() & " months"
    ElseIf diff.Duration.TotalHours > 24 Then
        str = CInt(diff.Duration.TotalHours / 24) & " days"
    ElseIf diff.Duration.TotalMinutes > 60 Then
        str = CInt(diff.Duration.TotalMinutes / 60) & " minutes"
    Else
        str = CInt(diff.Duration.TotalMinutes).ToString() & " minutes"
    End If
    If str.StartsWith("1") Then str = str.SubString(0, str.Length - 1)
    If diff.TotalDays > 0 Then
        str &= " ago"
    Else
        str &= " from now"
    End If
    Return str
End Function

Это действительно не так сложно, как те, которые уже существуют, но я думаю, что работает хорошо. Может быть хороший метод расширения.

2
24.08.2008 01:27:34
обратный парсер? Все еще хорошая вещь, может быть полезна ..
nawfal 30.01.2014 09:56:10

@ Бертон: я думаю, что он имел в виду другой путь, по крайней мере, из примера на связанной странице:

  Chronic.parse('tomorrow')
    #=> Mon Aug 28 12:00:00 PDT 2006

  Chronic.parse('monday', :context => :past)
    #=> Mon Aug 21 12:00:00 PDT 2006

  Chronic.parse('this tuesday 5:00')
    #=> Tue Aug 29 17:00:00 PDT 2006

Я думал, что я тоже попробую, пока не понял! (хорошая реализация, хотя)

1
23.08.2008 01:53:16

Я не знаю, но есть порт Java под названием jchronic . Если ничего другого, это может стать хорошей отправной точкой для вас. Или, возможно, вы могли бы использовать полуавтоматический переводчик Java на C #, например Octopus, чтобы помочь перевести его. (Или что-то лучше, если кто-нибудь знает что-нибудь.)

Хорошо, еще один возможный путь: вы могли бы использовать хронический код с помощью IronRuby ?

5
23.08.2008 13:33:50

@Blair Conrad - Хорошие идеи! Я пытался запустить Chronic под IronRuby, но у меня были проблемы с зависимостями - я пока не знаю, готов ли он.

Я нашел проект в Codeplex ( DateTimeEnglishParser ), который пытается сделать то же самое. Это еще не относится к годам или времени, но это хорошее начало. Я немного поработал над проектом и внес патч, чтобы лучше справляться с написанными числами.

Это интересная проблема, которая определенно помогла мне лучше понять регулярные выражения, поэтому я думаю, что буду продолжать над ней работать.

4
28.08.2008 15:11:55

Ранее был похожий поток, и он дал ссылку на библиотеку в CodeProject, которая, кажется, делает то, что вы хотите: http://www.codeproject.com/KB/edit/dateparser.aspx, но, к сожалению, библиотека, кажется, написана на MFC, так что вам придется сделать из него DLL, а затем вызвать ее из вашей .NET-программы.

3
23.05.2017 11:54:28

Palmsey, у меня совсем недавно было такое же требование, поэтому я решил написать простой парсер. Это не самый хороший код, но он будет обрабатывать такие вещи, как:

«Сегодня в 2 часа дня» «Вторник в 2 часа дня - 15 июля 2010 года в 2 часа ночи» «Предыдущий год в 2 часа ночи - завтра в 14:30» «18 июля 2010 года в 14:45»

Застрял это в codeplex, поскольку возможно кто-то найдет это полезным. Проверьте это: http://timestamper.codeplex.com/

3
10.05.2009 13:12:53

Я проверил несколько фреймворков, и Python ParseDateTime работал лучше всего. Он может быть использован из .NET с использованием IronPython.

Если кто-то заинтересован в полном примере проекта, прокомментируйте ответ, и я постараюсь его создать.

РЕДАКТИРОВАТЬ

По запросу, вот простой проект, который вы можете использовать с библиотекой:

http://www.assembla.com/code/relativedateparser/subversion/nodes

Попробуйте следующий пример использования, например:

  • 25 августа 2008 г.
  • 25 августа 2008 г.
  • 25 августа 17:00
  • 5 вечера 25 августа
  • в следующую субботу
  • завтра
  • в следующий четверг в 16:00
  • в 4 часа дня
  • EOD
  • завтра эд
  • во вторник
  • EOY
  • МНВ
  • через 5 минут
  • Через 5 минут
  • 5 часов раньше
  • За 2 часа до полудня
  • 2 дня с завтрашнего дня
3
21.07.2012 11:27:28

Порт .NET для Chronic существует. См. Https://github.com/robertwilczynski/nChronic . Я создал его с некоторыми улучшениями и исправлениями ошибок здесь: https://github.com/dorony/nChronic (отправил запросы на удаление, автор до сих пор не ответил).

6
1.08.2015 09:41:49