保存/加载匹配器,将模式作为新的管道组件



我是空间新手。现在尝试向 Matcher 添加大量模式并将其与管道集成,这样我就可以从管道加载Matcher组件并使用它,而无需重新添加大量模式。

我创建并使用下一个代码保存它:

pattern = [{"LOWER": "hello"}, {"IS_PUNCT": True}, {"LOWER": "world"}],[{"LOWER": "hello"}, {"LOWER": "world"}]
nlp = spacy.load("en_core_web_sm")
matcher = Matcher(nlp.vocab)
matcher.add("HelloWorld", None, *pattern)
nlp.add_pipe(matcher)
nlp.to_disk('mynlp')

然后我尝试加载我的组件并使用它:

from spacy.language import Language
Language.factories['Matcher'] = lambda nlp, **cfg: Matcher(nlp.vocab, **cfg)
nlp = spacy.load('mynlp')
matcher = nlp.get_pipe("Matcher")
doc = nlp("Hello, world! Hello world!", disable=["Matcher"])
matches = matcher(doc)
print(matches)
for match_id, start, end in matches:
string_id = nlp.vocab.strings[match_id] 
span = doc[start:end] 
print(match_id, string_id, start, end, span.text)

但结果是空列表。我想,这种模式没有保存。是不是我误解了什么或做错了什么?

管道组件可以像代码一样运行,因此spaCy不会尝试将它们保存到磁盘。使用此类模型的其他人将面临组件中潜在任意代码的风险。您可以通过在保存之前和加载之后检查len(matcher)来查看这一点。保存的模型中的 meta.json 有一个 Matcher 管道条目,但没有内容。

有几篇来自spaCy开发人员的帖子,例如 https://github.com/explosion/spaCy/issues/2676#issuecomment-413274806 有关如何将必要的自定义组件代码添加到将分发修改后的管道的python包中的指导。

最新更新