Czy ta interpretacja rzadkości jest dokładna?

10

Zgodnie z dokumentacją removeSparseTermsfunkcji z tmpakietu, to jest to, co wiąże się z rzadkością:

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.

Czy więc poprawna interpretacja tego sparsejest taka, że jeśli jest równa 0,99, to usuwamy terminy, które pojawiają się tylko w 1% danych?

zthomas.nc
źródło
To pytanie jest bardziej odpowiednie dla Stackoverflow, gdzie są tagi dla tm i eksploracji tekstu.
Ken Benoit,

Odpowiedzi:

16

Tak , chociaż twoje zamieszanie tutaj jest zrozumiałe, ponieważ określenie „rzadkość” jest trudne do jednoznacznego zdefiniowania w tym kontekście.

W sensie sparseargumentu „ removeSparseTerms()rzadkość” odnosi się do progu względnej częstotliwości dokumentów dla terminu, powyżej którego termin zostanie usunięty. Względna częstotliwość dokumentów oznacza tutaj proporcję. Jak podaje strona pomocy dla polecenia (choć niezbyt wyraźnie), rzadkość jest mniejsza, gdy zbliża się do 1.0. (Uwaga: rzadkość nie może przyjmować wartości 0 lub 1.0, tylko wartości pomiędzy.)

Więc twoja interpretacja jest poprawna, że sparse = 0.99usunie jedynie warunki, które są bardziej skąpe niż 0,99. Dokładna interpretacja sparse = 0.99jest taka, że ​​dla terminu wszystkie warunki, dla których , gdzie jest liczbą dokumentów - w tym przypadku prawdopodobnie wszystkie warunki zostaną zachowane (patrz przykład poniżej) .jotrefajot>N.(1-0,99)N.

W pobliżu drugiej skrajności, jeśli sparse = .01, wówczas tylko terminy pojawiające się w (prawie) każdym dokumencie zostaną zachowane. (Oczywiście zależy to od liczby terminów i liczby dokumentów, aw języku naturalnym popularne słowa takie jak „the” prawdopodobnie występują w każdym dokumencie, a zatem nigdy nie są „rzadkie”).

Przykład progu rzadkości wynoszącego 0,99, w którym termin występujący najwyżej w (pierwszym przykładzie) mniej niż 0,01 dokumentów, a (drugi przykład) nieco ponad 0,01 dokumentów:

> # 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)

Oto kilka dodatkowych przykładów z rzeczywistym tekstem i terminami:

> 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

W ostatnim przykładzie z zachowano sparse = 0.34tylko warunki występujące w dwóch trzecich dokumentów.

Alternatywnym podejściem do przycinania terminów z macierzy dokumentów w oparciu o częstotliwość dokumentów jest pakiet analizy tekstu quanteda . Ta sama funkcjonalność tutaj odnosi się nie do rzadkości, ale bezpośrednio do częstotliwości dokumentów w terminach (jak w 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

Takie użycie wydaje się o wiele łatwiejsze do mnie.

Ken Benoit
źródło
1
Witamy na stronie Ken. Dziękuję za twoją doskonałą odpowiedź. Mam nadzieję, że więcej was zobaczymy.
Glen_b