2016-10-04 65 views
1

第一AF一切,這裏是示例數據重現,我有問題,我會盡量波紋管解釋: https://drive.google.com/file/d/0B4RCdYlVF8otUll6V2x0cDJORGc/view?usp=sharing相同的值但不同的結果?關於removeSparseTerms(R)

的問題是,我得到removeSparseTerms不同的結果,儘管引入它具有相同的價值。它似乎無視人類的邏輯,或者至少是一個人的邏輯。我有這樣的功能:

generateTDM <- function (Room_name, dest.train, RST){ 
      s.dir <- sprintf("%s/%s", dest.train, Room_name) 
      s.cor <- Corpus(DirSource(directory = s.dir, pattern = "txt", encoding = "UTF-8"))     #Crea unos corpora de los archivos txt ya limpios. 
      s.tdm <- TermDocumentMatrix(s.cor, control = list(bounds = list(local = c(2, Inf)), tokenize = TrigramTokenizer))      #Crea una matriz de terminos a partir de los corpora teniendo en cuenta unigramas, bigramas y trigramas. 
      s.tdm <- removeSparseTerms(s.tdm, RST)               #Mantiene aquellos términos que aparezcan en el (1-RST)% de los archivos, el resto los elimina. 
     } 

那麼,當我這樣調用此函數:

tdm.train <- lapply(Room_name, generateTDM, dest.train, RST[p]) 

我得到的,其中是位於取決於其它元素的向量內的可變RST功能不同的輸出。也就是說,儘管價值相同,但我得到了不同的結果。

例如:

情況1:

RST <-seq (0.45, 0.6, 0.05) 
p<-4 

我將RST =(0.45,0.5,0.55,0.6),然後RST [P]是0.6。

結果在這種情況下:

> tdm.train 
     [[1]] 
    <<TermDocumentMatrix (terms: 84, documents: 51)>> 
    Non-/sparse entries: 2451/1833 
    Sparsity   : 43% 
    Maximal term length: 10 
    Weighting   : term frequency (tf) 

    [[2]] 
    <<TermDocumentMatrix (terms: 82, documents: 52)>> 
    Non-/sparse entries: 2409/1855 
    Sparsity   : 44% 
    Maximal term length: 11 
    Weighting   : term frequency (tf) 

    [[3]] 
    <<TermDocumentMatrix (terms: 68, documents: 51)>> 
    Non-/sparse entries: 1926/1542 
    Sparsity   : 44% 
    Maximal term length: 13 
    Weighting   : term frequency (tf) 

    [[4]] 
    <<TermDocumentMatrix (terms: 36, documents: 48)>> 
    Non-/sparse entries: 985/743 
    Sparsity   : 43% 
    Maximal term length: 10 
    Weighting   : term frequency (tf) 

    [[5]] 
    <<TermDocumentMatrix (terms: 48, documents: 50)>> 
    Non-/sparse entries: 1295/1105 
    Sparsity   : 46% 
    Maximal term length: 10 
    Weighting   : term frequency (tf) 

    [[6]] 
    <<TermDocumentMatrix (terms: 27, documents: 50)>> 
    Non-/sparse entries: 756/594 
    Sparsity   : 44% 
    Maximal term length: 8 
    Weighting   : term frequency (tf) 

情況2:

RST <-seq (0.45, 0.8, 0.05) 
    p<-4 

我現在有RST =(0.45,0.5,0.55,0.6,0.65,0.7%,0.75 ,0.8),ergo RST [p]與此次相同(0.6)。

那麼,爲什麼我有不同的結果?我無法理解它。

> tdm.train 
[[1]] 
<<TermDocumentMatrix (terms: 84, documents: 51)>> 
Non-/sparse entries: 2451/1833 
Sparsity   : 43% 
Maximal term length: 10 
Weighting   : term frequency (tf) 

[[2]] 
<<TermDocumentMatrix (terms: 82, documents: 52)>> 
Non-/sparse entries: 2409/1855 
Sparsity   : 44% 
Maximal term length: 11 
Weighting   : term frequency (tf) 

[[3]] 
<<TermDocumentMatrix (terms: 68, documents: 51)>> 
Non-/sparse entries: 1926/1542 
Sparsity   : 44% 
Maximal term length: 13 
Weighting   : term frequency (tf) 

[[4]] 
<<TermDocumentMatrix (terms: 36, documents: 48)>> 
Non-/sparse entries: 985/743 
Sparsity   : 43% 
Maximal term length: 10 
Weighting   : term frequency (tf) 

