【问题标题】:Add a custom component to pipeline in Spacy 3在 Spacy 3 中向管道添加自定义组件
【发布时间】:2021-03-08 10:44:54
【问题描述】:

我使用 Spacy3 训练了一个 NER 模型。我想在 NER 任务的管道中添加一个自定义组件 (add_regex_match)。目的是改进现有的 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)))\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]|1\d|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 时。如果您使用的是 Transformer,请确保安装“spacy-transformers”。如果您使用的是自定义组件,请确保您已添加装饰器 @Language.component(用于函数组件)或 @Language.factory(用于类组件)。'

我该怎么做?有没有人有经验?非常感谢您的提示。

【问题讨论】:

  • 你解决了吗?您可以尝试删除装饰线并使用: nlp.add_pipe(add_regex_entities, name="add_regex_match", after="ner")

标签: python named-entity-recognition spacy-3


【解决方案1】:

当我想使用命令行python -m spacy project run evaluate 评估保存的模型 ml_rule_regex_model 时,出现错误...

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-21
    • 2018-12-26
    • 1970-01-01
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多