Точна ли эта интерпретация редкости?

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она равна 0,99, то мы удаляем термины, которые появляются не более чем в 1% данных?

zthomas.nc
источник
Этот вопрос больше подходит для Stackoverflow, где есть теги для tm и text mining.
Кен Бенуа

Ответы:

16

Да , хотя ваше замешательство здесь понятно, так как термин «разреженность» трудно четко определить в этом контексте.

В смысле sparseаргумента к removeSparseTerms(), разреженность относится к порогу относительной частоты документа для термина, выше которого термин будет удален. Относительная частота документа здесь означает пропорцию. Как говорится на странице справки для команды (хотя и не очень ясно), разреженность уменьшается по мере приближения к 1.0. (Обратите внимание, что разреженность не может принимать значения 0 или 1.0, только значения между ними.)

sparse = 0.99sparse = 0.99JdеJ>N*(1-0,99)N

Вблизи другой крайности, если sparse = .01, тогда будут сохраняться только те термины, которые встречаются в (почти) каждом документе. (Конечно, это зависит от количества терминов и количества документов, и на естественном языке общие слова, такие как «the», могут встречаться в каждом документе и, следовательно, никогда не будут «разреженными».)

Пример порога разреженности 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