Формат данных обучения для nltk punkt

Я хотел бы запустить nltk punkt для разделения предложений. Нет модели обучения, поэтому я тренирую модель отдельно, но я не уверен, правильный ли формат данных обучения, который я использую.

Мои данные обучения - одно предложение на строку. Я не смог найти документацию об этом, только этот поток (https://groups.google.com/forum/#!topic/nltk-users/bxIEnmgeCSM) проливает некоторый свет на формат данных обучения.

Каков правильный формат данных обучения для токенинга предложения nltk punkt?

Ответы

Ответ 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 был удален.