我正在尝试将自定义PhraseMatcher()组件集成到我的nlp管道中,这样我就可以加载自定义Spacy模型,而无需在每次加载时将自定义组件重新添加到通用模型中.
如何加载包含自定义管道组件的Spacy模型?
我创建组件,将其添加到我的管道并使用以下内容保存:
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')
Run Code Online (Sandbox Code Playgroud)
然后我尝试加载我的模型,
nlp = spacy.load('myNlp')
Run Code Online (Sandbox Code Playgroud)
但得到此错误消息:
.KeyError异常:U"[E002]无法为'国家’找到工厂这通常发生在spaCy调用
nlp.create_pipe与不是建立在一个组件名称-例如,从构建模型的meta.json管道时,如果你.使用自定义组件,您可以Language.factories['countries']在模型元中写入或删除它,然后通过它添加它nlp.add_pipe."
我不能只将我的自定义组件添加到编程环境中的通用管道中.我怎么能做我想做的事情?
Ine*_*ani 10
当您保存模型时,spaCy将序列化所有数据并在模型中存储对管道的引用meta.json.例如:["ner", "countries"].当您重新加载模型时,spaCy将检查元并通过在所谓的"工厂"中查找来初始化每个管道组件:告诉spaCy如何构建管道组件的函数.(原因是你通常不希望你的模型在你重新加载时存储和评估任意代码 - 至少在默认情况下不这样做.)
在您的情况下,spaCy正在尝试'countries'在工厂中查找组件名称并失败,因为它不是内置的.这Language.factories是一个简单的字典,所以你可以自定义它并添加你自己的条目:
from spacy.language import Language
Language.factories['countries'] = lambda nlp, **cfg: RESTCountriesComponent(nlp, **cfg)
Run Code Online (Sandbox Code Playgroud)
工厂是一个接收共享nlp对象和可选关键字参数(配置参数)的函数.然后它初始化组件并返回它.如果在加载模型之前添加上述代码,则应按预期加载.
如果您需要自动处理,您也可以随模型一起发运组件.这需要使用spacy package命令将其包装为Python包,该命令会创建所有必需的Python文件.默认情况下,__init__.py仅包含加载模型的函数 - 但您也可以向其添加自定义函数或使用它向spaCy的工厂添加条目.
截至v2.1.0(目前作为测试的夜间版本提供),spaCy还将支持通过Python入口点提供管道组件工厂.这对于生产设置特别有用,并且/或者如果您想要将各个组件模块化并将它们拆分成自己的包.例如,您可以为您的国家/地区组件及其工厂创建一个Python包,将其上传到PyPi,对其进行版本化并单独测试.在它中setup.py,您的包可以定义它公开的spaCy工厂以及在哪里找到它们.spaCy将能够自动检测它们 - 您需要做的就是在同一环境中安装软件包.您的模型包甚至可能需要将组件包作为依赖项,因此在安装模型时会自动安装它.
| 归档时间: |
|
| 查看次数: |
979 次 |
| 最近记录: |