Sì , anche se la tua confusione qui è comprensibile, poiché il termine "scarsità" è difficile da definire chiaramente in questo contesto.
Nel senso sparse
dell'argomento removeSparseTerms()
, la scarsità si riferisce alla soglia della frequenza relativa del documento per un termine, al di sopra del quale il termine verrà rimosso. La frequenza relativa del documento qui significa una proporzione. Come indicato nella pagina di aiuto per il comando (anche se non in modo molto chiaro), la scarsità è più piccola quando si avvicina a 1.0. (Si noti che la sparsità non può assumere valori di 0 o 1.0, solo valori in mezzo.)
Quindi la tua interpretazione è corretta in quanto sparse = 0.99
rimuoverà solo termini più sparsi di 0,99. L'interpretazione esatta per sparse = 0.99
è che per il termine , manterrai tutti i termini per i quali
, dove è il numero di documenti - in questo caso probabilmente verranno conservati tutti i termini (vedi esempio sotto) .jdfj> N∗ ( 1 - 0,99 )N
Vicino all'altro estremo, se sparse = .01
, verranno mantenuti solo i termini che compaiono in (quasi) ogni documento. (Naturalmente questo dipende dal numero di termini e dal numero di documenti, e in linguaggio naturale, è probabile che parole comuni come "il" si verifichino in ogni documento e quindi non siano mai "sparse".)
Un esempio della soglia di scarsità di 0,99, in cui un termine che si verifica al massimo in (primo esempio) meno di 0,01 documenti e (secondo esempio) poco più di 0,01 documenti:
> # 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)
Ecco alcuni esempi aggiuntivi con testo e termini effettivi:
> 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
Nell'ultimo esempio con sparse = 0.34
, sono stati mantenuti solo i termini che si verificano nei due terzi dei documenti.
Un approccio alternativo per tagliare i termini dalle matrici di termini del documento in base alla frequenza di un documento è il quanteda del pacchetto di analisi del testo . La stessa funzionalità qui non si riferisce alla scarsità ma piuttosto direttamente alla frequenza dei termini del documento (come in 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
Questo utilizzo mi sembra molto più semplice.