Saltar al contenido

¿Cómo funciona removeSparseTerms en R?

Nuestro team de redactores ha pasado mucho tiempo buscando para darle solución a tu búsqueda, te compartimos la respuesta por eso nuestro objetivo es resultarte de gran apoyo.

Solución:

En el sentido de la sparse argumento para removeSparseTerms(), la escasez se refiere al umbral de frecuencia relativa de documentos por un término, por encima del cual el término será eliminado. La frecuencia relativa de los documentos aquí significa una proporción. Como dice la página de ayuda para el comando (aunque no muy claramente), 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).

Por ejemplo, si configura sparse = 0.99 como argumento para removeSparseTerms(), esto eliminará solo los términos que son más escasa de 0,99. La interpretación exacta de sparse = 0.99 es que para el término $ j $, conservará todos los términos para los cuales $ df_j> N * (1 – 0,99) $, donde $ N $ es el número de documentos; en este caso, probablemente se conservarán todos los términos (consulte el ejemplo debajo).

Cerca del otro extremo, si sparse = .01, solo se conservarán los términos que aparezcan en (casi) todos los documentos. (Por supuesto, esto depende de la cantidad de términos y la cantidad de documentos, y en lenguaje natural, es probable que las palabras comunes como “the” aparezcan en todos los documentos y, por lo tanto, nunca sean “escasas”).

Un ejemplo del umbral de escasez de 0,99, donde un término que aparece como máximo en (primer ejemplo) menos de 0,01 documentos y (segundo ejemplo) 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)
<>
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)
<>
Non-/sparse entries: 103/99
Sparsity           : 49%
Maximal term length: 2
Weighting          : term frequency (tf)

A continuación, se muestran 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 los términos de las matrices de términos de documento en función de la frecuencia de un documento es el paquete de análisis de texto quanteda. La misma funcionalidad aquí se refiere no a escasez sino directamente al frecuencia del documento de términos (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 
> dfm_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.

En la función removeSparseTerms(), el argumento sparse = x significa:
“eliminar todos los términos cuya escasez sea mayor que el umbral (x)”.
p.ej: removeSparseTerms(my_dtm, sparse = 0.90) significa eliminar todos los términos del corpus cuya escasez sea superior al 90%.

Por ejemplo, un término que aparece solo 4 veces en un corpus de, digamos, tamaño 1000, tendrá una frecuencia de aparición de 0,004 = 4/1000.

La escasez de este término será (1000-4)/1000 = 1- 0.004 = 0.996 = 99.6%.
Por lo tanto, si el umbral de escasez se establece en escaso = 0.90, este término se eliminará como escasez (0.996) es mayor que la escasez del límite superior (0.90).
Sin embargo, si el umbral de dispersión se establece en sparse = 0.999, este término no se eliminará ya que su escasez (0.996) es menor que la escasez del límite superior (0.999).

Recuerda que tienes concesión de aclarar si encontraste tu contratiempo .

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *