Ya , meskipun kebingungan Anda di sini dapat dimengerti, karena istilah "sparsity" sulit untuk didefinisikan dengan jelas dalam konteks ini.
Dalam arti sparse
argumen 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.99
sparse = 0.99
jdfj>N∗(1−0.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.