我想通过将文档切割成块来查找其他文档之间的相似性大于给定值(0.1)的文档。
library(tm)
data("crude")
sample.dtm <- DocumentTermMatrix(
crude, control=list(
weighting=function(x) weightTfIdf(x, normalize=FALSE),
stopwords=TRUE
)
)
step = 5
n = nrow(sample.dtm)
block = n %/% step
start = (c(1:block)-1)*step+1
end = start+step-1
j = unlist(lapply(1:(block-1),function(x) rep(((x+1):block),times=1)))
i = unlist(lapply(1:block,function(x) rep(x,times=(block-x))))
ij <- cbind(i,j)
library(skmeans)
getdocs <- function(k){
ci <- c(start[k[[1]]]:end[k[[1]]])
cj <- c(start[k[[2]]]:end[k[[2]]])
combi <- sample.dtm[ci]
combj < -sample.dtm[cj]
rownames(combi)<-ci
rownames(combj)<-cj
comb<-c(combi,combj)
sim<-1-skmeans_xdist(comb)
cat("Block", k[[1]], "with Block", k[[2]], "n")
flush.console()
tri.sim<-upper.tri(sim,diag=F)
results<-tri.sim & sim>0.1
docs<-apply(results,1,function(x) length(x[x==TRUE]))
docnames<-names(docs)[docs>0]
gc()
return (docnames)
}
使用应用程序时效果很好
system.time(rmdocs<-apply(ij,1,getdocs))
使用 parRapply 时
library(snow)
library(skmeans)
cl<-makeCluster(2)
clusterExport(cl,list("getdocs","sample.dtm","start","end"))
system.time(rmdocs<-parRapply(cl,ij,getdocs))
错误:
Error in checkForRemoteErrors(val) :
2 nodes produced errors; first error: attempt to set 'rownames' on an object with no dimensions
Timing stopped at: 0.01 0 0.04
似乎 sample.dtm coundn 不能在 parRapply 中使用。我很困惑。谁能帮我?谢谢!
除了导出对象之外,还需要在群集工作线程上加载必要的包。 在您的情况下,不这样做的结果是没有为"DocumentTermMatrix"对象定义dimnames
方法,从而导致rownames<-
失败。
您可以使用clusterEvalQ
功能在群集工作线程上加载包:
clusterEvalQ(cl, { library(tm); library(skmeans) })
完成此操作后,rownames(combi)<-ci
将正常工作。
另外,如果你想看到cat
的输出,你应该使用 makeCluster outfile
参数:
cl <- makeCluster(2, outfile='')