Apakah interpretasi sparsity ini akurat?

10

Menurut dokumentasi removeSparseTermsfungsi dari tmpaket, inilah yang diperlukan sparsity:

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.

Jadi, apakah interpretasi yang benar dari ini mengatakan jika sparsesama dengan 0,99, maka kita menghapus istilah yang hanya muncul paling banyak 1% dari data?

zthomas.nc
sumber
Pertanyaan ini lebih cocok untuk Stackoverflow, di mana ada tag untuk tm dan penambangan teks.
Ken Benoit

Jawaban:

16

Ya , meskipun kebingungan Anda di sini dapat dimengerti, karena istilah "sparsity" sulit untuk didefinisikan dengan jelas dalam konteks ini.

Dalam arti sparseargumen untuk removeSparseTerms(), sparsity mengacu pada ambang frekuensi dokumen relatif untuk suatu istilah, di atas mana istilah tersebut akan dihapus. Frekuensi dokumen relatif di sini berarti proporsi. Saat halaman bantuan untuk perintah menyatakan (meskipun tidak terlalu jelas), sparsity lebih kecil saat mendekati 1.0. (Perhatikan bahwa sparsity tidak dapat mengambil nilai 0 atau 1.0, hanya nilai di antaranya.)

sparse = 0.99sparse = 0.99jdfj>N(10.99)N

Di dekat ekstrim lainnya, jika sparse = .01, maka hanya istilah yang muncul dalam (hampir) setiap dokumen yang akan dipertahankan. (Tentu saja ini tergantung pada jumlah istilah dan jumlah dokumen, dan dalam bahasa alami, kata-kata umum seperti "the" cenderung muncul di setiap dokumen dan karenanya tidak pernah menjadi "jarang".)

Contoh ambang sparsity 0,99, di mana istilah yang paling banyak muncul di (contoh pertama) kurang dari 0,01 dokumen, dan (contoh kedua) lebih dari 0,01 dokumen:

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

Berikut adalah beberapa contoh tambahan dengan teks dan istilah yang sebenarnya:

> 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

Dalam contoh terakhir dengan sparse = 0.34, hanya istilah yang muncul dalam dua pertiga dari dokumen yang dipertahankan.

Pendekatan alternatif untuk memotong istilah dari matriks istilah dokumen berdasarkan frekuensi dokumen adalah paket analisis teks kuanteda . Fungsionalitas yang sama di sini merujuk bukan pada sparsity melainkan langsung ke frekuensi dokumen istilah (seperti dalam 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

Penggunaan ini tampaknya jauh lebih mudah bagi saya.

Ken Benoit
sumber
1
Selamat datang di situs Ken. Terima kasih atas jawaban Anda yang luar biasa. Saya harap kami melihat lebih banyak dari Anda.
Glen_b -Reinstate Monica