You need to enable JavaScript to run this app. spaCy模式匹配识别CAT-XXX-XXX格式产品标识的规则配置方法
优惠活动
大模型
产品
解决方案
定价
更多

spaCy模式匹配识别CAT-XXX-XXX格式产品标识的规则配置方法

问题定位与修复方案

现有规则失效的核心原因

  • 规则属性匹配值写错:spaCy的LOWER属性返回token的小写形式,你规则里写的{"LOWER": "CAT"}、{"LOWER": "POS"}永远无法命中,实际对应token的lower值为小写的cat、pos。
  • 遗漏基础导入:代码缺少import spacy语句,运行时会直接触发NameError。
  • 分词兼容风险:当前规则基于拆分后的token序列匹配,如果后续碰到连字符串被分词器合并为单个token的场景,会直接失效。

精准匹配标准编码(对应CAT-POS-2299需求)

import spacy
from spacy.matcher import Matcher

nlp = spacy.load("en_core_web_sm")
matcher = Matcher(nlp.vocab)

# 修正后的标准结构匹配规则
matcher.add("StandardProductCode", None,
    [
        {"LOWER": "cat"},
        {"TEXT": "-"},
        {"LOWER": "pos"},
        {"TEXT": "-"},
        {"IS_DIGIT": True}
    ]
)

doc = nlp(" We have a new product CAT-POS-2299 that will be available to users soon.")
matches = matcher(doc)
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)

运行后可正常输出匹配结果:1234567890 StandardProductCode 6 11 CAT-POS-2299(具体match_id数值随spaCy版本略有差异)。

通用扩展规则(对应CAT-???-???结构需求)

不需要硬编码中间段的pos值,可通过正则适配任意3位字母/数字的中间段与尾段,同时兼容大小写:

# 移除原有标准规则,替换为通用规则
matcher.remove("StandardProductCode")

# 通用匹配任意CAT-3位字符-3位字符结构
matcher.add("GeneralProductCode", None,
    [
        {"LOWER": "cat"},
        {"TEXT": "-"},
        {"TEXT_REGEX": r"^[A-Za-z0-9]{3}$"},
        {"TEXT": "-"},
        {"TEXT_REGEX": r"^[A-Za-z0-9]{3}$"}
    ]
)

如果碰到连字符串被分词器合并为单个token的场景(例如自定义分词规则将CAT-POS-2299切为1个token),可直接匹配整个token文本,无需依赖分词拆分:

matcher.add("MergedTokenProductCode", None,
    [{"TEXT_REGEX": r"^CAT-[A-Za-z0-9]{3}-[A-Za-z0-9]{3}$"}]
)

工具选型说明

当前选用的spaCy Matcher完全适配需求,无需更换其他工具。Matcher支持token级属性匹配、正则匹配,既能实现固定结构的精准匹配,也支持灵活的通用规则扩展,不会出现全局正则常见的跨span误匹配问题。如果后续需要将匹配到的编码直接作为实体标注,可直接复用现有规则到EntityRuler,无需额外改写规则逻辑。

内容的提问来源于stack exchange,提问作者scarpacci

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.14 08:15:03