2015-12-23 39 views
0

我正在尝试使用一个非常大的大约85,000个推文,我试图与电视广告中的对话进行比较。但是,由于我的语料库的大小,我无法处理余弦相似性度量,而没有得到“错误:无法分配大小为n的向量”消息(本例中为26 GB)。使用quanteda计算R中大型语料库的余弦相似度

我已经在具有大量内存的服务器上运行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

你使用最新的(GitHub)版本吗?对不起,直到十二月27日没有电脑,但高兴地解决这个问题! –

+1

我会检查GitHub版本。感谢您的帮助,我期待在假期后收到您的回复。祝一切顺利! – StanO

+0

好的我已经找到了这里的问题 - “相似性()”将稀疏矩阵强制为一个密集矩阵。我将改变底层实施以避免这种胁迫。但是目前(quanteda_0.9.1-7),如果您没有足够的内存来容纳矩阵的整个密集版本,它将无法工作。我就此提交了[GitHub上的问题#84](https://github.com/kbenoit/quanteda/issues/84)。 –

回答

3

错误很有可能是quanteda以前的版本引起的(0.9.1-8之前,在GitHub上为2016年1月1日)将dfm对象强制转换为密集矩阵以调用proxy :: simil()。较新版本现在可以在没有强制的情况下在method = "correlation"method = "cosine"上使用稀疏dfm对象。 (尽快提供更多稀疏的方法。)

我不能真正关注你在代码中做什么,但它看起来像是在文件聚集的群组之间获得了两两相似的结果。我建议采用以下工作流程:

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

  2. 如您所做的那样将此dfm加权为tfidf()

  3. 使用y <- 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