如何配置PunktSentenceTokenizer同时指定语言与自定义缩写列表
解决方案
该需求完全可以实现,无需重新训练模型,你只需要先加载官方预训练的德语Punkt分词器,再向其内置的缩写集合追加自定义缩写即可,完整实现代码如下:
import nltk from nltk.tokenize.punkt import PunktSentenceTokenizer # 首次使用需提前下载punkt模型包 # nltk.download('punkt') # 加载官方预训练的德语Punkt分词模型 german_tokenizer = nltk.data.load('tokenizers/punkt/german.pickle') # 自定义需要追加的缩写列表 custom_abbreviations = {"z. B.", "u. a.", "d. h."} # 将自定义缩写合并到预训练模型的缩写集合中 german_tokenizer._params.abbrev_types.update(custom_abbreviations) # 测试效果 test_text = 'Das ist z. B. ein Vogel. Es fliegt sehr hoch.' split_sentences = german_tokenizer.tokenize(test_text) print(split_sentences)
输出结果为:
['Das ist z. B. ein Vogel.', 'Es fliegt sehr hoch.']
实现说明
你之前的两份代码无法结合的核心原因是:
nltk.sent_tokenize是快捷调用方法,没有暴露修改内置参数的入口- 直接初始化
PunktParameters会生成空白参数集,没有加载预训练的德语模型数据
预训练的Punkt模型的参数并非不可变,其内部_params属性就是PunktParameters实例,你除了修改abbrev_types外,还可以根据需要修改collocations(固定搭配)、sent_starters(句首常用词)等属性来优化拆分效果,不需要从零训练模型。
注意事项
如果你的文本中缩写的空格格式不统一(比如存在z.B.和z. B.两种写法),建议先做文本标准化,将缩写的格式统一后再进行拆分,避免识别遗漏。
内容的提问来源于stack exchange,提问作者guerda
相关产品推荐
相关产品推荐

