使用quanteda计算R中大型语料库的余弦相似度

时间:2015-12-23 03:36:15

标签: r nlp bigdata quanteda

我正在努力处理大约85,000条推文的大型语料库,我试图将其与电视广告中的对话进行比较。但是,由于我的语料库的大小,我无法处理余弦相似性度量而没有得到“错误:无法分配大小为n的向量”消息(在我的情况下为26 GB)。

我已经在具有大量内存的服务器上运行R 64位。我也尝试在内存最多的服务器上使用AWS(244 GB),但无济于事(同样的错误)。

有没有办法使用像fread这样的软件包来解决这个内存限制,还是我必须创建一种方法来分解我的数据?非常感谢您的帮助,我附上了以下代码:

x <- NULL
y <- NULL
num <- NULL
z <- NULL
ad <- NULL
for (i in 1:nrow(ad.corp$documents)){
  num <- i
  ad <- paste("ad.num",num,sep="_")
  x <- subset(ad.corp, ad.corp$documents$num== yoad)
  z <- x + corp.all
  z$documents$texts <- as.character(z$documents$texts)
  PolAdsDfm <- dfm(z, ignoredFeatures = stopwords("english"), groups = "num",stem=TRUE, verbose=TRUE, removeTwitter=TRUE)
  PolAdsDfm <- tfidf(PolAdsDfm)
  y <- similarity(PolAdsDfm, ad, margin="documents",n=20, method = "cosine", normalize = T)
  y <- sort(y, decreasing=T)
  if (y[1] > .7){assign(paste(ad,x$documents$texts,sep="--"), y)}
  else {print(paste(ad,"didn't make the cut", sep="****"))}  
}

1 个答案:

答案 0 :(得分:3)

该错误很可能是由以前版本的quanteda(在2012年1月1日之前的GitHub之前的0.9.1-8之前)将dfm对象强制转换为密集矩阵以调用proxy :: simil()引起的。较新版本现在可用于稀疏dfm对象,而不会强制method = "correlation"method = "cosine"。 (随着更多稀疏方法即将推出。)

我无法真正遵循您在代码中所做的事情,但看起来您在作为群组聚合的文档之间获得成对相似性。我建议采用以下工作流程:

  1. 使用groups选项为您要比较的所有文本组创建您的dfm。

  2. 正如您所做的那样,使用tfidf()对此dfm进行加权。

  3. 使用y <- textstat_simil(PolAdsDfm, margin = "documents", method = "cosine"),然后使用as.matrix(y)将其强制转换为完整的对称矩阵。然后,所有成对文档都在该矩阵中,您可以直接从该对象中选择大于0.7的阈值。

    请注意,无需使用method = "cosine"对术语频率进行标准化。在 quanteda 的较新版本中,normalize参数已被删除,因为我认为在计算相似度之前对dfm进行加权是一种更好的工作流实践,而非构建权重为textstat_simil()

  4. 最后注意事项:我强烈建议您不要使用此处的方法访问corpus对象的内部,因为这些内部可能会更改,然后会破坏您的代码。例如,使用texts(z)代替z$documents$texts,使用docvars(ad.corp, "num")代替ad.corp$documents$num