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
相关产品推荐
相关产品推荐

