2015-12-23 37 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