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

如何使NLTK PunktSentenceTokenizer拆分无空格间隔的句子

是否可以让NLTK PunktSentenceTokenizer拆分无空格分隔的句子?

默认调用方式无法实现该效果,测试代码及输出如下:

from nltk.tokenize.punkt import PunktSentenceTokenizer

sent_tokenizer = PunktSentenceTokenizer()
print(sent_tokenizer.tokenize('Sky is blue.Metal is black.'))

'''
Output:
['Sky is blue.Metal is black.']
'''

默认预训练的PunktSentenceTokenizer基于标准英文书写规范训练,规则默认判定句末标点后需要跟随空白字符才会切分句子边界,因此无法识别句号后直接接大写单词的句界。


推荐解决方法:轻量预处理适配

不需要修改分词器源码,只需要在分词前用正则做极轻量的文本修正,在「句号+紧跟大写英文字母」的位置插入空格,再送入分词器即可,不会破坏原有分词规则,灵活度最高:

import re
from nltk.tokenize.punkt import PunktSentenceTokenizer

sent_tokenizer = PunktSentenceTokenizer()
raw_text = 'Sky is blue.Metal is black.'
# 补全句号后缺失的空格
processed_text = re.sub(r'\.([A-Z])', r'. \1', raw_text)
print(sent_tokenizer.tokenize(processed_text))

运行输出:

['Sky is blue.', 'Metal is black.']

如果文本中存在Dr.Lee/Mr.Smith这类缩写后直接接大写人名的场景,提前把常见缩写加入分词器配置即可避免误拆:

import re
from nltk.tokenize.punkt import PunktSentenceTokenizer, PunktParameters

# 配置自定义缩写集合
punkt_config = PunktParameters()
punkt_config.abbrev_types = {'mr', 'mrs', 'dr', 'vs', 'etc', 'prof'}
sent_tokenizer = PunktSentenceTokenizer(punkt_config)

raw_text = 'Dr.Lee noted the sky is blue.Metal is black.'
processed_text = re.sub(r'\.([A-Z])', r'. \1', raw_text)
print(sent_tokenizer.tokenize(processed_text))

运行输出:

['Dr. Lee noted the sky is blue.', 'Metal is black.']

备选方法:自定义训练分词模型

也可以收集包含无空格句界的标注语料,重新训练Punkt模型,让模型学习到无空格场景下的句界规则,但该方法需要准备标注语料,时间成本高,常规场景下不推荐使用。


内容的提问来源于stack exchange,提问作者revy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 22:33:22