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

Posted

技术标签:

【中文标题】使用 quanteda 在 R 中的大型语料库上计算余弦相似度【英文标题】:Computing cosine similarities on a large corpus in R using quanteda 【发布时间】:2015-12-23 03:36:15 【问题描述】:

我正在尝试使用包含大约 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="****"))  

【问题讨论】:

您使用的是最新的 (GitHub) 版本吗?抱歉,直到 12 月 27 日才使用计算机,但很高兴能解决这个问题! 我会查看 GitHub 版本。感谢您的帮助,我期待在假期后收到您的来信。万事如意! 好的,我在这里找到了问题 - similarity() 将稀疏矩阵强制转换为密集矩阵。我将更改底层实现以避免这种强制。但是目前(quanteda_0.9.1-7)如果您没有足够的内存来包含矩阵的整个密集版本,它将无法工作。我为此提交了Issue #84 on GitHub。 非常感谢肯。如果我重新安装包,会解决问题吗? 【参考方案1】:

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

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

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

    tfidf() 加权这个dfm。

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

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

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

【讨论】:

以上是关于使用 quanteda 在 R 中的大型语料库上计算余弦相似度的主要内容,如果未能解决你的问题,请参考以下文章

在 R 中将 DFM 与 quanteda 合并

R:将 LIME 应用于 quanteda 文本模型的问题

无论文档边界如何,都可以有效地计算大型语料库中的词频

如何在 R 中为 tf-idf 加权 dfm 训练朴素贝叶斯分类器?

保留 R 语料库中的 EXACT 单词

从 R 中的许多 html 文件创建语料库