【问题标题】:How to extract time date period information from raw sentences in Python如何从 Python 中的原始句子中提取时间日期段信息
【发布时间】:2017-10-17 19:49:35
【问题描述】:

输入:

  1. 2016 年 3 月 27 日至 2016 年 12 月 31 日期间的购票和旅行有效
  2. 有效期票必须在 16 年 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向我们展示您的尝试。
  • 感谢您指出原帖中的缺失部分。有一些更新。 @帕特里克
  • 我发现 datefinder 可以比 dateparser 更好地从原始句子中提取日期。但是,我在安装时遇到了错误。 link

标签: python date datetime nltk python-dateutil


【解决方案1】:

这是出色的 dateparser 库的典型用例。只需read the docs,您应该可以做到。

【讨论】:

  • 感谢您的回答。你有没有想过 dateparser 如何提取这两个日期信息,例如,'FEB 22 2016 - MAY 12 2016'。
  • 我首先尝试只解析一个日期: In: dateparser.parse('MAY 12 2016') Out: datetime.datetime(2016, 5, 12, 0, 0) 然后我尝试了两个日期但没有输出: In: dateparser.parse('FEB 22 2016 - MAY 12 2016')
【解决方案2】:

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

  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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    • 2015-10-17
    相关资源
    最近更新 更多