Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net NET的自然语言日期/时间解析器?_.net_Datetime_Nlp - Fatal编程技术网

.net NET的自然语言日期/时间解析器?

.net NET的自然语言日期/时间解析器?,.net,datetime,nlp,.net,Datetime,Nlp,有人知道类似于(处理“明天”或“下周四下午3点”)的.NET日期/时间解析器吗 注意:我确实写过Ruby(这是我了解慢性病的方式),但这个项目必须使用.NET。我不知道有一个,但它听起来像一个很酷的问题,所以这里是我对它的抨击(VB.NET): 私有函数ConvertDateTimeToStringRelativeToNow(ByVal d作为DateTime)作为字符串 Dim diff As TimeSpan=DateTime.Now().Subtract(d) 如果diff.Duratio

有人知道类似于(处理“明天”或“下周四下午3点”)的.NET日期/时间解析器吗


注意:我确实写过Ruby(这是我了解慢性病的方式),但这个项目必须使用.NET。

我不知道有一个,但它听起来像一个很酷的问题,所以这里是我对它的抨击(VB.NET):

私有函数ConvertDateTimeToStringRelativeToNow(ByVal d作为DateTime)作为字符串
Dim diff As TimeSpan=DateTime.Now().Subtract(d)
如果diff.Duration.TotalMinutes<1,则返回“Now”
作为字符串的Dim str
如果diff.Duration.TotalDays>365,则
str=CInt(diff.Duration.TotalDays/365).ToString()和“年”
ElseIf diff.Duration.TotalDays>30则
str=CInt(diff.TotalDays/30).ToString()和“月”
ElseIf diff.Duration.TotalHours>24小时
str=CInt(差异持续时间、总小时数/24)和“天”
ElseIf diff.Duration.TotalMinutes>60分钟
str=CInt(差异持续时间总计分钟/60)和“分钟”
其他的
str=CInt(diff.Duration.TotalMinutes).ToString()和“分钟”
如果结束
如果str.StartsWith(“1”),则str=str.SubString(0,str.Length-1)
如果差异总天数>0,则
str&=“前”
其他的
str&=“从现在开始”
如果结束
返回str
端函数

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

@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

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

我不知道,但是有一个Java端口叫做。如果没有别的,它可以为你自己提供一个很好的起点。或者你可以使用半自动的Java到C的翻译器来帮助翻译。(或者更好的,如果有人知道的话。)


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

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

我在()上找到一个项目,该项目正在尝试执行相同的操作。它还不能处理数年或时间,但这是一个好的开始。我在这个项目上做了一些工作,并提供了一个补丁来更好地处理书面数字


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

之前有一个,它提供了一个指向CodeProject上的库的链接,似乎可以满足您的需要:但不幸的是,该库似乎是用MFC编写的,因此您必须用它制作一个DLL,然后从.NET程序调用它。

我们开发的正是您在一个内部项目。如果有足够的需要,我们正在考虑将其公开。有关更多详细信息,请查看此博客:

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

此库现在是SourceForge项目。网页载于:


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

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

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


把它贴在codeplex上,也许其他人会发现它很有用。查看:

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

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

编辑

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

请尝试以下用例,例如:

  • 2008年8月25日
  • 2008年8月25日
  • 8月25日下午5点
  • 8月25日下午5点
  • 下周六
  • 明天
  • 下周四下午4点
  • 下午4点
  • 排爆药
  • 明天排爆
  • 排爆星期二
  • eoy
  • eom
  • 5分钟后
  • 5分钟后
  • 5小时前
  • 中午前2小时
  • 明天起两天

存在一个.NET端口。看见我创建了一个分支,其中有一些改进和错误修复,如下:(发送了pull请求,作者仍然没有响应)。

您最终公开了吗?反向解析器?这仍然是一件好事,可能很有用。请参阅关于NChronic的答案,因为我无法在这里添加其他答案。显然,我将对此进行评论。我一直在使用它,效果很好。
  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