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

2024-04-25 06:11:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我是spacy的新手。现在尝试向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)

但结果是空列表。我想,这种模式并没有保存下来。是否有我误解或做错的事情


Tags: idworlddoc管道nlpspacymatch模式
1条回答
网友
1楼 · 发布于 2024-04-25 06:11:30

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

spaCy开发人员发表了几篇文章,例如https://github.com/explosion/spaCy/issues/2676#issuecomment-413274806,其中介绍了如何将必要的自定义组件代码添加到将分发修改后的管道的python包中

相关问题 更多 >