我有以下文字:
方法 1:使用正则表达式
的基于规则的方法
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 模式识别来检测是否为日期格式
因为就我而言,2000 年 3 月 1 日也有可能我添加了一个新的 NER 输入调用月份
rulerMonths = EntityRuler( (self._nlp), overwrite_ents=True, after="ner") 以月为单位的月份: RulerMonths.add_patterns([{"label": "MONTH", "pattern": Month.lower()}])
希望对您有所帮助并节省您的时间
关于python - 使用spacy在python中使用ML方法(NER)提取日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70285947/