Bu seyreklik yorumu doğru mu?


10

removeSparseTermsFonksiyonun tmpaketteki belgelerine göre, seyreklik budur:

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.

Öyleyse, bunun sparse.99'a eşit olup olmadığını söylemek için doğru bir yorum mu var , o zaman verilerin sadece en fazla% 1'inde görünen terimleri kaldırıyoruz?


Bu soru, tm ve metin madenciliği için etiketlerin bulunduğu Stackoverflow için daha uygundur.
Ken Benoit

Yanıtlar:


16

Evet , buradaki karışıklığınız anlaşılabilir olsa da, "sparisite" teriminin bu bağlamda açıkça tanımlanması zordur.

sparseTartışması anlamında removeSparseTerms(), uzama , üzerinde terimin kaldırılacağı bir terim için göreli belge sıklığı eşiğini ifade eder . Burada göreli belge sıklığı bir oran anlamına gelir. Komutun yardım sayfası (çok açık olmasa da), 1.0'a yaklaştıkça sparisite daha küçüktür . (Sparitenin 0 veya 1.0 değerlerini alamayacağını, yalnızca aradaki değerleri alacağını unutmayın.)

Yani yorumunuz doğrudur, sparse = 0.99sadece 0,99'dan daha seyrek olan terimleri kaldıracaktır . İçin kesin yorum sparse = 0.99şudur:j, tüm şartları koruyacaksınız dfj>N(10.99), nerede N belge sayısıdır - bu durumda muhtemelen tüm terimler korunur (aşağıdaki örneğe bakın).

Diğer uç noktaya yakınsa, sparse = .01yalnızca her belgede (neredeyse) görünen terimler korunur. (Tabii ki bu, terimlerin sayısına ve belge sayısına bağlıdır ve doğal dilde, "the" gibi ortak kelimelerin her belgede olması muhtemeldir ve bu nedenle asla "seyrek" olmaz.)

0.99'luk bir uzama eşiği örneği, burada en fazla (ilk örnek) 0.01'den az belgede ve (ikinci örnek) 0.01'den biraz fazla belgede ortaya çıkan bir terim:

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

Aşağıda gerçek metin ve terimler içeren birkaç ek örnek verilmiştir:

> 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

İle son örnekte sparse = 0.34, sadece belgelerin üçte ikisinde meydana gelen terimler korunmuştur.

Belge frekansına dayalı olarak belge terimi matrislerinden terimleri kırpmak için alternatif bir yaklaşım, metin analiz paketi quanteda'dır . Burada aynı işlevsellik, seyrekliği değil, doğrudan terimlerin belge sıklığını ifade eder ( tf-idf'deki gibi ).

> 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

Bu kullanım benim için çok daha basit görünüyor.


1
Ken sitesine hoş geldiniz. Mükemmel cevabınız için teşekkürler. Umarım daha fazla görüşürüz.
Glen_b
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.