如何在 Java 中从字符串中识别日期

2022-09-02 10:06:03

最近,我遇到了一个相当“简单”的问题。假设有句子(保存在字符串中),我需要找出此字符串中是否有任何日期。挑战在于日期可以采用许多不同的格式。列表中显示了一些示例:

  • 1956年6月12日
  • 伦敦,2014年10月21日
  • 13 十月 1999
  • 01/11/2003

值得一提的是,它们包含在一个字符串中。因此,作为一个例子,它可以是这样的:

String s = "This event took place on 13 October 1999.";

在这种情况下,我的问题是我如何检测到此字符串中有日期。我的第一种方法是搜索“事件”这个词,然后尝试本地化日期。但是随着日期的可能格式越来越多,这个解决方案并不是很漂亮。我尝试的第二个解决方案是创建一个几个月的列表并进行搜索。这产生了良好的结果,但仍然错过了日期全部以数字表示的情况。

到目前为止,我还没有尝试过的一种解决方案是设计正则表达式并尝试在字符串中找到匹配项。不确定此解决方案可能会降低性能的程度。

我应该考虑的好解决方案是什么?以前有人遇到过类似的问题吗?你找到了什么解决方案?

有一件事是肯定的,没有时间,所以唯一有趣的部分是日期。


答案 1

使用 natty.joestelmach.com

Natty是一个用Java编写的自然语言日期解析器。给定日期表达式,natty 将应用标准语言识别和翻译技术来生成具有可选解析和语法信息的相应日期列表。

import com.joestelmach.natty.*;

List<Date> dates =new Parser().parse("Start date 11/30/2013 , end date Friday, Sept. 7, 2013").get(0).getDates();
        System.out.println(dates.get(0));
        System.out.println(dates.get(1));

//output:
//Sat Nov 30 11:14:30 BDT 2013
//Sat Sep 07 11:14:30 BDT 2013

答案 2

您已在命名实体识别之后。我会从斯坦福NLP开始。7类模型包括日期,但在线演示挣扎并错过了“13”。:(

上面提到的Natty给出了一个更好的答案