Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用spaCy训练NER时承受损失_Python_Spacy - Fatal编程技术网

Python 用spaCy训练NER时承受损失

Python 用spaCy训练NER时承受损失,python,spacy,Python,Spacy,我正在(从头开始)训练一组新的实体,并完全按照中所述进行操作,然而,我的损失正在趋于平稳,大量的历史记录也无济于事 我的数据: 9个不同实体,15000个培训数据(句子)。20个时代之后的损失: Loaded model 'en' Losses {'ner': 25461.3508122763} Losses {'ner': 17003.450728844182} Losses {'ner': 15725.198527784352} Losses {'ner': 15315.7544798397

我正在(从头开始)训练一组新的实体,并完全按照中所述进行操作,然而,我的损失正在趋于平稳,大量的历史记录也无济于事

我的数据:

9个不同实体,15000个培训数据(句子)。20个时代之后的损失:

Loaded model 'en'
Losses {'ner': 25461.3508122763}
Losses {'ner': 17003.450728844182}
Losses {'ner': 15725.198527784352}
Losses {'ner': 15315.754479839785}
Losses {'ner': 14980.468680851985}
Losses {'ner': 14716.52629194191}
Losses {'ner': 14346.623731715972}
Losses {'ner': 14463.972966984807}
Losses {'ner': 14195.106732198006}
Losses {'ner': 14058.390174787504}
Losses {'ner': 13875.850727875884}
Losses {'ner': 13859.096326599261}
Losses {'ner': 13614.887464660655}
Losses {'ner': 13512.779816124807}
Losses {'ner': 13388.69595626908}
Losses {'ner': 13496.388241585315}
Losses {'ner': 13530.602194116611}
Losses {'ner': 13245.709490846923}
Losses {'ner': 13219.483523900466}
Losses {'ner': 13189.088232180386}
问题1:

如果一句话中有多个实体,组织培训数据的最佳方式是什么?我应该将所有实体合并到一个列表中,还是最好使用单个实体进行培训

例如:

("Horses and dogs are too tall and they pretend to care about your feelings", {'entities': [(0, 6, 'ANIMAL'), (11, 15, 'ANIMAL')]})
或者最好拆分:

("Horses and dogs are too tall and they pretend to care about your feelings", {'entities': [(0, 6, 'ANIMAL')]}),

("Horses and dogs are too tall and they pretend to care about your feelings", {'entities': [(11, 15, 'ANIMAL')]})
问题2:

我是否也应该包括空句子(没有实体)


显然,模型预测的结果并不太糟糕(f1~0.7),但是我想知道微调模型的最佳实践是什么(除了在这个经过训练的模型上使用Prodigy)。spaCy和Prodigy期望不同形式的训练数据:spaCy期望一个“黄金”注释,其中每个实体都有标签。注释格式如中所述。如果您只是在训练一个NER模型,您可以简单地从字典中省略依赖项和POS键。以这种方式进行训练是有意义的:在预测时,模型需要为它看到的每个单词生成实体标签

相比之下,Prodigy可以接受仅具有单个跨度和建议的实体标签的标记示例,以及该跨度是否为实体标签实例的人工决策。这对于训练来说有点棘手,因为模型只是不知道句子中的其他单词是否是一个实体

我的直觉是,如果将一个句子中的所有实体合并到一个训练示例中(问题1),该模型将工作得更好。这为模型提供了有关句子的更多信息,并允许它了解文本中不同实体之间的关系。(例如,想想一个短语“她访问了X和Y”。如果X是一个地方,Y几乎肯定是一个地方。如果X是一个人,Y也可能是)。不过,从经验上来看,这将是一件非常容易和有趣的事情

关于问题2,包括没有实体的句子对模型应该非常有帮助

旁注:当我训练NER车型时,性能通常会在大约20个时代后趋于平稳,而F1的0.7也不算太差,所以你所发现的听起来是对的

("The new electric cars is great!", {'entities': []})