如何从文本中检索各种日期和时间值

时间:2015-10-13 09:07:16

标签: java date nlp gate temporal

我想从一组字符串中检索日期和其他时间实体。这可以在不解析JAVA中的日期字符串的情况下完成,因为大多数解析器处理有限范围的输入模式。但输入是一个手动输入,在这里,因此含糊不清。

输入可以是:

  

9月12日| 3月中旬| 12. 2013年9月

     

9月12日| 9月12日| 2013

     

9月13日| 12月,9月| 12月,2013年2月

我在Java中找到了许多关于查找日期的答案,但是大多数答案并没有处理如此庞大的输入模式范围。

我尝试使用SimpleDateFormat类并使用一些parse()函数来检查解析函数是否中断,这意味着它不是日期。我尝试过使用regex,但我不确定它是否适合这种情况。我还使用ClearNLP来注释日期,但它没有提供可靠的注释集。

获得这些值的最接近方法可能是使用Chain of responsibility,如下所述。是否有一个库具有一组日期模式。我可以用那个吗?

5 个答案:

答案 0 :(得分:2)

解决这个问题的一个简洁的模块化方法是使用链条, 链的每个元素都试图将输入字符串与正则表达式匹配, 如果正则表达式与输入字符串匹配,那么你可以将输入字符串转换为可以提供SimpleDateFormat以将其转换为您喜欢的数据结构(Date?或更适合您需要的不同时间表示)并返回它的东西,如果regexp与链元素不匹配,只是委托给链中的下一个元素。

链中每个元素的责任只是测试字符串的正则表达式,给出结果或者请求链的下一个元素尝试一下。

可以轻松创建和组合链,而无需更改链中每个元素的实现。

最后,结果与@KirkoR响应中的结果相同,“bit”(:D)代码更多,但采用模块化方法。 (我更喜欢try / catch的正则表达式方法)

一些参考:https://en.wikipedia.org/wiki/Chain-of-responsibility_pattern

答案 1 :(得分:1)

你可以实现对你能想到的所有模式可能性的支持,然后记录......好吧,这些都是我的模块支持的模式。然后你可以为所有其他可能性抛出一些RuntimeException

然后......以迭代的方式,您可以继续在输入数据上运行模块,并继续添加对更多日期格式的支持,直到它停止提升任何RuntimeException

如果你想让它保持相当简单,我认为这是你能做到的最好的。

答案 2 :(得分:1)

是的!我终于提取了各种日期/时间值,可以像以下一样通用:

  

三月中旬|上个月| 9/11

具体如下:

  

11/11/11 11:11:11

这最终发生的原因是来自GATEJAPE

的精彩图书馆

我在JAPE中创建了一个更宽松的注释规则,说“DateEnhanced”'包括某些类型的日期,例如" 9/11或11TH,2001年2月和#34;并在R.H.S上使用Chaining Java正则表达式。 ' DateEnhanced'注释JAPE RULE,用于过滤一些不需要的输出。

答案 3 :(得分:0)

我可以向您推荐非常好的问题实施方案,不可理解的是:http://koziolekweb.pl/2015/04/15/throw-to-taki-inny-return/

您可以使用谷歌翻译:

https://translate.google.pl/translate?sl=pl&tl=en&js=y&prev=_t&hl=en&ie=UTF-8&u=http%3A%2F%2Fkoziolekweb.pl%2F2015%2F04%2F15%2Fthrow-to-taki-inny-return&edit-text=

那里的代码看起来非常好:

private static Date convertStringToDate(String s) {                           
    if (s == null || s.trim().isEmpty()) return null;                         
    ArrayList<String> patterns = Lists.newArrayList(YYYY_MM_DD_T_HH_MM_SS_SSS,
            YYYY_MM_DD_T_HH_MM_SS                                             
            , YYYY_MM_DD_T_HH_MM                                              
            , YYYY_MM_DD);                                                    
    for (String pattern : patterns) {                                         
        try {                                                                 
            return new SimpleDateFormat(pattern).parse(s);                    
        } catch (ParseException e) {                                          
        }                                                                     
    }                                                                         
    return new Date(Long.valueOf(s));                                         
}

答案 4 :(得分:0)

    mark.util.DateParser dp = new DateParser();
    ParsePositionEx parsePosition = new ParsePositionEx(0);
    Date startDate = dp.parse("12.September.2013", parsePosition);
    System.out.println(startDate);
  

输出:Thu Sep 12 17:18:18 IST 2013

mark.util.Dateparser是DateNormalizer PR使用的库的一部分。所以在Jape文件中,我们只需要导入它。