如何从Python中的原始句子中提取时间日期信息

时间:2017-05-18 06:34:45

标签: python date datetime nltk python-dateutil

输入:

  1. 适用于2016年3月27日至2016年12月31日期间的票务和旅行
  2. 有效期票必须在18月18日之前签发
  3. 有效期票必须在2016年2月29日之前签发
  4. 现在旅行日期 - 2016年2月10日2016年2月22日 - 2016年5月12日
  5. 2016年1月31日之前的票务有效期
  6. (注意:输入已经被一些Python代码预处理到这个阶段,因此使用一些Python包更容易处理。)

    预期产出:

    1. 2016-03-27至2016-12-31
    2. on 2016-02-18之前
    3. on 2016-02-29之前
    4. now - 2016-02-10 2016-02-22 - 2016-05-12
    5. on 2016-01-31之前
    6. 我尝试过dateutil。但它只能提取一个日期,对吗?即使在这种情况下,介词和日期的提取也是一个问题。

      我还查看了dateparser和datefinder。看起来他们都使用dateutil。

      日期可以是YYYY-MM-DD,DDMMYYYY等,只要格式相同。

      输出不必与上述输出相同,只要它反映准确的信息。

      最后,感谢您的时间和想法。我也会继续努力。

2 个答案:

答案 0 :(得分:2)

这是优秀dateparser库的典型用例。只需read the docs,你就可以做到。

答案 1 :(得分:2)

经过几天的研究,我提出了以下解决提取问题的方法。

  1. 认识这些命题,然后识别几个月并进行提取。
  2. 识别' - ',然后识别几个月并进行提取。
  3. 部分代码如下所示。 (在上下文中需要依赖的摘录)

    new_w = new_s.split()
    for j in range(len(new_w)):
        if new_w[j] in prepositions and (new_w[j+1].isdecimal() or new_w[j+1].lower() in months):
            # Process case like "Starting from Mar27, 2016 to Dec31, 2016"
            if j+7 in range(len(new_w)) and new_w[j+4] in prepositions:
                if new_w[j+5].isdecimal() or new_w[j+5].lower() in months:
                    u = ' '.join(new_w[j:j+8])
                    print(label_class[i] + ': ' + u)
                    break
            # Process case like "Ticket must be issued on/before 29FEB, 2016"
            elif new_w[j-1] in prepositions:
                u = ' '.join(new_w[j-1:j+4])
                print(label_class[i] + ': ' + u)
                break
            # Process case like "Ticketing valid until 18FEB16"
            else:
                u = ' '.join(new_w[j:j+4])
                print(label_class[i] + ': ' + u)
                break
        # Process case like "TICKETING PERIOD:      NOW - FEB 02, 2016"
        # Process case like "TRAVELING DATES:      NOW - FEB 10,2016    FEB 22,2016 - MAY 12,2016"
        if new_w[j] in ['-'] and (new_w[j+1].lower() in months or new_w[j+2].lower() in months):
            if new_w[j-1].lower() == 'now':
                u = released_date + ' - ' + ' '.join(new_w[j+1:j+4])
                print(label_class[i] + ': ' + u)
            elif new_w[j-3].lower() in months or new_w[j-2].lower() in months:
                u = ' '.join(new_w[j-3:j+4])
                print(label_class[i] + ': ' + u)