formato de datos de entrenamiento para nltk punkt

Me gustaría ejecutar nltk punkt para dividir oraciones. No hay un modelo de entrenamiento, así que entreno por separado, pero no estoy seguro si el formato de datos de entrenamiento que estoy usando es correcto.

Mis datos de entrenamiento son una oración por línea. No pude encontrar ninguna documentación sobre esto, solo este hilo ( https://groups.google.com/forum/#!topic/nltk-users/bxIEnmgeCSM ) arroja alguna luz sobre el formato de los datos de entrenamiento.

¿Cuál es el formato de datos de entrenamiento correcto para el tokenizador de oraciones punkt nltk?

Ah, sí, el tokenizador Punkt es la detección de límites de oraciones mágicas no supervisadas. Y el apellido del autor también es genial, Kiss and Strunk (2006) . La idea es utilizar NO anotación para entrenar un detector de límite de oración, por lo tanto, la entrada será CUALQUIER tipo de texto simple (siempre que la encoding sea consistente).

Para entrenar un nuevo modelo, simplemente usa:

 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() 

Para lograr una mayor precisión y permitirle detener el entrenamiento en cualquier momento y aún guardar un pickle adecuado para su tokenizer, mire este fragmento de código para entrenar un tokenizer de oraciones en alemán, 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 

Sin embargo, tenga en cuenta que la detección del período es ** muy sensible al paro completo latino, el signo de interrogación y el signo de exclamación **. Si va a entrenar un tokenizer punkt para otros idiomas que no usan ortografía latina, tendrá que hackear el código de alguna manera para usar la puntuación apropiada de los límites de la oración. Si está utilizando la implementación de punkt de NLTK, edite la variable sent_end_chars .

Existen modelos pre-entrenados disponibles además del tokenizador en inglés ‘predeterminado’ que usa nltk.tokenize.sent_tokenize() . Aquí están: https://github.com/evandrix/nltk_data/tree/master/tokenizers/punkt

Editado

Tenga en cuenta que los modelos pre-entrenados actualmente no están disponibles porque se eliminó el repository nltk_data nltk_data que se enumeró anteriormente.