Questa interpretazione della scarsità è accurata?


10

Secondo la documentazione della removeSparseTermsfunzione dal tmpacchetto, questo è ciò che comporta la scarsità:

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.

Quindi, una corretta interpretazione di questo è dire se sparseè uguale a 0,99, quindi stiamo rimuovendo termini che compaiono solo al massimo nell'1% dei dati?


Questa domanda è più appropriata per StackOverflow, dove sono presenti tag per tm e text-mining.
Ken Benoit,

Risposte:


16

, anche se la tua confusione qui è comprensibile, poiché il termine "scarsità" è difficile da definire chiaramente in questo contesto.

Nel senso sparsedell'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.99rimuoverà 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.


1
Benvenuti nel sito Ken. Grazie per la tua eccellente risposta. Spero di vederti di più.
Glen_b
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.