Spacy:日期上的命名实体识别未按预期工作

问题描述

我不确定我是否完全理解 spacy 如何识别文本中的命名实体,尤其是日期。

我正在尝试在文本文档中提取教育 + 相应日期。我有这样的东西

text = 'University of A  2019 - 2020
        University of B  2016 - 2019
        College A        2013 - 2016
        College B        2008 - 2013'
doc = nlp(text)
for ent in doc.ents:
     print(ent.text,ent.label_)

哪个给我作为输出

University of A  ORG
University of B  ORG
2016 - 2019      DATE
2013 - 2016      DATE
2008 - 2013      DATE

不出所料,大学被认为是组织,我希望 spacy 不会承认大学,因为它不如大学名称那么明显。但是我不明白为什么我失去了第一次约会,但所有其他人都可以正常工作。

我尝试了另一个类似这样的文本:

1997 : any text
1998 : any text
1999 : any text
...
2018 : any text

这里可以识别除 2013 和 2018 之外的所有日期,尽管行的格式与所有其他日期相同。

有没有办法训练 spacy 更好地识别日期,或者我应该使用其他工具吗?我已经在同一程序的其他部分使用 spacy。我现在没有使用正则表达式,因为日期可以采用多种不同的格式(只有年份、年初 - 年末,有时也有几个月和几天等)

解决方法

您需要一种功能更丰富的模型类型,带有 _md_lg 后缀的 spacy 2.x 和 _trf 后缀的 spacy 3.x。

例如,您可以安装

python -m spacy download en_core_web_trf

然后,你可以使用

import spacy
nlp = spacy.load('en_core_web_trf')
text = '''University of A  2019 - 2020
         University of B  2016 - 2019
         College A        2013 - 2016
         College B        2008 - 2013'''
doc = nlp(text)
for ent in doc.ents:
    print(ent.text,ent.label_)

输出:

2019 - 2020 DATE
2016 - 2019 DATE
2013 - 2016 DATE
2008 - 2013 DATE