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

Computing cosine similarities on a large corpus in R using quanteda

我正在尝试处理一个非常大的语料库,其中包含大约 85,000 条推文,我试图将其与电视广告中的对话进行比较。但是,由于我的语料库的大小,我无法在没有收到 "Error: cannot allocate vector of size 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="****"))}  
}

该错误很可能是由以前版本的 quanteda(0.9.1-8 之前,截至 2016 年 1 月 1 日 GitHub)强制 dfm 对象进入密集矩阵以调用 proxy::simil()。较新的版本现在适用于稀疏的 dfm 对象,无需对 method = "correlation"method = "cosine" 进行强制转换。 (即将推出更多稀疏方法。)

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

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

  2. 像您所做的那样用 tfidf() 加权此 dfm。

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

    请注意,无需使用 method = "cosine" 对词频进行归一化。在 quanteda 的较新版本中,normalize 参数已被删除,因为我认为在计算任何相似性之前对 dfm 进行加权是更好的工作流程实践,而不是构建权重为 textstat_simil().

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