2014-01-16 2 views
13

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

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

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

+0

Как я узнал, «PunktTrainer» может создать список возможных сокращений без вашего наблюдения. Это помогает использовать токенизацию предложения. Но, на мой взгляд, это все еще не очень хорошо подходит для сокращений английского языка. Я не уверен, что это многое сделало бы на других языках. То, что я вижу в исходном коде, - это использование языковых специфических пунктуаций, чтобы токенизировать слова, а также новую строку и период для поиска окончаний и сокращений предложений. Я думаю, вам нужны хорошо отформатированные предложения для обучения в каждой строке. http://nltk.org/_modules/nltk/tokenize/punkt.html#PunktTrainer – Mehdi

+0

@mehdi, вам не потребуется тренировочное предложение в каждой строке. Если вы это сделали, вы можете просто извлечь функции поезда контролируемого классификатора. Магия punkt заключается в том, чтобы сделать это без присмотра, не изначально определяя, где граница предложения. Если вы хотите переустановить punkt и вручную указать сокращения, см. Http://stackoverflow.com/questions/14095971/how-to-tweak-the-nltk-sentence-tokenizer – alvas

ответ

17

Ах да, 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 репо перечисленных выше был удален.

+1

Ссылка на бумагу сломана. Вот новый http://www.mitpressjournals.org/doi/abs/10.1162/coli.2006.32.4.485 – BlackBear

+1

@BlackBear Спасибо! Я обновил ссылку. – baijum

Смежные вопросы