【问题标题】:What is the most accurate way to detect dates in text?检测文本中日期的最准确方法是什么?
【发布时间】:2021-10-28 16:19:39
【问题描述】:

我正在处理敏感数据识别 (NER) 任务。面对我无法准确检测文本中的日期的事实。我几乎什么都试过了……

例如,我的文本中有这种类型的日期:

date_list = ['23 octbr', '08/10/1975', '2/20/1961', 'December 23', '2021', '1/10/1980', ...]

但不得不说,文中还有很多数字信息,比如IP地址、住宅地址、银行卡号等。

这是Spacy 工作原理的示例:

'08/10/1975' -> Entityt type: No Entity
'2/20/1961' -> Entityt type: DATE
'1/10/1980' -> Entityt type: CARDINAL

或者例如我有电话号码"(150) 224-2215",它Spacy"24-2215" 标记为日期。地址和信用卡号码也经常发生这种情况。

然后我尝试了datefinderdateparser.search,但他们检测到句子中完全不正确的部分或包含“to”一词的部分。

你能分享你的经验吗,有什么更好的方法?获得高精度日期检测的最佳方法是什么?

【问题讨论】:

  • 您对“最佳方式”的定义是什么?
  • @martineau,最好的准确性。也许有人在工作中有相同的任务并且有经验可以分享。
  • 在这种情况下,您可能需要以多种方式进行操作,然后从结果中进行选择。以某种方式以编程方式拒绝误报将非常有帮助。

标签: python spacy named-entity-recognition dateparser datefinder


【解决方案1】:

你的语料库包括什么,它包括完整的句子吗?

  • 首先,您可以尝试使用 context 的 spaCy NER。 NER 算法适用于完整的句子。

  • 如果您寻找更面向标记/形状的解决方案,我建议使用上下文无关解析。上下文无关语法非常适合描述日期。基本上你定义了一些语法规则,例如:

calendar_year -> full_year | year
year -> 19\d{,2} | 20\d{,2}
full_year -> day/month/year | day.month.year
day -> digit_num | two_digit_num
month -> digit_num | two_digit_num
digit_num -> 0 | 1 | 2 ... |9

Regex 在这里不是一个好主意,因为它没有“上下文”,即被解析的字符不知道之前已经解析了什么,没有记忆。上下文无关语法提供了一种结构化的方式来解析字符串并提供解析树。

这是我用 Lark 做的,日期是德语: https://duygua.github.io/blog/2018/03/28/chatbot-nlu-series-datetimeparser/

【讨论】:

  • 有时会在完整的句子中显示日期,但大多数情况下不会。例如,我有一个包含员工数据的表,列名 =“出生日期”。然后是 [25.10.1991,...] 但是当我在 python 中解析它时,它将没有上下文。
  • 感谢您的文章,我会仔细阅读。
  • 好的,快速但愚蠢的问题:) 列的名称是“出生日期”,所以所有内容都必须是日期。如果您使用 pandas 解析 CSV/excel,您也可以看到列名。列名肯定会提供一些线索。
  • 我在 .docx 文件中有这张表 :(
【解决方案2】:

您是否尝试过使用正则表达式?它可以解决大多数问题,例如日期和电话号码。

这里是一个小例子,你可以理解

示例

import re
import datetime
from datetime import date

register = "The last payment was 2021-09-21"
match = re.search(r'\d{4}-\d{2}-\d{2}', register)
date = datetime.datetime.strptime(match.group(), '%Y-%m-%d').date()
print date

输出

2021-09-21

【讨论】:

  • 是的,我当然试过了。您已经在答案中展示了所有可能选项中最简单的选项。事实是,即使我在数据中有 #### / ## / ## 格式,稍后其他文件中可能会出现不同的格式,我的程序必须检测到。
猜你喜欢
  • 2020-05-18
  • 2016-07-22
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
相关资源
最近更新 更多