如何为spaCy模型添加自定义标点并实现Matcher与nlp.explain识别
spaCy自定义标点Matcher匹配及模型打包解决方案
核心逻辑说明
你已经完成Tokenizer中缀规则配置,自定义标点可被拆分为独立token,仅需要修改spaCy的IS_PUNCT属性判定规则,即可让Matcher匹配{'IS_PUNCT': True}时识别这类字符,同时做好自定义逻辑的序列化配置即可和模型打包使用。
步骤1:修改标点属性判定逻辑
import spacy # 填入所有需要识别为标点的自定义字符 CUSTOM_PUNCT = {"*", "~", "^"} # 加载你使用的基础模型 nlp = spacy.load("zh_core_web_sm") # 保留原有标点判定逻辑 original_is_punct = nlp.vocab.lex_attr_getters["is_punct"] # 自定义判定逻辑 def custom_is_punct(string): if string in CUSTOM_PUNCT: return True return original_is_punct(string) # 替换词汇属性的判定方法 nlp.vocab.lex_attr_getters["is_punct"] = custom_is_punct
步骤2:效果验证
from spacy.matcher import Matcher # 验证token属性 doc = nlp("测试*文本^匹配~") for token in doc: print(f"字符:{token.text},是否为标点:{token.is_punct}") # 输出中*、^、~的is_punct属性均为True # 验证Matcher匹配 matcher = Matcher(nlp.vocab) pattern = [{"IS_PUNCT": True}] matcher.add("match_custom_punct", [pattern]) matches = matcher(doc) for match_id, start, end in matches: print(f"匹配到自定义标点:{doc[start:end].text}")
步骤3:自定义逻辑与模型打包
自定义的判定逻辑默认不会随模型序列化保存,可根据使用场景选择以下两种方案:
- 本地自用场景:每次调用
spacy.load加载模型后,重新运行步骤1的属性替换代码即可生效。 - 分发复用场景(spaCy 3.x+适用):
将自定义判定逻辑注册为spaCy的全局函数,配置到模型的config.cfg文件中,后续加载模型时只要注册函数在运行环境中即可自动生效,示例代码:
之后在模型的config.cfg中添加如下配置即可:from spacy.util import registry @registry.lex_attr_getters("custom_is_punct.v1") def create_custom_is_punct(): original_is_punct = spacy.lex_attrs.get_lex_attr("is_punct") def custom_is_punct(string): if string in CUSTOM_PUNCT: return True return original_is_punct(string) return custom_is_punct[nlp.vocab.lex_attr_getters] is_punct = {"@lex_attr_getters": "custom_is_punct.v1"}
内容的提问来源于stack exchange,提问作者aoa4eva
相关产品推荐
相关产品推荐

