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' sparse
argument 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.99
ne supprimera que les termes plus clairsemés que 0.99. L'interprétation exacte de sparse = 0.99
est 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∗(1−0.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.