2011-12-27 4 views
9

Хорошо, меня очень интересовала обработка естественного языка в последнее время: однако я использовал C до сих пор для большей части моей работы. Я слышал о NLTK, и я не знал Python, но это кажется очень легким для изучения, и это выглядит как действительно мощный и интересный язык. В частности, модуль NLTK кажется очень и очень приспособленным к тому, что мне нужно делать.Производительность NLTK

Однако при использовании sample code for NLTK и вклеивании этого файла в файл с именем test.py, я заметил, что для его запуска требуется очень и очень долгое время!

Я звоню его из командной строки следующим образом:

time python ./test.py 

А на 2,4 ГГц машина с 4 Гб оперативной памяти с, она занимает 19.187 секунды!

Теперь, может быть, это абсолютно нормально, но у меня создалось впечатление, что NTLK был чрезвычайно fast; Возможно, я ошибался, но есть ли что-то очевидное, что я явно ошибаюсь?

+3

Откуда у вас сложилось впечатление, что NLTK очень быстрый? –

+0

В описании Amazon для «Обработка текста Python с помощью NLTK 2.0»: «Узнайте, как легко обрабатывать огромные объемы данных без потери эффективности или скорости». (Http://www.amazon.com/Python-Text-Processing-NLTK-Cookbook/dp/1849513600). – elliottbolzan

ответ

19

Я считаю, что вы совмещаете время обучения с временем обработки. Обучение модели, как UnigramTagger, может занять много времени. Таким образом, можно загрузить эту обученную модель из файла pickle на диске. Но как только вы загрузите модель в память, обработка может быть довольно быстрой. См. Раздел «Эффективность классификатора» в нижней части моего сообщения по адресу part of speech tagging with NLTK, чтобы получить представление о скорости обработки для различных алгоритмов мечения.

7

@Jacob прав насчет объединения обучения и пометки времени. Я упростил sample code немного и вот разбивка время:

Importing nltk takes 0.33 secs 
Training time: 11.54 secs 
Tagging time: 0.0 secs 
Sorting time: 0.0 secs 

Total time: 11.88 secs 

система:

CPU: Intel(R) Core(TM)2 Duo CPU E8400 @ 3.00GHz 
Memory: 3.7GB 

Код:

import pprint, time 
startstart = time.clock() 

start = time.clock() 
import nltk 
print "Importing nltk takes", str((time.clock()-start)),"secs" 

start = time.clock() 
tokenizer = nltk.tokenize.RegexpTokenizer(r'\w+|[^\w\s]+') 
tagger = nltk.UnigramTagger(nltk.corpus.brown.tagged_sents()) 
print "Training time:",str((time.clock()-start)),"secs" 


text = """Mr Blobby is a fictional character who featured on Noel 
Edmonds' Saturday night entertainment show Noel's House Party, 
which was often a ratings winner in the 1990s. Mr Blobby also 
appeared on the Jamie Rose show of 1997. He was designed as an 
outrageously over the top parody of a one-dimensional, mute novelty 
character, which ironically made him distinctive, absurd and popular. 
He was a large pink humanoid, covered with yellow spots, sporting a 
permanent toothy grin and jiggling eyes. He communicated by saying 
the word "blobby" in an electronically-altered voice, expressing 
his moods through tone of voice and repetition. 

There was a Mrs. Blobby, seen briefly in the video, and sold as a 
doll. 

However Mr Blobby actually started out as part of the 'Gotcha' 
feature during the show's second series (originally called 'Gotcha 
Oscars' until the threat of legal action from the Academy of Motion 
Picture Arts and Sciences[citation needed]), in which celebrities 
were caught out in a Candid Camera style prank. Celebrities such as 
dancer Wayne Sleep and rugby union player Will Carling would be 
enticed to take part in a fictitious children's programme based around 
their profession. Mr Blobby would clumsily take part in the activity, 
knocking over the set, causing mayhem and saying "blobby blobby 
blobby", until finally when the prank was revealed, the Blobby 
costume would be opened - revealing Noel inside. This was all the more 
surprising for the "victim" as during rehearsals Blobby would be 
played by an actor wearing only the arms and legs of the costume and 
speaking in a normal manner.[citation needed]""" 

start = time.clock() 
tokenized = tokenizer.tokenize(text) 
tagged = tagger.tag(tokenized) 
print "Tagging time:",str((time.clock()-start)),"secs" 

start = time.clock() 
tagged.sort(lambda x,y:cmp(x[1],y[1])) 
print "Sorting time:",str((time.clock()-start)),"secs" 

#l = list(set(tagged)) 
#pprint.pprint(l) 
print 
print "Total time:",str((time.clock()-startstart)),"secs" 
+1

Приятно получать и фактические данные * и * код для воспроизведения! – Titou

0

Я использую NLTK следующие модифицированную версию этого кода: https://github.com/ugik/notebooks/blob/master/Neural_Network_Classifier.ipynb

Это хорошо работает, но я заметил, что машина, которую я использовал для запуска этого кода, не влияет на характеристики. Я упрощаю код, чтобы ограничить его определением функции «train» и применить его к обучению корпуса с одним предложением , И я запустил его на разных компьютерах:

ИСПЫТАНИЙ 1

Linux 4.4.0-64-родовой # 85-Ubuntu SMP пн 20 февраля 11:50:30 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

Процессор: 16 х Intel (R) Xeon (R) CPU E5-2686 v4 @ 2.30GHz

MemTotal: 125827556 ​​кБ

Импорт п ltk и другие модули принимают 0,9350419999999999 сек.

Обучение с 20 нейронами, альфа: 0.1 итерации: 10000, отсев: Ложные

время обучения: 1.1798350000000006 сек

ТЕСТ 2

Linux 4.8.0-41-родовой # 44 ~ 16.04.1-Ubuntu SMP Пт 3 марта 17:11:16 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

Процессор: 4x Intel (R) ядро ​​(TM) i5-7600K CPU @ 3.80GHz

MemTotal: 16289540 кБ

Импорт NLTK и другие модули занимает 0.397839 секунд

Обучение с 20 нейронами, альфа: 0,1, повторениями: 10000, выбывания: Ложные время

Обучение: 0.7186329999999996 сек

Какое чертовское время обучения может быть более продолжительным на компьютере с амазоном 16-Xeon/122Go RAM и на моем компьютере i5/16Go?