Чи точне тлумачення рідкості?


10

Відповідно до документації removeSparseTermsфункції з tmпакету, це тягне за собою рідкість:

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, що дорівнює .99, то ми видаляємо терміни, які відображаються лише у щонайменше 1% даних?


Це питання більше підходить для Stackoverflow, де є теги для tm та текстового пошуку.
Кен Бенуа

Відповіді:


16

Так , хоча ваша плутанина тут зрозуміла, оскільки термін "порядність" важко чітко визначити в цьому контексті.

У сенсі sparseаргументу до " removeSparseTerms()нерівномірність" посилається на поріг відносної частоти документа для терміну, вище якого термін буде видалений. Відносна частота документів тут означає пропорцію. Як показано на сторінці довідки для команди (хоча це не дуже чітко), обмеженість зменшується в міру наближення до 1,0. (Зверніть увагу, що розрідженість не може приймати значення 0 або 1,0, лише значення між ними.)

Таким чином, ваше тлумачення є правильним, що sparse = 0.99вилучатиме лише більш низькі терміни, ніж 0,99. Точне тлумачення sparse = 0.99полягає в тому, що для терміна ви збережете всі терміни, для яких , де - кількість документів - у цьому випадку, ймовірно, всі терміни будуть збережені (див. Приклад нижче) .jdfj>N(10.99)N

Якщо інша крайність, якщо sparse = .01, то зберігатимуться лише ті терміни, які відображаються в (майже) кожному документі. (Звичайно, це залежить від кількості термінів та кількості документів. На природній мові загальні слова типу "є", ймовірно, зустрічаються у кожному документі і, отже, ніколи не будуть "рідкими".)

Приклад порогу обмеженості 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, збережені лише терміни, що зустрічаються у двох третинах документів.

Альтернативним підходом до обрізання термінів з матриць документа на термін, заснованих на частоті документа, є пакет даних для аналізу тексту 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
Ласкаво просимо на сайт Кен. Дякую за відмінну відповідь. Я сподіваюся, що ми побачимо вас більше.
Glen_b -Встановіть Моніку
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.