将自定义组件添加到 Spacy 3 中的管道
Add a custom component to pipeline in Spacy 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"\src\Spacy3\ner_spacy3_hortisem\training\ml_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)))|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2]|(?:Januar|März|April|Mai|Juni|Juli|August|September|Oktober|November|Dezember))))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)(?:0?2|(?:Februar))(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9]|(?:Januar|Februar|März|April|Mai|Juni|Juli|August|September))|(?:1[0-2]|(?:Oktober|November|Dezember)))(?:(?: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] 找不到 'add_regex_match' 的工厂,用于语言德语 (de)。当 spaCy 使用未在当前语言 class 上注册的自定义组件名称调用 nlp.create_pipe
时,通常会发生这种情况。如果您使用的是 Transformer,请确保安装 'spacy-transformers'。如果您使用的是自定义组件,请确保已添加装饰器 @Language.component
(对于函数组件)或 @Language.factory
(对于 class 组件)。'
我应该怎么做?有没有人有经验?非常感谢您的提示。
when I want to evaluate the saved model ml_rule_regex_model using the command line python -m spacy project run evaluate
, I got the error...
您没有包含 spacy project
的 project.yml
,其中定义了 evaluate
命令。我假设它调用 spacy evaluate
?如果是这样,该命令有一个 --code
或 -c
标志来提供一个 Python 文件的路径,其中包含附加代码,例如注册函数。通过提供此文件并将其指向新 add_regex_match
组件的定义,spaCy 将能够解析配置文件并使用模型。
我用 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"\src\Spacy3\ner_spacy3_hortisem\training\ml_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)))|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2]|(?:Januar|März|April|Mai|Juni|Juli|August|September|Oktober|November|Dezember))))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)(?:0?2|(?:Februar))(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9]|(?:Januar|Februar|März|April|Mai|Juni|Juli|August|September))|(?:1[0-2]|(?:Oktober|November|Dezember)))(?:(?: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] 找不到 'add_regex_match' 的工厂,用于语言德语 (de)。当 spaCy 使用未在当前语言 class 上注册的自定义组件名称调用 nlp.create_pipe
时,通常会发生这种情况。如果您使用的是 Transformer,请确保安装 'spacy-transformers'。如果您使用的是自定义组件,请确保已添加装饰器 @Language.component
(对于函数组件)或 @Language.factory
(对于 class 组件)。'
我应该怎么做?有没有人有经验?非常感谢您的提示。
when I want to evaluate the saved model ml_rule_regex_model using the command line
python -m spacy project run evaluate
, I got the error...
您没有包含 spacy project
的 project.yml
,其中定义了 evaluate
命令。我假设它调用 spacy evaluate
?如果是这样,该命令有一个 --code
或 -c
标志来提供一个 Python 文件的路径,其中包含附加代码,例如注册函数。通过提供此文件并将其指向新 add_regex_match
组件的定义,spaCy 将能够解析配置文件并使用模型。