¿Es precisa esta interpretación de la escasez?


10

Según la documentación de la removeSparseTermsfunción del tmpaquete, esto es lo que implica la escasez:

A term-document matrix where those terms from x are removed which have at least a sparse percentage of empty (i.e., terms occurring 0 times in a document) elements. I.e., the resulting matrix contains only terms with a sparse factor of less than sparse.

Entonces, ¿es una interpretación correcta de esto decir que si sparsees igual a .99, entonces estamos eliminando términos que solo aparecen en el 1% de los datos como máximo?


Esta pregunta es más apropiada para Stackoverflow, donde hay etiquetas para tm y minería de texto.
Ken Benoit

Respuestas:


16

, 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 sparseargumento 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.99eliminará solo los términos que son más escasos que 0.99. La interpretación exacta de sparse = 0.99es 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(10.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.


1
Bienvenido al sitio Ken. Gracias por tu excelente respuesta. Espero que te veamos más.
Glen_b -Reinstate Monica
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.