【问题标题】:parallel use of wordnet in r (with windows 7)在 r 中并行使用 wordnet(使用 Windows 7)
【发布时间】:2012-03-26 13:23:13
【问题描述】:

我正在尝试在 Windows 7 计算机上使用 R 的 wordnet 包进行并行处理。具体来说,我正在尝试查找名词列表的同义词。我在下面制作了一些示例代码来展示我正在尝试做的事情,但它似乎无法正确并行执行。它正在启动工人,它正在计算其中一个工人,而不是其他工人。我在下面制作的列表长度为 4,每个插槽中有 4 个单词。我试图将列表除以可用内核的数量,并将列表的一个子集发送到每个内核。然后 sapply 函数获取 4 个单词的同义词(在并行循环内)。我也尝试过使用 Snowfall 执行此操作,但无法导出字典(sfExport 似乎没有这样做)。我没有在 foreach 循环中使用“.export”,因为它也给出了找不到字典的错误,但是将它放在并行循环中似乎可以使它工作。任何帮助将不胜感激。

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")}

【问题讨论】:

    标签: windows r foreach parallel-processing wordnet


    【解决方案1】:

    我认为您的问题在于如何在 foreach 中设置 i 变量。这应该循环的是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,但您可以使用任何您想要的后端。

    【讨论】:

    • 感谢您的代码。我昨天解决了我的主要问题是我没有正确定义我的环境变量。我需要为用户和系统定义 WNHOME。我已经有了 WNSEARCHDIR,但是没有 WNHOME,它似乎无法找到字典。不过我更喜欢你的代码,最近我一直对 doSMP 感到恼火,它在启动和结束集群方面非常不可预测,所以我想我会切换到下雪(或降雪)。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    • 2012-02-23
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多