[英]Extracting dates using ML approach ( NER) in python using spacy
我有以下文字:
方法 1:使用regex
的基于规则的方法
text=r" this is one 2012/02/12.This is another 21-09-2021. This is third 08/09/2015 and this is final date 19870901"
import re
import pandas as pd
def extract_date_strings(text):
extracted=re.findall(r"[0-9]+[\\\-\/\_]+[0-9]+[\\\-\/\_]+[0-9]+",text)
return extracted
extracted_dates=extract_date_strings(text)
def date_formatter(date_str_list):
format_=['%Y/%m/%d','%d-%m-%Y','%d/%m/%Y']
formatted_date=[]
for _date, format_ in zip(extracted_dates,format_):
date_=pd.to_datetime(_date, format=format_)
formatted_date.append(date_)
return pd.Series(formatted_date)
date_formatter(extracted_dates)
我得到正确的结果:
0 2012-02-12
1 2021-09-21
2 2015-09-08
dtype: datetime64[ns]
现在我试过了,
方法 2:使用spacy
的基于 ML 的方法
import spacy
nlp = spacy.load('en_core_web_trf')
# nlp = spacy.load('en_core_web_lg')
doc = nlp(text)
for ent in doc.ents:
print(ent.text, ent.label_)
我得到以下结果:
another 21 DATE
- DATE
09 DATE
- DATE
2021 DATE
third ORDINAL
08/09/2015 DATE
19870901 DATE
结果与预期不符(部分成功)。 它不承认2012/02/12
。 它21-09-2021
分解为单个元素。 它成功识别08/09/2015
和19870901
。
我如何进行调整,以便 spacy 能够识别文本中的日期字符串。 也许需要一些定制。 在这里需要一些帮助。 谢谢!
我广泛地处理了这个问题,你不能直接使用 NER,它确实足够好。
我通过结合两种方法解决了这个问题:
1.使用正则表达式预处理文本(我删除了所有标点符号,所以我不会深入了解人们如何选择写他们的日期 - 我正在处理现实生活中的问题)
使用 Spacy 模式识别来检测它是否是日期格式
因为在我的情况下 01-mar-2000 也是可能的,所以我添加了一个新的 NER 类型调用月份
ruleMonths = EntityRuler( (self._nlp), overwrite_ents=True, after="ner") 表示月份:rulerMonths.add_patterns([{"label": "MONTH", "pattern": Month.lower()}] )
我希望它能帮助你并节省你的时间
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.