如何从 Python 中的原始句子中提取时间日期周期信息
How to extract time date period information from raw sentences in Python
输入:
- 适用于2016年3月27日至2016年12月31日的票务和旅行
- 有效期限门票必须在 2016 年 2 月 18 日之前出票
- 有效期票必须在2016年2月29日之前出票
- 现在的旅行日期 - 2016 年 2 月 10 日 2016 年 2 月 22 日 - 2016 年 5 月 12 日
- 出票有效期为2016年1月31日前
(注意:输入已经通过一些Python代码预处理到这个阶段,以便使用一些Python包更容易处理。)
预期输出:
- 从 2016-03-27 到 2016-12-31
- 在 2016-02-18 之前
- 在 2016-02-29 之前
- 现在 - 2016-02-10 2016-02-22 - 2016-05-12
- 在 2016-01-31 之前
我试过dateutil。但是它只能提取一个日期,对吗?即使是这种情况,介词和日期的提取也是一个问题。
我还查看了 dateparser 和 datefinder。似乎他们都使用 dateutil.
日期可以是YYYY-MM-DD、DDMMYYYY等,只要格式一致即可。
输出不必与上面的完全相同,只要它反映了准确的信息即可。
最后,感谢您的时间和想法。我也会继续努力的。
这是优秀的 dateparser
库的典型用例。只要read the docs,你应该就能做到。
经过几天的研究,我想出了以下解决提取问题的方法。
- 先认识命题再认识月份再提取
- 识别'-'然后识别月份并进行提取。
部分代码如下所示。 (需要上下文依赖的摘录)
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)
输入:
- 适用于2016年3月27日至2016年12月31日的票务和旅行
- 有效期限门票必须在 2016 年 2 月 18 日之前出票
- 有效期票必须在2016年2月29日之前出票
- 现在的旅行日期 - 2016 年 2 月 10 日 2016 年 2 月 22 日 - 2016 年 5 月 12 日
- 出票有效期为2016年1月31日前
(注意:输入已经通过一些Python代码预处理到这个阶段,以便使用一些Python包更容易处理。)
预期输出:
- 从 2016-03-27 到 2016-12-31
- 在 2016-02-18 之前
- 在 2016-02-29 之前
- 现在 - 2016-02-10 2016-02-22 - 2016-05-12
- 在 2016-01-31 之前
我试过dateutil。但是它只能提取一个日期,对吗?即使是这种情况,介词和日期的提取也是一个问题。
我还查看了 dateparser 和 datefinder。似乎他们都使用 dateutil.
日期可以是YYYY-MM-DD、DDMMYYYY等,只要格式一致即可。
输出不必与上面的完全相同,只要它反映了准确的信息即可。
最后,感谢您的时间和想法。我也会继续努力的。
这是优秀的 dateparser
库的典型用例。只要read the docs,你应该就能做到。
经过几天的研究,我想出了以下解决提取问题的方法。
- 先认识命题再认识月份再提取
- 识别'-'然后识别月份并进行提取。
部分代码如下所示。 (需要上下文依赖的摘录)
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)