Python 3.x 培训Spacy NER模型时,我遇到了一个例外情况:“我的;[E022]找不到名为';B公司';在NER模型中。”;

Python 3.x 培训Spacy NER模型时,我遇到了一个例外情况:“我的;[E022]找不到名为';B公司';在NER模型中。”;,python-3.x,spacy,ner,Python 3.x,Spacy,Ner,对于可复制的示例,我将提供玩具数据和代码: 培训数据如下(19条记录): 代码如下: def train_model(to_train_ents, nlp): optimizer = nlp.begin_training() other_pipes = [pipe for pipe in nlp.pipe_names if pipe != 'ner'] with nlp.disable_pipes(*other_pipes): for itn in

对于可复制的示例,我将提供玩具数据和代码:

培训数据如下(19条记录):

代码如下:

def train_model(to_train_ents, nlp):

    optimizer = nlp.begin_training()

    other_pipes = [pipe for pipe in nlp.pipe_names if pipe != 'ner']

    with nlp.disable_pipes(*other_pipes):

        for itn in range(20):

            losses = {}

            random.shuffle(to_train_ents)

            for item in to_train_ents:

                nlp.update([item[0]], 

                          [item[1]],

                          sgd = optimizer,

                        drop = 0.35,

                          losses = losses)


    return(nlp, losses)
我使用希腊Spacy模型(md),该模型安装并加载了以下代码:

!python -m spacy download el_core_news_md
nlp_el = spacy.load('el_core_news_md')
然后调用前面定义的函数train_model(),得到以下错误:

nlp_el , losses = train_model(to_train_ents, nlp_el)
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-484-a059cf596651> in <module>
----> 1 nlp_el , losses = train_model(to_train_ents, nlp_el)

<ipython-input-471-56fdae8ff98f> in train_model(to_train_ents, nlp)
     23                         drop = 0.35,
     24 
---> 25                           losses = losses)
     26 
     27 

~\AppData\Roaming\Python\Python36\site-packages\spacy\language.py in update(self, docs, golds, drop, sgd, losses, component_cfg)
    450             kwargs = component_cfg.get(name, {})
    451             kwargs.setdefault("drop", drop)
--> 452             proc.update(docs, golds, sgd=get_grads, losses=losses, **kwargs)
    453             for key, (W, dW) in grads.items():
    454                 sgd(W, dW, key=key)

nn_parser.pyx in spacy.syntax.nn_parser.Parser.update()

nn_parser.pyx in spacy.syntax.nn_parser.Parser._init_gold_batch()

ner.pyx in spacy.syntax.ner.BiluoPushDown.preprocess_gold()

ner.pyx in spacy.syntax.ner.BiluoPushDown.lookup_transition()

KeyError: "[E022] Could not find a transition with the name 'B-COMPANY' in the NER model."
nlp\U el,损耗=列车模型(至列车,nlp\U el)
---------------------------------------------------------------------------
KeyError回溯(最近一次呼叫最后一次)
在里面
---->1 nlp\U el,损耗=列车模型(至列车,nlp\U el)
列车内模型(至列车,nlp)
23下降=0.35,
24
--->25损失=损失)
26
27
更新中的~\AppData\Roaming\Python\Python36\site packages\spacy\language.py(self、docs、gold、drop、sgd、loss、component\u cfg)
450 kwargs=component_cfg.get(名称,{})
451 kwargs.setdefault(“下降”,下降)
-->452过程更新(单据、黄金、新加坡元=获得学位、损失=损失,**kwargs)
453对于渐变项()中的键(W,dW):
454新加坡元(宽,宽,键=键)
spacy.syntax.nn_parser.parser.update()中的nn_parser.pyx
spacy.syntax.nn\u parser.parser.\u init\u gold\u batch()中的nn\u parser.pyx
spacy.syntax.ner.BiluoPushDown.preprocess_gold()中的ner.pyx
spacy.syntax.ner.BiluoPushDown.lookup_transition()中的ner.pyx
KeyError:“[E022]在NER模型中找不到名为“B公司”的转换。”

您如何解释错误以及我如何纠正错误?

需要将公司
添加到NER模型中:

ner = nlp.get_pipe("ner")
ner.add_label("COMPANY")
您需要对数据中尚未在的标签集中的每个实体类型执行此操作(对于2.2.5,这是:事件、GPE、LOC、组织、人员、产品)


此外,您还可以在每次迭代中重新定义损失。相反,您可能希望在每个循环中打印/存储它,以便检查损失曲线。

需要将公司添加到NER模型中:

ner = nlp.get_pipe("ner")
ner.add_label("COMPANY")
您需要对数据中尚未在的标签集中的每个实体类型执行此操作(对于2.2.5,这是:事件、GPE、LOC、组织、人员、产品)


此外,您还可以在每次迭代中重新定义损失。相反,您可能希望在每个循环中打印/存储它,以便检查损失曲线。

您是否使用
NER将
COMPANY
作为标签添加到NER模型中。添加标签(“COMPANY”)
?我不认为这是经过训练的希腊模特的通用标签方案。谢谢你,苏菲。在您看来,您能否提供补充我的代码所需的几行代码?就像我的代码一样,没有定义“ner”对象。对!你可以为每个你想让ner训练的新标签做
ner=nlp。获取管道(“ner”)
,然后执行
add\u label
功能。谢谢你,索菲。成功了。但是我在
损失中得到了一个值。例如:
{'ner':487.23682813020423}
。既然我有20次迭代,难道我不应该得到20个值吗?我已经添加了我的注释作为正确的答案,因为这将有助于其他人以后阅读这个问题。您是否使用
NER将
COMPANY
作为标签添加到NER模型中。添加标签(“COMPANY”)
?我不认为这是经过训练的希腊模特的通用标签方案。谢谢你,苏菲。在您看来,您能否提供补充我的代码所需的几行代码?就像我的代码一样,没有定义“ner”对象。对!你可以为每个你想让ner训练的新标签做
ner=nlp。获取管道(“ner”)
,然后执行
add\u label
功能。谢谢你,索菲。成功了。但是我在
损失中得到了一个值。例如:
{'ner':487.23682813020423}
。既然我有20次迭代,难道我不应该得到20个值吗?我已经添加了我的评论作为正确的答案,因为这将有助于其他人以后阅读这个问题。