[[5]] 
<<TermDocumentMatrix (terms: 57, documents: 50)>> 
Non-/sparse entries: 1475/1375 
Sparsity   : 48% 
Maximal term length: 10 
Weighting   : term frequency (tf) 

[[6]] 
<<TermDocumentMatrix (terms: 34, documents: 50)>> 
Non-/sparse entries: 896/804 
Sparsity   : 47% 
Maximal term length: 8 
Weighting   : term frequency (tf) 

我不知道......這很奇怪,對吧?如果RST的值相同,爲什麼最後兩個dirs中removeSparseTerms的結果在每種情況下都不相同。請幫助我,不知道原因是在殺我。

非常感謝你,祝你有美好的一天。


重複的例子,基於對OP的更新:

library(tm) 
library(RWeka) 
download.file("https://docs.google.com/uc?authuser=0&id=0B4RCdYlVF8otUll6V2x0cDJORGc&export=download", tf <- tempfile(fileext = ".zip"), mode = "wb") 
unzip(tf, exdir = tempdir()) 
TrigramTokenizer <- function(x) NGramTokenizer(x, Weka_control(min = 1, max = 3)) 
generateTDM <- function (Room_name, dest.train, rst){ 
    s.dir <- sprintf("%s/%s", dest.train, Room_name) 
    s.cor <- Corpus(DirSource(directory = s.dir, pattern = "txt", encoding = "UTF-8"))     #Crea unos corpora de los archivos txt ya limpios. 
    s.tdm <- TermDocumentMatrix(s.cor, control = list(bounds = list(local = c(2, Inf)), tokenize = TrigramTokenizer))      #Crea una matriz de terminos a partir de los corpora teniendo en cuenta unigramas, bigramas y trigramas. 
    t <- table(s.tdm$i) > (s.tdm$ncol * (1 - rst)) # from tm::removeSparseTerms() 
    termIndex <- as.numeric(names(t[t])) 
    return(s.tdm[termIndex, ]) 
} 
dest.train <- file.path(tempdir(), "stackoverflow", "TrainDocs") 
Room_name <- "Venus" 
p <- 4 
RST1 <- seq(0.45, 0.6, 0.05) 
RST2 <- seq(0.45, 0.8, 0.05) 
RST2[p] 
# [1] 0.6 
RST1[p] 
# [1] 0.6 
identical(RST2[p], RST1[p]) 
# [1] FALSE # ?!? 

lapply(Room_name, generateTDM, dest.train, RST1[p]) 
# <<TermDocumentMatrix (terms: 48, documents: 50)>> 

lapply(Room_name, generateTDM, dest.train, RST2[p]) 
# <<TermDocumentMatrix (terms: 57, documents: 50)>> # ?!? 
+0

Imho它會更好地突出差異並提供複製的示例數據,而不是強調「我不知道......我無法理解」多次。 :-) – lukeA

+0

是的,沒錯。我將準備一個帶有重要文檔和腳本部分的zip文件,以便儘快將其附加到此處。對不起。 –

+0

完成。附加的示例數據和句子中的壓力水平降低了一點。 :) –

回答

0

的問題似乎與流行問題「7.31 Why doesn’t R think these numbers are equal?」:可以精確表示

全國唯一號碼在R的數字類型中, 是整數和分母,其分母是2的冪。所有 其他數字在內部四捨五入爲(通常)53二進制y數字 準確性。其結果是,兩個浮點數將不可靠 相等,除非他們已經被相同的算法來計算,而不是 總是偶數然後

鑑於

(x <- seq(0.45, 0.6, 0.05)) 
# [1] 0.45 0.50 0.55 0.60 
(y <- seq(0.45, 0.8, 0.05)) 
# [1] 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 

然後

x==y 
# [1] TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE 
x[4]==y[4] 
# [1] FALSE 
x[4]-y[4] 
# [1] -1.110223e-16 
x[3]-y[3] 
# [1] 0 

由於

MASS::as.fractions(x) 
# [1] 9/20 1/2 11/20 3/5 

我猜這兩個.5在這裏是可靠的。因此,您的功能可能會產生不同的結果。

+1

非常感謝lukeA。在你的迴應之後,我設法通過創建具有整數值的RST向量來解決這個問題:'RST <-seq(45,60,5)',並且在調用該函數時,我輸入100之間的RST值: tdm.train < - lapply(Room_name,TDM_roomRST,dest.train,(RST [p]/100))'。因此我得到的結果在每種情況下都是完全相同的。說真的,我真的很贊同你的幫助和暗示。我希望你是最好的。問候,謝謝。 –

相關問題