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

How to extract time date period information from raw sentences in Python

输入:

  1. 适用于2016年3月27日至2016年12月31日的票务和旅行
  2. 有效期限门票必须在 2016 年 2 月 18 日之前出票
  3. 有效期票必须在2016年2月29日之前出票
  4. 现在的旅行日期 - 2016 年 2 月 10 日 2016 年 2 月 22 日 - 2016 年 5 月 12 日
  5. 出票有效期为2016年1月31日前

(注意:输入已经通过一些Python代码预处理到这个阶段,以便使用一些Python包更容易处理。)

预期输出:

  1. 从 2016-03-27 到 2016-12-31
  2. 在 2016-02-18 之前
  3. 在 2016-02-29 之前
  4. 现在 - 2016-02-10 2016-02-22 - 2016-05-12
  5. 在 2016-01-31 之前

我试过dateutil。但是它只能提取一个日期,对吗?即使是这种情况,介词和日期的提取也是一个问题。

我还查看了 dateparser 和 datefinder。似乎他们都使用 dateutil.

日期可以是YYYY-MM-DD、DDMMYYYY等,只要格式一致即可。

输出不必与上面的完全相同,只要它反映了准确的信息即可。

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

这是优秀的 dateparser 库的典型用例。只要read the docs,你应该就能做到。

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

  1. 先认识命题再认识月份再提取
  2. 识别'-'然后识别月份并进行提取。

部分代码如下所示。 (需要上下文依赖的摘录)

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)