Ответ 1
Ах да, токенайзер Punkt - это магическое обнаружение границы предложения без присмотра. И фамилия автора тоже очень крутая, Kiss and Strunk (2006). Идея состоит в том, чтобы использовать аннотацию NO для обучения детектора границы предложения, следовательно, ввод будет ЛЮБОЙ вид открытого текста (до тех пор, пока кодирование непротиворечиво).
Чтобы обучить новую модель, просто используйте:
import nltk.tokenize.punkt
import pickle
import codecs
tokenizer = nltk.tokenize.punkt.PunktSentenceTokenizer()
text = codecs.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 codecs.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 \
codecs.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
Тем не менее, обратите внимание, что обнаружение периода очень чувствительно к латинским точкам останова, вопросительному знаку и восклицательному знаку. Если вы собираетесь обучать токенайзер пункту для других языков, которые не используют латинскую орфографию, вам нужно каким-то образом взломать код, чтобы использовать соответствующую пунктуацию границы предложения. Если вы используете nunk-реализацию punkt, отредактируйте переменную sent_end_chars
.
Существуют предварительно обученные модели, отличные от английского токенизатора "по умолчанию", использующего nltk.tokenize.sent_tokenize()
. Вот они: https://github.com/evandrix/nltk_data/tree/master/tokenizers/punkt
отредактированный
Обратите внимание, что предварительно обученные модели в настоящее время недоступны, так как перечисленное выше nltk_data
был удален.