嗯,是的,Punkt令牌生成器是神奇的无监督语句边界检测。作者的姓氏也很酷,Kiss and
Strunk(2006)。这个想法是使用
NO注释 来训练句子边界检测器,因此输入将是 任何种类的纯文本 (只要编码是一致的)。
要训练新模型,只需使用:
import nltk.tokenize.punktimport pickleimport precstokenizer = nltk.tokenize.punkt.PunktSentenceTokenizer()text = precs.open("someplain.txt","r","utf8").read()tokenizer.train(text)out = open("someplain.pk","wb")pickle.dump(tokenizer, out)out.close()为了获得更高的精度并允许您随时停止培训,并且仍然为标记生成器保留适当的泡菜,请查看以下用于训练德语句子标记生成器的代码段:https://github.com/alvations/DLTK/blob/
master / dltk / tokenize /
tokenizer.py:
def train_punktsent(trainfile, modelfile): """ Trains an unsupervised NLTK punkt sentence tokenizer. """ punkt = PunktTrainer() try: with precs.open(trainfile, 'r','utf8') as fin: punkt.train(fin.read(), finalize=False, verbose=False) except KeyboardInterrupt: print 'KeyboardInterrupt: Stopping the reading of the dump early!' ##HACK: Adds abbreviations from rb_tokenizer. abbrv_sent = " ".join([i.strip() for i in precs.open('abbrev.lex','r','utf8').readlines()]) abbrv_sent = "Start"+abbrv_sent+"End." punkt.train(abbrv_sent,finalize=False, verbose=False) # Finalize and outputs trained model. punkt.finalize_training(verbose=True) model = PunktSentenceTokenizer(punkt.get_params()) with open(modelfile, mode='wb') as fout: pickle.dump(model, fout, protocol=pickle.HIGHEST_PROTOCOL) return model但是请注意,周期检测 对拉丁句号,问号和感叹号非常敏感
。如果您要为不使用拉丁语拼字法的其他语言训练punkt令牌生成器,则需要以某种方式修改代码以使用适当的句子边界标点符号。如果您使用的是NLTK的punkt实现,请编辑
sent_end_chars变量。
除了使用的“默认”英语令牌生成器外,还有其他可用的预训练模型
nltk.tokenize.sent_tokenize()。它们在这里:https
:
//github.com/evandrix/nltk_data/tree/master/tokenizers/punkt
已编辑
请注意,由于
nltk_data上面列出的github存储库已被删除,因此预训练模型当前不可用。



