Производительность НЛТК - PullRequest
9 голосов
/ 27 декабря 2011

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

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

Я звоню из оболочки так:

time python ./test.py

А на машине с частотой 2,4 ГГц и 4 ГБ ОЗУ это занимает 19,187 секунды!

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

Ответы [ 3 ]

19 голосов
/ 27 декабря 2011

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

7 голосов
/ 07 апреля 2013

@ Джейкоб прав в отношении совмещения времени обучения и меток. Я немного упростил пример кода и вот разбивка по времени:

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"
0 голосов
/ 17 марта 2017

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

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

ТЕСТ 1

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

Процессор: 16 х Intel (R) Xeon® процессор E5-2686 v4 @ 2,30 ГГц

MemTotal: 125827556 ​​кБ

Импорт модулей nltk и других занимает 0,9350419999999999 с

Тренировка с 20 нейронами, альфа: 0,1, итерации: 10000, отсев: False

Время тренировки: 1,1798350000000006 с

ТЕСТ 2

Linux 4.8.0-41-generic # 44 ~ 16.04.1-Ubuntu SMP пт 3 марта, 17:11:16 UTC 2017 x86_64 x86_64 x86_64 GNU / Linux

Процессор: 4x процессор Intel® Core ™ TM i5-7600K @ 3,80 ГГц

MemTotal: 16289540 кБ

Импорт nltk и других модулей занимает 0,397839 с

Тренировка с 20 нейронами, альфа: 0,1, итерации: 10000, отсев: False

Время тренировки: 0,7186329999999996 с

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

...