Ja , obwohl Ihre Verwirrung hier verständlich ist, da der Begriff "Sparsity" in diesem Zusammenhang schwer klar zu definieren ist.
Im Sinne des sparse
Arguments zu removeSparseTerms()
bezieht sich Sparsity auf den Schwellenwert der relativen Dokumenthäufigkeit für einen Begriff, oberhalb dessen der Begriff entfernt wird. Relative Dokumenthäufigkeit bedeutet hier einen Anteil. Wie auf der Hilfeseite für den Befehl angegeben (wenn auch nicht sehr deutlich), ist die Sparsity kleiner, wenn sie sich 1.0 nähert. (Beachten Sie, dass die Sparsity keine Werte von 0 oder 1,0 annehmen kann, sondern nur Werte dazwischen.)
So Ihre Interpretation richtig ist, dass sparse = 0.99
nur Begriffe entfernen, die mehr als 0,99 spärlich. Die genaue Interpretation für sparse = 0.99
ist, dass Sie für den Begriff alle Begriffe behalten, für die
, wobei die Anzahl der Dokumente ist - in diesem Fall werden wahrscheinlich alle Begriffe beibehalten (siehe Beispiel unten). .jdfj> N.∗ ( 1 - 0,99 )N.
In der Nähe des anderen Extrems werden sparse = .01
nur Begriffe beibehalten, die in (fast) jedem Dokument vorkommen. (Dies hängt natürlich von der Anzahl der Begriffe und der Anzahl der Dokumente ab. In der natürlichen Sprache kommen häufig verwendete Wörter wie "the" in jedem Dokument vor und sind daher niemals "spärlich".)
Ein Beispiel für die Sparsity-Schwelle von 0,99, wobei ein Begriff höchstens in (erstes Beispiel) weniger als 0,01 Dokumenten und (zweites Beispiel) etwas mehr als 0,01 Dokumenten vorkommt:
> # 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)
Hier sind einige zusätzliche Beispiele mit aktuellem Text und Begriffen:
> 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
Im letzten Beispiel mit sparse = 0.34
wurden nur Begriffe beibehalten, die in zwei Dritteln der Dokumente vorkommen.
Ein alternativer Ansatz zum Trimmen von Begriffen aus Dokumenttermmatrizen basierend auf einer Dokumenthäufigkeit ist das Textanalysepaket quanteda . Die gleiche Funktionalität bezieht sich hier nicht auf die Sparsity , sondern direkt auf die Dokumenthäufigkeit von Begriffen (wie 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
Diese Verwendung scheint mir viel einfacher zu sein.