首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >空间-保存自定义管道

空间-保存自定义管道
EN

Stack Overflow用户
提问于 2018-07-18 22:59:06
回答 2查看 7K关注 0票数 10

我正在尝试将一个自定义PhraseMatcher()组件集成到我的nlp管道中,这样我就可以加载自定义Spacy模型,而不必在每次加载时将我的自定义组件重新添加到通用模型中。

如何加载包含自定义管道组件的Spacy模型?

我创建组件,将其添加到管道中,并使用以下方法保存它:

代码语言:javascript
复制
import requests
from spacy.lang.en import English
from spacy.matcher import PhraseMatcher
from spacy.tokens import Doc, Span, Token

class RESTCountriesComponent(object):
    name = 'countries'
    def __init__(self, nlp, label='GPE'):
        self.countries = [u'MyCountry', u'MyOtherCountry']
        self.label = nlp.vocab.strings[label]
        patterns = [nlp(c) for c in self.countries]
        self.matcher = PhraseMatcher(nlp.vocab)
        self.matcher.add('COUNTRIES', None, *patterns)        
    def __call__(self, doc):
        matches = self.matcher(doc)
        spans = []
        for _, start, end in matches:
            entity = Span(doc, start, end, label=self.label)
            spans.append(entity)
        doc.ents = list(doc.ents) + spans
        for span in spans:
            span.merge()
        return doc

nlp = English()
rest_countries = RESTCountriesComponent(nlp)
nlp.add_pipe(rest_countries)
nlp.to_disk('myNlp')

然后我尝试加载我的模型,

代码语言:javascript
复制
nlp = spacy.load('myNlp')

但是得到以下错误消息:

KeyError: U:“E002无法为‘国家’找到工厂。通常情况下,当spaCy用未内置的组件名调用nlp.create_pipe时--例如,在从模型的meta.json构建管道时。如果使用自定义组件,可以写入Language.factories['countries']或从模型元中删除它,然后通过nlp.add_pipe添加它。”

我不能仅仅将我的自定义组件添加到我的编程环境中的通用管道中。我怎么才能做我想做的事?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-19 08:51:32

当您保存模型时,spaCy将序列化所有数据,并在模型的meta.json中存储对管道的引用。例如:["ner", "countries"]。当您重新加载模型时,spaCy将检查元并通过在所谓的“工厂”中查找每个管道组件来初始化它:告诉spaCy如何构造管道组件的函数。(原因是您通常不希望您的模型在加载时存储和评估任意代码-至少在默认情况下是这样的。)

在您的例子中,spaCy试图在工厂中查找组件名'countries',但是失败了,因为它不是内置的。不过,Language.factories是一个简单的字典,因此您可以定制它并添加您自己的条目:

代码语言:javascript
复制
from spacy.language import Language
Language.factories['countries'] = lambda nlp, **cfg: RESTCountriesComponent(nlp, **cfg)

工厂是接收共享nlp对象和可选关键字参数(配置参数)的函数。然后初始化组件并返回它。如果在加载模型之前添加上述代码,则应按预期加载。

更先进的方法

如果您想要自动处理这个问题,您也可以随您的模型一起发布组件。这需要使用spacy package命令将其包装为Python包,该命令创建所有所需的Python文件。默认情况下,__init__.py只包含一个加载模型的函数--但是您也可以向它添加自定义函数,或者使用它向spaCy的工厂添加条目。

v2.1.0 (目前可以作为测试用的夜间版本 )开始,spaCy还将支持提供管道组件工厂通过Python入口点。这对于生产设置和/或如果您想要模块化您的各个组件并将它们分成它们自己的包特别有用。例如,您可以为您的国家组件及其工厂创建一个Python包,将其上传到PyPi,并对其进行单独的版本和测试。在它的setup.py中,您的包可以定义它公开的spaCy工厂以及在哪里找到它们。spaCy将能够自动检测它们--您所需要做的就是在相同的环境中安装包。您的模型包甚至可能要求组件包作为依赖项,因此在安装模型时会自动安装它。

票数 18
EN

Stack Overflow用户

发布于 2019-02-21 21:05:40

我也遇到了同样的问题,下面是我使用的步骤:

  • 1)在运行包含所有不同nlp管道组件的笔记本之后保存管道,例如nlp.to_disc('pipeline_model_name')
  • 2)使用Spacy构建包保存管道:在此目录中运行python setup.py sdist
  • 3) Pip安装创建的包
  • 4)按照上述指示将自定义组件放入包的__init__.py文件中。
  • 4)装载管道:
    • Import
    • nlp = spacy_package.load()

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51412095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档