在空间3的管道中添加一个自定义组件



我用Spacy3训练了一个NER模型。我想添加一个自定义组件(add_regex_match)到NER任务的管道。目的是改进现有的NER结果。

这是我要实现的代码:

import spacy
from spacy.language import Language
from spacy.tokens import Span
import re
nlp = spacy.load(r"srcSpacy3ner_spacy3_hortisemtrainingml_rule_model")
@Language.component("add_regex_match")
def add_regex_entities(doc):   
new_ents = []
label_z = "Zeit"
regex_expression_z = r"^(?:(?:31(/|-|.)(?:0?[13578]|1[02]|(?:Januar|März|Mai|Juli|August|Oktober|Dezember)))1|(?:(?:29|30)(/|-|.)(?:0?[1,3-9]|1[0-2]|(?:Januar|März|April|Mai|Juni|Juli|August|September|Oktober|November|Dezember))2))(?:(?:1[6-9]|[2-9]d)?d{2})$|^(?:29(/|-|.)(?:0?2|(?:Februar))3(?:(?:(?:1[6-9]|[2-9]d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1d|2[0-8])(/|-|.)(?:(?:0?[1-9]|(?:Januar|Februar|März|April|Mai|Juni|Juli|August|September))|(?:1[0-2]|(?:Oktober|November|Dezember)))4(?:(?:1[6-9]|[2-9]d)?d{2})$"
for match in re.finditer(regex_expression_z, doc.text):  # find match in text
start, end = match.span()  # get the matched token indices
entity = Span(doc, start, end, label=label_z)
new_ents.append(entity)

label_b = "BBCH_Stadium"
regex_expression_b = r"BBCH(s?d+)s?(/|-|(bis)?)s?(d+)?"
for match in re.finditer(regex_expression_b, doc.text):  # find match in text
start, end = match.span()  # get the matched token indices
entity = Span(doc, start, end, label=label_b)
new_ents.append(entity)
doc.ents = new_ents
return doc
nlp.add_pipe("add_regex_match", after="ner")
nlp.to_disk("./training/ml_rule_regex_model")
doc = nlp("20/03/2021 8 März 2021 BBCH 15, Fliegen, Flugbrand . Brandenburg, in Berlin, Schnecken, BBCH 13-48, BBCH 3 bis 34")
print([(ent.text, ent.label_) for ent in doc.ents])

当我想使用命令行python -m spacy project run evaluate评估保存的模型ml_rule_regex_model时,我得到了错误:'ValueError: [E002]无法为德语(de)找到'add_regex_match'的工厂。'当spaCy使用未在当前语言类上注册的自定义组件名称调用nlp.create_pipe时,通常会发生这种情况。如果您使用的是变压器,请确保安装"空间变压器"。如果您使用的是自定义组件,请确保您已经添加了装饰器@Language.component(用于函数组件)或@Language.factory(用于类组件)。

我该怎么做?有人有经验吗?非常感谢你的建议。

当我想使用命令行python -m spacy project run evaluate评估保存的模型ml_rule_regex_model时,我得到了错误…

您没有包括spacy projectproject.yml,其中定义了evaluate命令。我假设它叫spacy evaluate?如果是这样,该命令具有--code-c标志,以提供包含附加代码(如注册函数)的Python文件的路径。通过提供该文件并将其指向新的add_regex_match组件的定义,spaCy将能够解析配置文件并使用模型。

最新更新