【问题标题】:Library to discover dates from text?图书馆从文本中发现日期?
【发布时间】:2013-08-14 20:50:07
【问题描述】:

我需要从字符串中提取日期。由于不是每个人在打印日期时都使用official ISO format,因此为每种可能使用的日期格式编写日期解析器是不切实际的,我需要处理尽可能多的日期格式 - 我不控制数据并且不能指望它以特定的格式出现。

这似乎是一个很久以前就已经解决的问题,但是我的 Google-fu 太弱了,无法找到解决方案。 :(

是否已经存在一个 C++ 库,如果给定一个字符串,它将返回该字符串中引用的月、日、年、小时、分钟、秒等,如果有的话?

伪代码:

string s1 = "There is an expected meteor shower this Thursday,"
            "August 15th 2013 at 4:39 AM.";
string s2 = "20130815T04:39:00";
date d1 = magicConverter(s1);
date d2 = magicConverter(s2);
assert(d1 == d2);

【问题讨论】:

  • Javascript 日期解析器非常强大...您可以看看他们在一些更流行的引擎中所做的事情

标签: c++ parsing date nlp string-parsing


【解决方案1】:

您可能会使用来自here 的代码,但您需要配置一个掩码,告诉代码使用哪种时间格式。如果你编写一个类例程,它需要一个掩码和一个字符串,让你节省时间并且能够以你喜欢的任何格式打印,你应该做好充分的准备。如果它还支持 Daynames 和 Monthnames,您必须更详细地查看。我让它在 python 中工作,模块提供了一个看起来几乎相同的功能。

更多详情:

请再次查看示例 2013-08-03。没有人也没有电脑能告诉你这个日期是八月还是四月,除了有一个告诉JJJJ-MM-DD或JJJJ-DD-MM的面具。此外,这个库可能只会告诉您标准的屏蔽时间。因此,在这种情况下,它可能会将您带到八月。但正如你所说,它可以是任何日期声明,因此它不需要遵循标准,因此它也可以表示三月。另一种可能性是从上下文中告诉您有关日期的信息(例如,通过查找增加的时间格式的列中包含所有时间格式的表(如果您仅查看一年中的每个月的一天,这也会失败) .

另一个例子...如果我问你 2013-05-04... 它属于哪个月份?你可以告诉我... 四月。我会在 5 月和 4 月 5 日回复“不,到 5 月 4 日”,反之亦然。如果你告诉我如何用两种可能的解决方案来解决这个难题,我会理解你的反对意见......请在反对试图帮助你的人之前三思。

【讨论】:

  • 这行不通。正如我在问题中提到的,我具体不知道也无法控制日期的格式。
  • 但是如果你不知道日期的格式,你的代码怎么知道呢。代码只看到字符。如果 08 或 03 是这一天,它现在甚至无法区分 2013-08-03。我认为不知道确切的格式是不可能的。但是你会很接近我的建议......
  • 实际上存在像Stanford NLP libraries 这样的Java 库可以做到这一点。不幸的是,将 Java 库集成到我的 C++ 应用程序中并不是我现在愿意继续进行的选择。我正在寻找类似于斯坦福大学的SUTime C++ 的东西。
  • @CoryKlein:没有必要在 C++ 中集成 Java 代码。我经常需要让工具协同工作。当遇到与您类似的情况时,我会围绕 SUTime 创建一个服务,该服务通过套接字接受原始句子,以发送回标记的句子。
猜你喜欢
  • 1970-01-01
  • 2022-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-05
  • 2022-07-20
  • 1970-01-01
  • 2016-01-09
相关资源
最近更新 更多