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

StackOverflow https://stackoverflow.com/questions/23689

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

Ладно, еще один возможный путь:не могли бы вы использовать хронический код, используя Железная Руби?

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

@Блэр Конрад - Отличные идеи!Я пытался запустить программу Chronic под управлением IronRuby, но у меня возникли некоторые проблемы с зависимостями - я не знаю, готова ли она еще.

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

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

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

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

"Сегодня в 14:00" "Вторник в 14:00 - 15 июля 2010 года в 14:00" "Предыдущий год в 14:00 - Завтра в 14:30" "18 июля 2010 года в 14:45"

Вставил это в codeplex, так как, возможно, кто-то еще найдет это полезным.Зацени это: http://timestamper.codeplex.com/

Я проверил несколько фреймворков и Python Проанализированное время сработало лучше всех.Его можно использовать из .NET с использованием IronPython.

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

Редактировать

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

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

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

  • 25 Августа 2008 года
  • 25 Августа 2008 года
  • 25 Августа, 17 часов вечера
  • 17: 00 25 августа
  • в следующую субботу
  • завтра
  • в следующий четверг в 16:00
  • в 4 часа дня
  • eod
  • завтрашний день
  • eod вторник
  • eoy
  • мнв
  • через 5 минут
  • через 5 минут
  • за 5 часов до этого момента
  • за 2 часа до полудня
  • через 2 дня после завтрашнего дня

Я не в курсе ни одного, но это звучало как классная проблема, так что вот мой подход к ней (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

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

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

  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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top