параллельное использование wordnet в r (с windows 7) - PullRequest
2 голосов
/ 26 марта 2012

Я пытаюсь использовать параллельную обработку с пакетом wordnet для R на компьютере с Windows 7.В частности, я пытаюсь найти синонимы для списка существительных.Я сделал несколько примеров кода ниже, чтобы показать, что я пытаюсь сделать, но, похоже, он не выполняется должным образом параллельно.Он запускает рабочих и рассчитывает на одного из рабочих, но не на других. Список, который я сделал ниже, имеет длину 4 с 4 словами в каждом слоте.Я пытаюсь разделить список на количество доступных ядер и отправить подмножество списка каждому ядру.Затем функция sapply получает синонимы для 4 слов (в параллельном цикле).Я также пытался сделать это со Snowfall, но не смог заставить его экспортировать словарь (sfExport, похоже, этого не делал).Я не использую «.export» в цикле foreach, потому что он также выдавал ошибки, когда словарь не был найден, но, похоже, что его включение в параллельный цикл заставляет его работать.Любая помощь будет высоко ценится.

library(wordnet)
library(foreach)
library(doSMP)
library(rJava)

NbrOfCores <- 2

workers <- startWorkers(NbrOfCores) # number of cores
registerDoSMP(workers)
getDoParName() # check name of parallel backend
getDoParVersion() # check version of parallel backend
getDoParWorkers() # check number of workers
set.seed(1)

setDict<-setDict("C:\\Program Files (x86)\\WordNet\\2.1\\dict\\")
initDict<-initDict("C:\\Program Files (x86)\\WordNet\\2.1\\dict\\")
dict<-getDictInstance()

words <- list(c("cat", "dog", "bird"),c("mouse", "iguana", "fish"),c("car", "tree", "house"),c("shoe", "shirt", "hat"))

rows=length(words) #4
prow<-floor(rows/NbrOfCores) #2

nouns<-foreach(i=1:NbrOfCores, .combine = c, .packages ="wordnet","rJava") %dopar% {
setDict<-setDict("C:\\Program Files (x86)\\WordNet\\2.1\\dict\\")
initDict<-initDict("C:\\Program Files (x86)\\WordNet\\2.1\\dict\\")
dict<-getDictInstance()    
foreach(j=(prow*(i-1)+1):(prow*i)) %do% sapply(words[[j]],synonyms,"NOUN")}

1 Ответ

1 голос
/ 02 апреля 2012

Я думаю, что ваша проблема в том, как вы устанавливаете переменную i в вашем foreach.То, через что это должно проходить, - это объект words, а не количество ядер.Этот код работает:

library(wordnet)
library(foreach)
# library(doSMP) # I don't think you want to use this package anymore.
library(rJava)
require(snow) # Add the snow packages
require(doSNOW) 

NbrOfCores <- 2
cl.tmp = makeCluster(rep('localhost',NbrOfCores), type='SOCK')
registerDoSNOW(cl.tmp)

words <- list(c("cat", "dog", "bird"),c("mouse", "iguana", "fish"),c("car", "tree", "house"),c("shoe", "shirt", "hat"))

foreach(words=iter(words), .packages='wordnet') %dopar% {
    setDict<-setDict("C:\\Program Files (x86)\\WordNet\\2.1\\dict\\")
    initDict<-initDict("C:\\Program Files (x86)\\WordNet\\2.1\\dict\\")
    dict<-getDictInstance() 
    sapply(words,synonyms,pos='NOUN')
}

Похоже, пакеты doSMP недоступны для моей версии R, поэтому я просто переключил его на snow, но вы можете использовать любой бэкэнд, какой захотите.

...