.NET 的自然语言日期/时间分析器?[已结束]

Natural language date/time parser for .NET? [closed]

提问人:palmsey 提问时间:8/23/2008 更新时间:8/1/2015 访问量:6202

问:


我们不允许向读者、工具、软件库等寻求推荐的问题。您可以编辑问题,以便用事实和引文来回答。

6年前关闭。

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

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

.NET 日期时间 NLP

评论

0赞 Michael Freidgeim 7/2/2016
查看有关 NChronic stackoverflow.com/questions/14583285/ 的答案...
0赞 starbeamrainbowlabs 11/24/2018
由于我显然无法在这里添加其他答案,因此我将发表评论。我一直在使用 Microsoft.Recognizers.Text 效果很好。

答:

2赞 Burton 8/23/2008 #1

我不知道一个,但这听起来像是一个很酷的问题,所以这是我对它的抨击(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

它真的不像已经存在的那么复杂,但我想它工作得很好。可能是一个很好的扩展方法。

评论

0赞 nawfal 1/30/2014
反向解析器?还是一件好事,可以有用。.
1赞 Nick 8/23/2008 #2

@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

我以为我也会尝试一下,直到我意识到!(虽然实现不错)

5赞 Blair Conrad 8/23/2008 #3

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

好吧,另一个可能的途径:你能使用 IronRuby 使用慢性代码吗?

4赞 palmsey 8/28/2008 #4

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

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

这是一个有趣的问题,它确实帮助我更好地理解了正则表达式,所以我想我会继续努力。

3赞 Sanjay Sheth 1/22/2009 #5

之前有一个类似的线程,它提供了指向 CodeProject 上的一个库的链接,该库似乎可以做您想要的: http://www.codeproject.com/KB/edit/dateparser.aspx 但不幸的是,该库似乎是用 MFC 编写的,因此您必须从中创建一个 DLL,然后从 .NET 程序中调用它。

12赞 Eric 3/11/2009 #6

我们完全按照您的内部项目开发了您想要的东西。如果有足够的需要,我们正在考虑将其公之于众。查看此博客了解更多详情:http://precisionsoftwaredesign.com/blog.php

如果您有兴趣,请随时与我联系:[email protected]

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

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

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

评论

1赞 Ian Ringrose 3/4/2011
你最后公开了吗?
3赞 Owen 5/10/2009 #7

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

“今天下午2点” “2010年7月15日,星期二下午2点” “去年凌晨 2 点 - Tommorow 在 14:30” “2010年7月18日下午2:45”

把它卡在 codeplex 上,因为也许其他人会发现它很有用。一探究竟: http://timestamper.codeplex.com/

3赞 VitalyB 12/20/2011 #8

我检查了几个框架,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 天后
6赞 Doron Yaacoby 5/6/2015 #9

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