Python 如何从文本中正确提取各种日期格式
How to correctly extract various Date formats from Text in Python
我必须从 PDF 中提取所有 可用日期,然后检查合同日期。
首先,我想提取从 PDF 中提取的文本中的所有日期。现在 日期可以采用多种格式。我尝试在下面的示例中添加所有类型的日期。
我尝试使用 Datefinder Python 模块 来提取所有日期。虽然它很接近,但最初抛出 几个垃圾日期,并且也不正确匹配第一个日期 。
import datefinder
dateContent = """ Test
I want to apply for leaves August, 11, 2017 I want to apply for leaves Aug, 23, 2017 I want to apply for leaves Aug, 21, 17
I want to apply for leaves August 20 2017
I want to apply for leaves August 30th, 2017 I want to apply for leaves August 31st 17
I want to apply for leaves 8/26/2017 I want to apply for leaves 8/27/17
I want to apply for leaves 28/8/2017 I want to apply for leaves 29/8/17 I want to apply for leaves 30/08/17
I want to apply for leaves 15 Jan 17 I want to apply for leaves 14 January 17
I want to apply for leaves 13 Jan 2017
I want to apply for leaves Jan 10 17 I want to apply for leaves Jan 11 2017 I want to apply for leaves January 12 2017
"""
matches = datefinder.find_dates(dateContent)
for match in matches:
print(match)
回复:
2019-08-0500:00:00
2019-06-1100:00:00
2017-06-0500:00:00
2017-08-2300:00:00
2017-08-2100:00:00
2017-08-20 00:00:00
2017-08-30 00:00:00
2017-08-3100:00:00
2017-08-2600:00:00
2017-08-2700:00:00
2017-08-2800:00:00
2017-08-2900:00:00
2017-08-30 00:00:00
2017-01-1500:00:00
2017-01-1400:00:00
2017-01-1300:00:00
2017-01-10 00:00:00
2017-01-1100:00:00
2017-01-1200:00:00
如您所见,我有 17 个这样的 Date 对象,但我得到了 19 个。从底部检查,最后 16 个匹配正确。然后是那些初始垃圾。
一旦我正确地获得了这些日期,我就可以继续使用某种 N-Gram 模型来检查哪个日期上下文是合同信息。
任何解决问题的帮助都会很棒。
这是语料库研究。您必须检查您的数据以了解日期时间字符串的变化,并尝试为其找出您自己的自定义正则表达式。如果您使用的是自然语言资源,而不是一些 system-generated 具有不同的日期实现模式的文本,您将永远无法获得 100% 的召回率和准确率。这总是一个权衡。
我解决了这个问题。
实际上我的文本内容中存在一些编码问题。
dateContent = dateContent.replace(u'\u200b', '')
用空字符替换 \u200b 解决了这个问题。
Datefinder 模块完成查找所有不同日期格式的其余工作。
我必须从 PDF 中提取所有 可用日期,然后检查合同日期。
首先,我想提取从 PDF 中提取的文本中的所有日期。现在 日期可以采用多种格式。我尝试在下面的示例中添加所有类型的日期。
我尝试使用 Datefinder Python 模块 来提取所有日期。虽然它很接近,但最初抛出 几个垃圾日期,并且也不正确匹配第一个日期 。
import datefinder
dateContent = """ Test
I want to apply for leaves August, 11, 2017 I want to apply for leaves Aug, 23, 2017 I want to apply for leaves Aug, 21, 17
I want to apply for leaves August 20 2017
I want to apply for leaves August 30th, 2017 I want to apply for leaves August 31st 17
I want to apply for leaves 8/26/2017 I want to apply for leaves 8/27/17
I want to apply for leaves 28/8/2017 I want to apply for leaves 29/8/17 I want to apply for leaves 30/08/17
I want to apply for leaves 15 Jan 17 I want to apply for leaves 14 January 17
I want to apply for leaves 13 Jan 2017
I want to apply for leaves Jan 10 17 I want to apply for leaves Jan 11 2017 I want to apply for leaves January 12 2017
"""
matches = datefinder.find_dates(dateContent)
for match in matches:
print(match)
回复:
2019-08-0500:00:00
2019-06-1100:00:00
2017-06-0500:00:00
2017-08-2300:00:00
2017-08-2100:00:00
2017-08-20 00:00:00
2017-08-30 00:00:00
2017-08-3100:00:00
2017-08-2600:00:00
2017-08-2700:00:00
2017-08-2800:00:00
2017-08-2900:00:00
2017-08-30 00:00:00
2017-01-1500:00:00
2017-01-1400:00:00
2017-01-1300:00:00
2017-01-10 00:00:00
2017-01-1100:00:00
2017-01-1200:00:00
如您所见,我有 17 个这样的 Date 对象,但我得到了 19 个。从底部检查,最后 16 个匹配正确。然后是那些初始垃圾。 一旦我正确地获得了这些日期,我就可以继续使用某种 N-Gram 模型来检查哪个日期上下文是合同信息。
任何解决问题的帮助都会很棒。
这是语料库研究。您必须检查您的数据以了解日期时间字符串的变化,并尝试为其找出您自己的自定义正则表达式。如果您使用的是自然语言资源,而不是一些 system-generated 具有不同的日期实现模式的文本,您将永远无法获得 100% 的召回率和准确率。这总是一个权衡。
我解决了这个问题。 实际上我的文本内容中存在一些编码问题。
dateContent = dateContent.replace(u'\u200b', '')
用空字符替换 \u200b 解决了这个问题。 Datefinder 模块完成查找所有不同日期格式的其余工作。