如何调整spaCy德语分词器拆分句尾数字后的句号?
spaCy德语分词器:拆分句尾数字与句号的解决方案
问题场景
在spaCy 3.7.4中处理德语文本时,句尾数字与句号会被合并为一个token(如123444.),但英语分词器能正确拆分为123444和.。示例代码如下:
import spacy nlp_en = spacy.blank("en") nlp_de = spacy.blank("de") text = "Die Nummer lautet 1234 123444." doc_en = nlp_en(text) doc_de = nlp_de(text) print(doc_en[-1]) # 输出: . print(doc_de[-1]) # 输出: 123444.
需求是将句尾的数字+句号拆分为两个独立token,同时保留德语模型的默认配置。
解决方案
add_special_case仅适用于固定字符串,无法匹配未知数字,因此需要修改分词器的后缀拆分规则,通过正则匹配任意数字结尾后跟句号的情况,强制拆分:
步骤1:获取并修改德语分词器的后缀规则
spaCy的分词器通过前缀、后缀、中缀规则控制拆分逻辑。我们需要添加一条新的后缀规则,匹配数字后的句号:
import spacy from spacy.lang.de import German from spacy.util import compile_suffix_regex # 初始化德语nlp对象 nlp_de = spacy.blank("de") # 获取默认后缀规则 suffixes = list(German.Defaults.suffixes) # 添加新规则:匹配数字后跟句号的情况,将句号作为独立后缀拆分 suffixes.append(r"(?<=\d)\.") # 编译新的后缀正则 nlp_de.tokenizer.suffix_search = compile_suffix_regex(suffixes).search
步骤2:测试修改后的分词效果
text = "Die Nummer lautet 1234 123444." doc_de = nlp_de(text) # 输出所有token for token in doc_de: print(token.text)
输出结果:
Die Nummer lautet 1234 123444 .
此时句尾的123444和.已被正确拆分为两个token。
说明
- 该方法保留了德语分词器的所有默认规则,仅新增针对数字+句号的拆分逻辑
- 正则
(?<=\d)\.使用正向回顾断言,确保仅匹配数字后的句号,不会影响其他场景下的句号(如句子中间的缩写)
内容的提问来源于stack exchange,提问作者Moritz
相关产品推荐
相关产品推荐

