繁体   English   中英

使用 spacy 在 python 中使用 ML 方法 (NER) 提取日期

[英]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/201519870901

我如何进行调整,以便 spacy 能够识别文本中的日期字符串。 也许需要一些定制。 在这里需要一些帮助。 谢谢!

我广泛地处理了这个问题,你不能直接使用 NER,它确实足够好。

我通过结合两种方法解决了这个问题:

1.使用正则表达式预处理文本(我删除了所有标点符号,所以我不会深入了解人们如何选择写他们的日期 - 我正在处理现实生活中的问题)

  1. 使用 Spacy 模式识别来检测它是否是日期格式

  2. 因为在我的情况下 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM