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

如何调整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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 07:31:48