Ах да, Punken токенизатор - это магическое бесконтрольное обнаружение границы предложения. И фамилия автора тоже довольно крутая, 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()
Для достижения более высокой точности и позволяет остановить тренировку в любое время и по-прежнему сохранять правильный маринад для Tokenizer, не смотреть на этом фрагменте кода для обучение немецкому приговор Tokenizer, 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
Однако не отметить, что обнаружение период ** очень чувствителен к латинским fullstop, знак вопроса и восклицательный знак **. Если вы собираетесь обучать токенизатор punkt для других языков, которые не используют латинскую орфографию, вам нужно как-то взломать код, чтобы использовать соответствующую пунктуацию границы предложения. Если вы используете реализацию NKTK punkt, отредактируйте переменную sent_end_chars
.
Доступны предварительно подготовленные модели, отличные от стандартного английского токенизатора, использующего nltk.tokenize.sent_tokenize()
. Вот они: https://github.com/evandrix/nltk_data/tree/master/tokenizers/punkt
Edited
Примечание предварительно подготовленные модели в настоящее время не доступны, потому что nltk_data
GitHub репо перечисленных выше был удален.
Как я узнал, «PunktTrainer» может создать список возможных сокращений без вашего наблюдения. Это помогает использовать токенизацию предложения. Но, на мой взгляд, это все еще не очень хорошо подходит для сокращений английского языка. Я не уверен, что это многое сделало бы на других языках. То, что я вижу в исходном коде, - это использование языковых специфических пунктуаций, чтобы токенизировать слова, а также новую строку и период для поиска окончаний и сокращений предложений. Я думаю, вам нужны хорошо отформатированные предложения для обучения в каждой строке. http://nltk.org/_modules/nltk/tokenize/punkt.html#PunktTrainer – Mehdi
@mehdi, вам не потребуется тренировочное предложение в каждой строке. Если вы это сделали, вы можете просто извлечь функции поезда контролируемого классификатора. Магия punkt заключается в том, чтобы сделать это без присмотра, не изначально определяя, где граница предложения. Если вы хотите переустановить punkt и вручную указать сокращения, см. Http://stackoverflow.com/questions/14095971/how-to-tweak-the-nltk-sentence-tokenizer – alvas