Ist diese Interpretation der Sparsity korrekt?

10

Laut der Dokumentation der removeSparseTermsFunktion aus dem tmPaket bedeutet dies Sparsamkeit:

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.

Ist eine korrekte Interpretation davon also zu sagen, wenn sparsegleich 0,99 ist, entfernen wir Begriffe, die nur in höchstens 1% der Daten vorkommen?

zthomas.nc
quelle
Diese Frage ist besser für Stackoverflow geeignet, wo es Tags für tm und Text-Mining gibt.
Ken Benoit

Antworten:

16

Ja , obwohl Ihre Verwirrung hier verständlich ist, da der Begriff "Sparsity" in diesem Zusammenhang schwer klar zu definieren ist.

Im Sinne des sparseArguments 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.99nur Begriffe entfernen, die mehr als 0,99 spärlich. Die genaue Interpretation für sparse = 0.99ist, 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 = .01nur 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.34wurden 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.

Ken Benoit
quelle
1
Willkommen auf der Seite Ken. Vielen Dank für Ihre hervorragende Antwort. Ich hoffe wir sehen mehr von dir.
Glen_b -Reinstate Monica