You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spacy 3.1.3使用正则匹配数字出现异常结果技术问询

问题原因
  • 该异常由spaCy英文分词器的默认规则导致:g/m/t是常用公制单位缩写(对应克、米、吨),当数字后紧跟这三个字母时,分词器会自动将其切分为两个独立token:数字为一个token,单位字母为另一个token;其余字母没有对应的单位切分规则,因此2a~2z除这三个场景外,都作为单个完整token处理。
  • 你定义的匹配规则为[{"TEXT": {"REGEX": "\d"}}],作用是匹配所有文本内容包含数字的单个token:
    • 非g/m/t场景:2x是单个token,包含数字,因此匹配返回完整的2x
    • g/m/t场景:切分后第一个token是2(包含数字,匹配成功),第二个token是g/m/t(无数字,不匹配),因此最终返回结果只有2
解决方案

可根据业务需求选择以下两种方案:

方案1:调整匹配规则,兼容两种分词场景

无需修改默认分词逻辑,仅调整匹配规则,同时支持「单token含数字+字母」和「数字token后接单字母token」两种情况:

# OP: ? 表示后面的单字母token可选,兼容所有场景
pattern = [
    {"TEXT": {"REGEX": r"\d"}},
    {"TEXT": {"REGEX": r"^[a-z]$"}, "OP": "?"}
]

调整后匹配到的span会自动合并连续的符合条件的token,返回2g/2m/2t的完整结果。

方案2:移除单位切分规则,统一分词逻辑

如果全链路业务都不需要将数字和单位拆分为独立token,可以直接删除分词器对应的单位切分规则:

nlp = English()
# 清理g/m/t对应的切分规则
to_remove = [key for key in nlp.tokenizer.rules if key.lower() in ('g', 'm', 't')]
for key in to_remove:
    del nlp.tokenizer.rules[key]

修改后运行原代码,2g/2m/2t都会作为单个token处理,匹配结果符合预期。

补充注意:Python正则字符串建议前缀加r,避免转义字符被错误解析,原代码中的"\d"建议改为r"\d"。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:06:03