在文本中检测日期的最准确方法是什么?



我正在研究一个敏感数据识别(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"的部分。

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

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

  • 首先你可以尝试使用context. NER算法适用于完整句子。

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

calendar_year -> full_year | year
year -> 19d{,2} | 20d{,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/

您尝试过使用REGEX吗?它可以解决大多数事情,如日期和电话号码。

这里有一个小例子,这样你就可以理解

例子
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

相关内容

  • 没有找到相关文章

最新更新