我正在研究一个敏感数据识别(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"
标记为日期。这种情况也经常发生在地址和信用卡号上。
然后我尝试了datefinder
和dateparser.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