【问题标题】:Natural language date/time parser for .NET? [closed].NET 的自然语言日期/时间解析器? [关闭]
【发布时间】:2010-09-06 15:00:22
【问题描述】:

有谁知道类似Chronic for Ruby 的 .NET 日期/时间解析器(处理“明天”或“下周四下午 3 点”之类的内容)?

注意:我确实编写过 Ruby(这就是我对 Chronic 的了解),但这个项目必须使用 .NET。

【问题讨论】:

标签: .net datetime nlp


【解决方案1】:

存在 Chronic 的 .NET 端口。见https://github.com/robertwilczynski/nChronic。我创建了一个带有一些改进和错误修复的分支,在这里:https://github.com/dorony/nChronic(已发送拉取请求,作者仍未回复)。

【讨论】:

    【解决方案2】:

    我检查了几个框架,Python 的ParseDateTime 效果最好。可以使用 IronPython 从 .NET 使用它。

    如果有人对完整的示例项目感兴趣,请评论答案,我会尝试创建一个。

    编辑

    根据要求,这是一个可以与库一起使用的简单项目:

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

    试试下面的用例,例如:

    • 2008 年 8 月 25 日
    • 2008 年 8 月 25 日
    • 8 月 25 日下午 5 点
    • 8 月 25 日下午 5 点
    • 下周六
    • 明天
    • 下周四下午 4 点
    • 下午 4 点
    • 开始
    • 明天凌晨
    • 从星期二开始
    • eoy
    • eom
    • 5 分钟内
    • 5 分钟后
    • 5 小时前
    • 中午前 2 小时
    • 从明天起2天

    【讨论】:

      【解决方案3】:

      我们开发的正是您在内部项目中寻找的东西。如果有足够的需要,我们正在考虑将其公开。请查看此博客了解更多详情:http://precisionsoftwaredesign.com/blog.php

      如果您有兴趣,请随时与我联系:contact@precisionsoftware.us

      这个库现在是一个 SourceForge 项目。页面位于:

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

      程序集位于下载部分,源代码可通过 Mercurial 获得。

      【讨论】:

      • 你最后公开了吗?
      【解决方案4】:

      Palmsey,我最近也有同样的需求,所以我继续写了一个简单的解析器。它不是最好的代码,但它会处理以下内容:

      “今天下午 2 点” “周二下午 2 点至 2010 年 7 月 15 日凌晨 2 点” “上一年凌晨 2 点 - 明天 14:30” “2010 年 7 月 18 日下午 2:45”

      把它放在 codeplex 上,也许其他人会觉得它有用。看看吧:http://timestamper.codeplex.com/

      【讨论】:

        【解决方案5】:

        之前有一个similar thread,它提供了一个指向 CodeProject 上的库的链接,该链接似乎可以满足您的需求:http://www.codeproject.com/KB/edit/dateparser.aspx 但不幸的是,该库似乎是用 MFC 编写的,因此您必须制作一个 DLL然后从你的 .NET 程序中调用它。

        【讨论】:

          【解决方案6】:

          @Blair Conrad - 好主意!我试图让 Chronic 在 IronRuby 下运行,但在依赖方面遇到了一些问题 - 我不知道它是否已经准备好。

          我在Codeplex (DateTimeEnglishParser) 上发现了一个尝试做同样事情的项目。它还不能处理几年或时间,但这是一个好的开始。我在这个项目上做了一些工作,并贡献了一个补丁来更好地处理书面数字。

          这是一个有趣的问题,肯定有助于我更好地理解正则表达式,所以我想我会继续努力。

          【讨论】:

            【解决方案7】:

            我不知道,但这听起来是一个很酷的问题,所以这是我的重头戏(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
            

            它确实不像已经存在的那样复杂,但我想它可以正常工作。可能是一个不错的扩展方法。

            【讨论】:

            • 反向解析器?还是好东西,可以有用..
            【解决方案8】:

            我不知道,但是有一个名为 jchronic 的 Java 端口。如果不出意外,它可以为您自己提供一个很好的起点。或者,也许您可​​以使用像 Octopus 这样的半自动 Java 到 C# 翻译器来帮助翻译它。 (或者更好的东西,如果有人知道的话。)

            好的,另一种可能的途径:您可以使用 IronRuby 的慢性代码吗?

            【讨论】:

              【解决方案9】:

              @Burton:我认为他的意思是相反的,至少从链接页面上的示例来看:

                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
              

              我想我也会尝试一下,直到我意识到! (不过很好的实现)

              【讨论】:

                猜你喜欢
                • 2010-11-27
                • 1970-01-01
                • 2012-07-05
                • 2010-10-10
                • 1970-01-01
                • 1970-01-01
                • 2010-12-02
                相关资源
                最近更新 更多