Хочаце, каб паскорыць апрацоўку натуральнага мовы з NLTK? Ёсць шмат файлаў для апрацоўкі, але не ведаеце, як распаўсюджваць NLTK ў многіх ядраў?
Ну, вось, як вы можаце выкарыстоўваць execnet зрабіць размеркаванай часткі з прамовы паметкі з NLTK.
execnet гэта простая бібліятэка для стварэння сеткі шлюзаў і каналаў, якія можна выкарыстоўваць для размеркаваных вылічэнняў у Python. З яго дапамогай вы можаце пачаць Python ракету над SSH, адпраўце код і / ці дадзеныя, то атрымаеце вынікі. Ніжэй прыведзены 2 скрыпту, якія правераць дакладнасць рэкамендаваў частка NLTK аб прамовы Tagger супраць кожнага файла ў карычневы корпус. Першы сцэнар (бягун) робіць усе налады і атрымлівае вынікі, у той час як другі сцэнар (аддалены модуль) працуе на кожны шлюз, разліку і адпраўка дакладнасць кожнага файла ён атрымлівае для апрацоўкі.
Бягун выконвае наступныя дзеянні:
tag_files модуль (модуль аддаленага апісана ніжэй).карычневы) праз канал.
import execnet
import nltk.tag, nltk.data
import cPickle as pickle
import tag_files
HOSTS = {
'localhost': 2
}
NICE = 20
channels = []
tagger = pickle.dumps(nltk.data.load(nltk.tag._POS_TAGGER))
for host, count in HOSTS.items():
print 'opening %d gateways at %s' % (count, host)
for i in range(count):
gw = execnet.makegateway('ssh=%s//nice=%d' % (host, NICE))
channel = gw.remote_exec(tag_files)
channels.append(channel)
channel.send(tagger)
channel.send('brown')
count = 0
chan = 0
for fileid in nltk.corpus.brown.fileids():
print 'sending %s to channel %d' % (fileid, chan)
channels[chan].send(fileid)
count += 1
# alternate channels
chan += 1
if chan >= len(channels): chan = 0
multi = execnet.MultiChannel(channels)
queue = multi.make_receive_queue()
for i in range(count):
channel, response = queue.get()
print response
Модуль аддаленага значна прасцей.
import nltk.corpus
import cPickle as pickle
if __name__ == '__channelexec__':
tagger = pickle.loads(channel.receive())
corpus_name = channel.receive()
corpus = getattr(nltk.corpus, corpus_name)
for fileid in channel:
accuracy = tagger.evaluate(corpus.tagged_sents(fileids=[fileid]))
channel.send('%s: %f' % (fileid, accuracy))
Пераканайцеся, што вы NLTK і корпус дадзеных устаноўлены на кожным кампутары. Вы таксама павінны мець беспарольнага SSH доступ да кожнай з прымаюць майстар хаста (машыны запуску run_tag_files.py д.).
run_tag_files.py і tag_files.py толькі павінны быць на майстар сэрвэры; execnet будзе клапаціцца аб распаўсюджванні кода. Мяркуючы, run_tag_files.py і tag_files.py знаходзяцца ў тым жа каталогу, усё што вам трэба зрабіць, гэта запусціць Python run_tag_files.py. Вы павінны атрымаць паведамленне аб адкрыцці шлюзаў варта кучу адпраўляць паведамленні. Тады, толькі чакаць і назіраць, дакладнасць адказаў, каб убачыць, наколькі дакладныя пабудаваны ў часціны мовы Tagger на карычневы корпус.
Калі вы хочаце праверыць дакладнасць іншага складу, пераканайцеся, што кожны хост мае корпус дадзеных, а затым адправіць, што корпус імя замест карычневага, а таксама перадаваць fileids ад новага корпуса.
Калі вы хочаце праверыць свае ўласныя Tagger, марынаваць яго ў файл, а затым загрузіць і адправіць яго, а не ў Tagger NLTK. Ці вы можаце трэніраваць яго на майстар, а затым адправіць яго адзін раз падрыхтоўка завершана.
На практыцы гэта часта тато каб пераканацца, што кожны хост мае кожны файл, які вы жадаеце апрацаваць, і вы хочаце, каб апрацоўваць файлы за межамі убудаванай карпусоў NLTK's. Мая рэкамендацыя заключаецца ў ўстаноўцы GlusterFS захоўвання дадзеных кластара, каб кожны хост мае агульныя пункту мацавання, якія маюць доступ да кожнага файла, які вы жадаеце апрацаваць. Калі кожны хост мае тую ж кропку мацавання, вы можаце адправіць любы файл, шлях да любой канал для апрацоўкі.
Popular Links