如何改善我的spaCy模型以具有可以识别坐标的完美精致的命名实体识别

时间:2019-07-15 09:36:52

标签: nlp annotations spacy

请不要害怕与任务相关的细节,简单地说,我使用了出色的神童训练了一种用于自定义命名实体识别的模型,但是在此无法识别坐标

“但是太阳距离反对火星的距离是7°LONG 51’24”。

如您所见,它给了我

[7°长51’24”]

但是应该是这样

[7°51’24“长] 谁能帮助我,为什么会这样?

更多细节:

我已经用正则表达式对标签进行了标注,如下所示:日期,时间,坐标...然后我使用Prodigy训练了自定义命名实体识别

https://prodi.gy/?gclid=Cj0KCQjwyLDpBRCxARIsAEENsrLs2bbv7QT-d7lq88ZHkYaxPjI9L3aR23uRQGgWOBV1spM5WGV_LrIaAv6pEALw_wcB

我首先对每个标签执行此步骤

通过此命令进行1-edit注释(例如,用于经度)

python -m prodigy ner.manual an_ner_date_time_02 en_core_web_sm AN_NER_DATE_TIME_01.jsonl  --label LONG

(由注释者)通过正则表达式编辑我的每注释数据。然后,我合并了我的数据集。下一步是通过

建立模型

2-建立模型(用于所有合并的数据)

python -m prodigy ner.batch-train data_merged_v06 en_core_web_sm --output Model_12 --n-iter 10 --eval-split 0.2 --dropout 0.2 --no-missing

问题: 关于长,我该如何更好地注释

所以现在我有一个具有以下结果的模型:

BEFORE     0.008
Correct    36
Incorrect  4438
Entities   2802
Unknown    0


#          LOSS       RIGHT      WRONG      ENTS       SKIP       ACCURACY
01         110.744    1614       163        1683       0          0.908
02         98.563     1660       107        1719       0          0.939
03         98.472     1668       96         1724       0          0.946
04         96.250     1673       93         1731       0          0.947
05         96.192     1679       80         1730       0          0.955
06         96.108     1678       71         1719       0          0.959
07         94.347     1681       67         1721       0          0.962
08         96.472     1679       66         1716       0          0.962
09         98.936     1681       57         1711       0          0.967
10         96.175     1681       57         1711       0          0.967

Correct    1681
Incorrect  57
Baseline   0.008
Accuracy   0.967

它可以为您在此处看到的数据添加注释(单击链接)

![注释文字]

https://ibb.co/rtQm5B9

![注释文字]

问题是您无法看到模型无法完美地学习坐标 7°长51’24”应该是 7°51’24”长

被错误地注释(但是在训练集中由正则表达式正确注释,但在测试集中没有由模型注释!)

您是否知道如何改善这一点?

第二个问题,如何使用ner的结果对句子进行分类?

2 个答案:

答案 0 :(得分:1)

由于您要识别的命名实体非常具体,因此坐标,形状的定义都很好,为什么不使用模式/规则(例如正则表达式)呢?

答案 1 :(得分:0)

在这里您可以看到regex可以完美注释LONG(我在regex101.com中对其进行了测试)


regex_patterns = [
                  re.compile(r"\d{1,3}\s?°\s?\d{1,2}\s?[\'|’]\s?\d{1,2}\s?[\"|”|“]\s?[A-Z][a-z.]+"   #LONG in format 
                              "|\d{1,3}\s?°\s?\d{1,2}\s?[\'|’]\s?\s?[A-Z][a-z.]+"
                              "|\d{1,3}\s?°\s?\d{1,2}\s?[\'|’]\s?\d{1,2}\s?[\"|”|“]"
                              "|\d{1,3}\s?°\s?\d{1,2}\s?[\'|’]"
                              "|\d{1,3}\s?°\s?[A-Z][a-z.]+")           
]

但是我不知道为什么在训练后会出现一些错误(错误不是问题,但是我想知道为什么它给了我一部分跨度)

您在这里时: enter image description here

喜欢 第三行:[带注释的是8 37,但是--------> 8 37双子座]是正确的 第四行中的[7带注释,但----------> 7 51 21]是正确的

另一个注释是可以的,即使对于TIME,我们也有10h 50m,看起来像长的结构(一个字以上),但这是正确的,我真的不知道出了什么问题!