Sí , aunque su confusión aquí es comprensible, ya que el término "escasez" es difícil de definir claramente en este contexto.
En el sentido del sparse
argumento de removeSparseTerms()
, la escasez se refiere al umbral de frecuencia relativa del documento para un término, por encima del cual se eliminará el término. La frecuencia relativa del documento aquí significa una proporción. Como dice la página de ayuda para el comando (aunque no con mucha claridad), la escasez es menor a medida que se acerca a 1.0. (Tenga en cuenta que la dispersión no puede tomar valores de 0 o 1.0, solo valores intermedios).
Entonces, su interpretación es correcta, ya que sparse = 0.99
eliminará solo los términos que son más escasos que 0.99. La interpretación exacta de sparse = 0.99
es que para el término , retendrá todos los términos para los cuales
, donde es el número de documentos; en este caso, probablemente todos los términos se retendrán (vea el ejemplo a continuación) .jdfj>N∗(1−0.99)N
Cerca del otro extremo, si sparse = .01
, entonces solo se retendrán los términos que aparecen en (casi) cada documento. (Por supuesto, esto depende de la cantidad de términos y la cantidad de documentos, y en lenguaje natural, es probable que aparezcan palabras comunes como "el" en cada documento y, por lo tanto, nunca sean "escasas").
Un ejemplo del umbral de dispersión de 0,99, donde un término que aparece como máximo en (primer ejemplo) menos de 0,01 documentos y (segundo ejemplo) un poco más de 0,01 documentos:
> # second term occurs in just 1 of 101 documents
> myTdm1 <- as.DocumentTermMatrix(slam::as.simple_triplet_matrix(matrix(c(rep(1, 101), rep(1,1), rep(0, 100)), ncol=2)),
+ weighting = weightTf)
> removeSparseTerms(myTdm1, .99)
<<DocumentTermMatrix (documents: 101, terms: 1)>>
Non-/sparse entries: 101/0
Sparsity : 0%
Maximal term length: 2
Weighting : term frequency (tf)
>
> # second term occurs in 2 of 101 documents
> myTdm2 <- as.DocumentTermMatrix(slam::as.simple_triplet_matrix(matrix(c(rep(1, 101), rep(1,2), rep(0, 99)), ncol=2)),
+ weighting = weightTf)
> removeSparseTerms(myTdm2, .99)
<<DocumentTermMatrix (documents: 101, terms: 2)>>
Non-/sparse entries: 103/99
Sparsity : 49%
Maximal term length: 2
Weighting : term frequency (tf)
Aquí hay algunos ejemplos adicionales con texto y términos reales:
> myText <- c("the quick brown furry fox jumped over a second furry brown fox",
"the sparse brown furry matrix",
"the quick matrix")
> require(tm)
> myVCorpus <- VCorpus(VectorSource(myText))
> myTdm <- DocumentTermMatrix(myVCorpus)
> as.matrix(myTdm)
Terms
Docs brown fox furry jumped matrix over quick second sparse the
1 2 2 2 1 0 1 1 1 0 1
2 1 0 1 0 1 0 0 0 1 1
3 0 0 0 0 1 0 1 0 0 1
> as.matrix(removeSparseTerms(myTdm, .01))
Terms
Docs the
1 1
2 1
3 1
> as.matrix(removeSparseTerms(myTdm, .99))
Terms
Docs brown fox furry jumped matrix over quick second sparse the
1 2 2 2 1 0 1 1 1 0 1
2 1 0 1 0 1 0 0 0 1 1
3 0 0 0 0 1 0 1 0 0 1
> as.matrix(removeSparseTerms(myTdm, .5))
Terms
Docs brown furry matrix quick the
1 2 2 0 1 1
2 1 1 1 0 1
3 0 0 1 1 1
En el último ejemplo con sparse = 0.34
, solo se conservaron los términos que aparecen en dos tercios de los documentos.
Un enfoque alternativo para recortar términos de matrices de términos de documentos basados en una frecuencia de documentos es el paquete de análisis de texto quanteda . La misma funcionalidad aquí no se refiere a la escasez, sino directamente a la frecuencia de los términos del documento (como en tf-idf ).
> require(quanteda)
> myDfm <- dfm(myText, verbose = FALSE)
> docfreq(myDfm)
a brown fox furry jumped matrix over quick second sparse the
1 2 1 2 1 2 1 2 1 1 3
> trim(myDfm, minDoc = 2)
Features occurring in fewer than 2 documents: 6
Document-feature matrix of: 3 documents, 5 features.
3 x 5 sparse Matrix of class "dfmSparse"
features
docs brown furry the matrix quick
text1 2 2 1 0 1
text2 1 1 1 1 0
text3 0 0 1 1 1
Este uso me parece mucho más sencillo.