2012-03-26 42 views
2

我正嘗試在Windows 7計算機上使用R的wordnet軟件包進行並行處理。具體來說,我試圖找到名詞列表的同義詞。我在下面做了一些示例代碼來展示我想要做的事情,但似乎並沒有正確執行。它啓動了工人,它正在計算其中一個工人,而不是其他工人。下面列出的名單長度爲4,每個單位有4個字。我試圖按可用內核的數量劃分列表,並將列表的子集發送給每個內核。然後sapply函數獲取4個單詞的同義詞(在並行循環內)。我也試過用降雪做這個,但是我無法得到它來導出字典(sfExport似乎沒有這樣做)。我沒有在foreach循環中使用「.export」,因爲它也給字典找不到的錯誤,但把它放在並行循環內似乎使它工作。任何幫助將非常感激。並行使用r中的wordnet(使用Windows 7)

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

我覺得你的問題是你如何設置你的foreachi變量。應該循環的是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,但你可以使用任何你想要的後端。

+0

謝謝,代碼。我昨天計算出我的主要問題是我沒有正確定義我的環境變量。我需要爲用戶和系統定義WNHOME。我已經有了WNSEARCHDIR,但是沒有WNHOME,它似乎無法找到字典。儘管我喜歡你的代碼,但最近我一直對doSMP感到惱火,但在集羣的啓動和結束方面卻是不可預測的,所以我認爲我會換成雪(或降雪)。再次感謝! – 2012-04-03 13:27:14