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
- 非g/m/t场景:
解决方案
可根据业务需求选择以下两种方案:
方案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
相关产品推荐
相关产品推荐

