การตีความของ sparsity นี้ถูกต้องหรือไม่?


10

ตามเอกสารของremoveSparseTermsฟังก์ชั่นจากtmแพคเกจนี่คือสิ่งที่ 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.

ดังนั้นการตีความที่ถูกต้องของสิ่งนี้คือการพูดว่าถ้าsparseเท่ากับ 0.99 เราจะลบคำที่ปรากฏในที่สุด 1% ของข้อมูลหรือไม่


คำถามนี้เหมาะสมกว่าสำหรับ Stackoverflow ที่มีแท็กสำหรับ tm และ text-mining
เคนเบอนัวต์

คำตอบ:


16

ใช่แม้ว่าความสับสนของคุณที่นี่จะเข้าใจได้เนื่องจากคำว่า "sparsity" นั้นยากที่จะนิยามอย่างชัดเจนในบริบทนี้

ในแง่ของการsparseโต้แย้งremoveSparseTerms(), sparsity หมายถึงเกณฑ์ของความถี่เอกสารที่สัมพันธ์กันสำหรับคำหนึ่งซึ่งเหนือคำที่จะถูกลบออก ความถี่เอกสารสัมพันธ์ที่นี่หมายถึงสัดส่วน ในฐานะที่เป็นหน้าช่วยเหลือสำหรับสถานะคำสั่ง (แม้ว่าจะยังไม่ชัดเจนมาก) กระจัดกระจายมีขนาดเล็กลงเมื่อใกล้ถึง 1.0 (โปรดทราบว่า sparsity ไม่สามารถรับค่าเป็น 0 หรือ 1.0 ได้เฉพาะค่าระหว่างเท่านั้น)

ดังนั้นการตีความของคุณถูกต้องในการที่sparse = 0.99จะลบเฉพาะคำที่มากขึ้นเบาบางกว่า 0.99 การตีความที่แน่นอนsparse = 0.99สำหรับคำนั้นJคุณจะรักษาข้อกำหนดทั้งหมดที่ dJ>ยังไม่มีข้อความ* * * *(1-0.99)ที่ไหน ยังไม่มีข้อความ คือจำนวนของเอกสาร - ในกรณีนี้อาจเป็นไปตามเงื่อนไขทั้งหมด (ดูตัวอย่างด้านล่าง)

ใกล้สุดขั้วอื่นถ้าหากsparse = .01มีเพียงคำที่ปรากฏใน (เกือบ) ทุกเอกสารจะถูกเก็บไว้ (แน่นอนขึ้นอยู่กับจำนวนคำและจำนวนเอกสารและในภาษาธรรมชาติคำทั่วไปเช่น "the" มีแนวโน้มที่จะเกิดขึ้นในเอกสารทุกฉบับและดังนั้นจึงไม่เคย "กระจัดกระจาย")

ตัวอย่างของเกณฑ์ sparsity ที่ 0.99 ซึ่งคำที่เกิดขึ้นมากที่สุดใน (ตัวอย่างแรก) น้อยกว่า 0.01 เอกสารและ (ตัวอย่างที่สอง) มากกว่า 0.01 เอกสาร:

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

นี่คือตัวอย่างเพิ่มเติมบางส่วนที่มีข้อความและคำศัพท์จริง:

> 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

ในตัวอย่างสุดท้ายที่มีsparse = 0.34เฉพาะคำที่เกิดขึ้นในสองในสามของเอกสารเท่านั้นที่จะถูกเก็บไว้

วิธีทางเลือกสำหรับการตัดแต่งแง่จาก matrixes เอกสารระยะตามความถี่เอกสารเป็นแพคเกจการวิเคราะห์ข้อความ quanteda ฟังก์ชันการทำงานเดียวกันที่นี่หมายถึงไม่กระจัดกระจายแต่จะตรงกับความถี่เอกสารของคำศัพท์ (เช่นใน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

การใช้งานนี้ดูเหมือนตรงไปตรงมากับฉันมากขึ้น


1
ยินดีต้อนรับสู่เว็บไซต์ Ken ขอบคุณสำหรับคำตอบที่ยอดเยี่ยมของคุณ ฉันหวังว่าเราจะเห็นคุณมากขึ้น
Glen_b
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.