2016-10-04 3 views
1

Erste af alle, hier ist die Beispieldaten, das Problem zu reproduzieren, die ich habe, und ich werde mich zu erklären versuchen: https://drive.google.com/file/d/0B4RCdYlVF8otUll6V2x0cDJORGc/view?usp=sharingGleicher Wert, aber anderes Ergebnis? Über removeSparseTerms (R)

Die Sache ist, dass ich unterschiedliche Ergebnisse von removeSparseTerms trotz der Einführung erhalten es ist der gleiche Wert. Es scheint der menschlichen Logik zu trotzen, oder zumindest der meiner. Ich habe diese Funktion:

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. 
     } 

Nun, als ich diese Funktion auf diese Weise aufzurufen:

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

I erhalten verschiedene Ausgänge in Abhängigkeit davon, wo die Variable RST in einem Vektor befindet, abhängig von den anderen Elementen . Das heißt, obwohl ich den gleichen Wert habe, bekomme ich deutliche Ergebnisse.

Zum Beispiel:

Fall 1:

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

werde ich RST = (0,45, 0,5, 0,55, 0,6), dann RST [p] 0,6 ist.

Das Ergebnis in diesem Fall:

> 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) 

Fall 2:

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

Ich habe nun, dass RST = (0,45, 0,5, 0,55, 0,6, 0,65, 0,7, 0,75 , 0.8), ergo RST [p] ist diesmal gleich (0.6).

Warum habe ich dann ein anderes Ergebnis? Ich kann es nicht verstehen.

> 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) 

Ich weiß nicht ... es ist sehr seltsam, oder ?. Wenn der Wert von RST derselbe ist, unterscheidet sich das Ergebnis von removeSparseTerms in den letzten zwei dirs jeweils. Bitte, hilf mir, ich weiß nicht, warum mich der Grund umbringt.

Vielen Dank und einen schönen Tag.


Reproduzierbare Beispiel auf der Grundlage der Aktualisierung des 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 wäre es besser gewesen, die Unterschiede hervorzuheben und Beispieldaten für die Reproduktion bereitzustellen, anstatt "Ich weiß nicht ... ich kann es nicht verstehen" mehrmals zu betonen. :-) – lukeA

+0

Ja, stimmt. Ich werde einen Zip mit den wichtigen Dokumenten und Teilen des Skripts vorbereiten, um sie hier so schnell wie möglich anzuhängen. Das tut mir leid. –

+0

Fertig. Beispieldaten angehängt und Stress in den Sätzen verringert ... ein bisschen. :) –

Antwort

0

Das Problem scheint die beliebte Frage "7.31 Why doesn’t R think these numbers are equal?" bezogen werden:

Die einzigen Zahlen, die genau dargestellt werden können in Rs numerischer Typ sind ganze Zahlen und Brüche, deren Nenner eine Potenz von 2 ist. Alle anderen Zahlen sind intern auf (typischerweise) 53 Binar gerundet y Ziffern Genauigkeit.Als Ergebnis zwei Gleitkommazahlen wird nicht zuverlässig gleich, wenn sie nicht durch den gleichen Algorithmus berechnet worden sind, und nicht immer auch dann

(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 

dann

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 
Gegeben

Seit

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

Ich denke, die beiden .5 sind hier zuverlässig gleich. Daher kann Ihre Funktion zu unterschiedlichen Ergebnissen führen.

+1

Vielen Dank lukeA. Nach Ihrer Antwort habe ich das Problem gelöst, indem ich den RST-Vektor mit ganzzahligen Werten erstellt habe: 'RST <-seq (45, 60, 5)', und zum Zeitpunkt des Aufrufs der Funktion gebe ich den RST-Wert zwischen 100: 'ein tdm.train <- lapply (Raum_name, TDM_roomRST, Zielzug, (RST [p]/100)) '. So ist das Ergebnis, das ich bekomme, in jedem Fall genau gleich. Im Ernst, ich schätze deine Hilfe und deine Implikationen hier sehr. Ich wünsche dir das Beste. Grüße und danke. –

Verwandte Themen