spaCy模型from_disk加载后丢失EntityRuler添加实体问题求助
问题原因与解决方案
核心原因
当你通过nlp.add_pipe添加entity_ruler并调用add_patterns时,这些规则模式仅存储在内存中的EntityRuler实例里。spaCy 默认执行nlp.to_disk()时,只会序列化流水线的组件结构和基础配置,不会自动将你添加的规则模式写入磁盘。因此重新加载模型时,entity_ruler组件虽然存在,但内部没有任何规则,导致你之前添加的实体无法被识别。
解决方案
方案一:单独保存规则模式,加载时重新添加
这是最直接的处理方式,将规则模式单独存储为文件,加载模型后重新注入到entity_ruler中:
保存阶段代码:
import json # 保存spaCy模型到磁盘 nlp.to_disk("path/to/model") # 将规则模式单独保存为JSON文件 with open("path/to/model/patterns.json", "w", encoding="utf-8") as f: json.dump(patterns, f)
加载阶段代码:
import json # 加载保存的模型 nlp = spacy.from_disk("path/to/model") # 获取流水线中的entity_ruler组件 ruler = nlp.get_pipe("entity_ruler") # 读取规则模式并添加到组件中 with open("path/to/model/patterns.json", "r", encoding="utf-8") as f: saved_patterns = json.load(f) ruler.add_patterns(saved_patterns)
方案二:通过配置让spaCy自动管理规则模式
这种方式更符合spaCy的规范,通过修改模型配置,让entity_ruler加载时自动读取规则文件:
保存阶段代码:
import json from spacy.util import save_config # 先将规则模式保存为JSON文件 with open("path/to/model/patterns.json", "w", encoding="utf-8") as f: json.dump(patterns, f) # 修改模型配置,指定entity_ruler的规则文件路径 nlp.config["components"]["entity_ruler"]["patterns"] = "patterns.json" # 保存修改后的配置 save_config("path/to/model/config.cfg", nlp.config) # 保存模型到磁盘 nlp.to_disk("path/to/model")
加载阶段代码:
# 直接加载模型,spaCy会自动读取配置中指定的规则文件 nlp = spacy.from_disk("path/to/model")
或者你也可以在添加entity_ruler时就直接指定规则文件路径,避免后续修改配置:
import json # 先保存规则模式到文件 with open("patterns.json", "w", encoding="utf-8") as f: json.dump(patterns, f) # 加载基础模型并添加entity_ruler,同时指定规则文件 nlp = spacy.load("nl_core_news_md") ruler = nlp.add_pipe("entity_ruler", before="ner", config={"patterns": "patterns.json"}) # 保存模型 nlp.to_disk("path/to/model") # 加载时自动加载规则 nlp = spacy.from_disk("path/to/model")
内容的提问来源于stack exchange,提问作者IneG
相关产品推荐
相关产品推荐

