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

Spacy Tokenizer拆分数字+单位(如12M)的规则及阻止方法咨询

spaCy分词器拆分数字+单位(如6M/6G)的原因及阻止方法

拆分原因

spaCy的预训练分词器(如en_core_web_sm)会把6M/6G/6K/6T这类数字加单位的组合拆分为两个token,核心原因是:

  • 这些字母(M/G/K/T)被内置规则识别为计量/金融领域的数量级缩写(比如M=百万、K=千、T=万亿),属于独立的词类(通常被标记为NOUN或SYM)。
  • spaCy的分词器基于预定义的前缀、后缀、中缀规则拆分文本,这类大写字母会被判定为可独立成词的后缀,因此触发拆分逻辑。

阻止拆分的方法

有两种常用方案可以让这类组合保持为单个token:

方案1:添加分词特殊案例

直接指定特定字符串作为单个token,适合已知固定组合的场景:

import spacy

nlp = spacy.load("en_core_web_sm")

# 为目标组合添加分词例外
target_patterns = ["12M", "6G", "6K", "6T"]
for pattern in target_patterns:
    nlp.tokenizer.add_special_case(pattern, [{"ORTH": pattern}])

# 测试效果
doc = nlp("12M 6G 6K 6T")
for token in doc:
    print(f"{token.text} | {token.pos_}")

方案2:修改分词后缀规则

通过移除针对M/G/K/T的后缀拆分规则,实现批量阻止所有数字+这类单位的拆分,适合通用场景:

import spacy
from spacy.util import compile_suffix_regex

nlp = spacy.load("en_core_web_sm")

# 从默认后缀规则中移除匹配M/G/K/T的条目
suffixes = [s for s in nlp.Defaults.suffixes if not s.endswith(r'[MGTK]$')]
# 重新编译后缀正则并替换分词器的后缀搜索逻辑
nlp.tokenizer.suffix_search = compile_suffix_regex(suffixes).search

# 测试效果
doc = nlp("12M 6G 6K 6T 99X")  # 99X会正常拆分,因为X不在排除列表中
for token in doc:
    print(f"{token.text} | {token.pos_}")

注意:修改后缀规则会影响所有包含这些字母的后缀场景,若有其他需要保留拆分的情况,建议结合方案1做更精细的控制。

内容的提问来源于stack exchange,提问作者YJ.Li

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 09:51:17