计算r中文档集合的余弦和jaccard相似度

计算r中文档集合的余弦和jaccard相似度,r,text-mining,cosine-similarity,R,Text Mining,Cosine Similarity,我将计算将近14000个文档之间的相似性。但是代码的执行时间太长了。有没有其他方法可以更快地完成同样的工作 这是我的密码 wb=createWorkbook() #create workbook addWorksheet(wb,"absSim") #create worksheet listoffiles=list.files() #get list of documents from current working directory fileslength=length(listoffile

我将计算将近14000个文档之间的相似性。但是代码的执行时间太长了。有没有其他方法可以更快地完成同样的工作

这是我的密码

wb=createWorkbook() #create workbook
addWorksheet(wb,"absSim") #create worksheet
listoffiles=list.files() #get list of documents from current working directory
fileslength=length(listoffiles) #no of documents in directory
for(i in 1:fileslength-1)
{
  d1=readLines(listoffiles[i])# read first document 
  k=i+1
  for(j in k:fileslength)
  {
   d2=readLines(listoffiles[j]) #read second document
   #make a vector of two documents
   myvector=c(d1,d2)
   #making corpus of two documents
   mycorpus=Corpus(VectorSource(myvector))
   #preprocessing of corpus
   mycorpus=tm_map(mycorpus,removePunctuation)
   mycorpus=tm_map(mycorpus,removeNumbers)
   mycorpus=tm_map(mycorpus,stripWhitespace)
   mycorpus=tm_map(mycorpus,tolower)
   mycorpus=tm_map(mycorpus,function(x) removeWords(x,stopwords("english")))
   mycorpus=tm_map(mycorpus,function(x) removeWords(x,"x"))
   #make a document term matrix now
   dtm=as.matrix(DocumentTermMatrix(mycorpus))
   #compute distance of both documents using proxy package
   cdist=as.matrix(dist(dtm,method = "cosine"))
   jdist=as.matrix(dist(dtm,method = "jaccard"))
   #compute similarity
   csim=1-cdist
   jsim=1-jdist
   #get similarity of both documents
   cos=csim[1,2]
   jac=jsim[1,2]
   if(cos>0 | jac>0)
   {
     writeData(wb,"absSim",cos,startCol = 1,startRow = rownum)
     writeData(wb,"absSim",jac,startCol = 2,startRow = rownum)
     saveWorkbook(wb,"abstractSimilarity.xlsx",overwrite = TRUE)
     rownum=rownum+1
   }
  }
}

当我运行此代码时,第一个文档在2小时内执行。有没有办法更快地计算余弦和雅卡相似度

您可以尝试以下代码。这是一个非常简化的版本,没有任何清理或修剪,只是为了演示如何使用
text2vec
。我还使用了
tokenizers
包进行标记化,因为它比
text2vec
中的标记器快一点。我使用了for提供的采样功能。在我的机器上,不到一分钟就完成了。当然,其他相似性度量或预处理的集成也是可能的。我希望这就是你要找的

library(text2vec)
library(tokenizers)

samplefun <- function(n, x, collapse){
  paste(sample(x, n, replace=TRUE), collapse=collapse)
}

words <- sapply(rpois(10000, 8) + 1, samplefun, letters, '')

#14000 documents, each with 100 lines (pasted together) of several words
docs <- sapply(1:14000, function(x) {

  paste(sapply(rpois(100, 5) + 1, samplefun, words, ' '), collapse = ". ")

})

iterator <- itoken(docs,
                   ,tokenizer = function(x) tokenizers::tokenize_words(x, lowercase = FALSE)
                   ,progressbar = FALSE
                   )

vocabulary <- create_vocabulary(iterator)

dtm <- create_dtm(iterator, vocab_vectorizer(vocabulary))

#dtm
#14000 x 10000 sparse Matrix of class "dgCMatrix"
#....

#use, e.g., the first and second half of the dtm as document sets
similarity <- sim2(dtm[1:(nrow(dtm)/2),]
                   , dtm[(nrow(dtm)/2+1):nrow(dtm),]
                   , method = "jaccard"
                   , norm = "none")

dim(similarity)
#[1] 7000 7000
库(text2vec)
库(标记器)

samplefun查看一下包
text2vec
,这是目前此类任务最快的包,至少以我的经验来看是如此。网站上提供了一些很好的教程。此外,我觉得你读取文件的方式有点复杂。您可以考虑使用<代码>列表>文件()/<代码>,并在所有文档中一次读取,例如通过<代码> LePix<代码>,然后从这个对象构建语料库和DTM。这有帮助吗?我收集了大量的文档,需要更多的空间。因此,制作一个dtm对于大型收藏来说是非常复杂的。大型对您的客户来说意味着什么?每个文档平均有多少个文档,多少个术语?对不起,刚刚看到了14000个文档。我有14000个文档。每一份文件都包含将近80多个字。我想计算每个文档之间的相似性。是否有任何代码示例??