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

