0

我正在处理敏感数据识别 (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"为日期。它也经常发生在地址和信用卡号码上。

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

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

4

2 回答 2

2

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

  • 首先,您可以尝试使用带有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

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

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

于 2021-10-28T20:06:33.317 回答
0

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

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

例子

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
于 2021-10-28T17:41:35.420 回答