Cette interprétation de la rareté est-elle exacte?

10

Selon la documentation de la removeSparseTermsfonction du tmpackage, voici ce que la rareté implique:

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.

Donc, est-ce une interprétation correcte de ceci pour dire que si sparseest égal à .99, alors nous supprimons les termes qui n'apparaissent que dans au plus 1% des données?

zthomas.nc
la source
Cette question est plus appropriée pour Stackoverflow, où il existe des balises pour tm et text-mining.
Ken Benoit

Réponses:

16

Oui , bien que votre confusion soit compréhensible ici, car le terme «parcimonie» est difficile à définir clairement dans ce contexte.

Au sens de l' sparseargument de removeSparseTerms(), la rareté fait référence au seuil de fréquence relative du document pour un terme, au - dessus duquel le terme sera supprimé. La fréquence relative des documents signifie ici une proportion. Comme l'indique la page d'aide de la commande (mais pas très clairement), la rareté est plus petite à l'approche de 1.0. (Notez que la rareté ne peut pas prendre des valeurs de 0 ou 1.0, seulement des valeurs intermédiaires.)

Votre interprétation est donc correcte en ce sens qu'elle sparse = 0.99ne supprimera que les termes plus clairsemés que 0.99. L'interprétation exacte de sparse = 0.99est que pour le terme , vous conserverez tous les termes pour lesquels , où est le nombre de documents - dans ce cas, probablement tous les termes seront conservés (voir l'exemple ci-dessous) .jdfj>N(10.99)N

Près de l'autre extrême, si sparse = .01, alors seuls les termes qui apparaissent dans (presque) chaque document seront conservés. (Bien sûr, cela dépend du nombre de termes et du nombre de documents, et dans le langage naturel, des mots communs comme "le" sont susceptibles de se produire dans chaque document et ne sont donc jamais "clairsemés".)

Un exemple du seuil de rareté de 0,99, où un terme qui apparaît au maximum dans (premier exemple) moins de 0,01 documents, et (deuxième exemple) un peu plus de 0,01 documents:

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

Voici quelques exemples supplémentaires avec du texte et des termes réels:

> 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

Dans le dernier exemple avec sparse = 0.34, seuls les termes figurant dans les deux tiers des documents ont été conservés.

Une approche alternative pour rogner des termes à partir de matrices de termes de document en fonction d'une fréquence de document est le package d'analyse de texte quanteda . La même fonctionnalité ne fait pas référence ici à la rareté mais plutôt directement à la fréquence des termes du document (comme dans 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

Cette utilisation me semble beaucoup plus simple.

Ken Benoit
la source
1
Bienvenue sur le site Ken. Merci pour votre excellente réponse. J'espère que nous vous verrons plus.
Glen_b -Reinstate Monica