Подтвердить что ты не робот

Как работает removeSparseTerms в R?

Я использую метод removeSparseTerms в R и ему нужно ввести пороговое значение. Я также читаю, что чем выше значение, тем больше будет количество слагаемых, сохраненных в возвращаемой матрице.

Как работает этот метод и какова его логика? Я понимаю концепцию разреженности, но определяет ли этот порог количество документов, которые должны присутствовать в терминах, или какое-то другое отношение и т.д.

4b9b3361

Ответ 1

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

Например, если вы установите sparse = 0.99 в качестве аргумента removeSparseTerms(), тогда будут удалены только те термины, которые более разрежены, чем 0,99. Точная интерпретация для sparse = 0.99 состоит в том, что для члена $ j $ вы сохраните все члены, для которых $ df_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 
> dfm_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

Это использование кажется мне гораздо более простым.

Ответ 2

В функции removeSparseTerms() аргумент sparse = x означает:
msgstr "удалить все термины, редкость которых превышает пороговое значение (x)".
например: removeSparseTerms(my_dtm, sparse = 0.90) означает удалить все термины в корпусе, разреженность которых превышает 90%.

Например, термин, который появляется, скажем, всего 4 раза в корпусе, скажем, размером 1000, будет иметь частоту появления 0,004 = 4/1000.

Этот термин будет редкостью (1000-4)/1000 = 1- 0.004 = 0.996 = 99.6%.
Поэтому, если для порога разреженности установлено значение sparse = 0,90, этот член будет удален, поскольку его разреженность (0.996) превышает разреженность верхней границы (0.90).
Однако, если порог разреженности установлен на sparse = 0.999, этот член не будет удален, поскольку его разреженность (0.996) ниже, чем разреженность верхней границы (0.999).

Ответ 3

Простая подобная частота элемента. Если вы установите значение как 0, он вернет все элементы, которые отображаются во всем тексте, где бы вы ни установили его как 1, он вернет весь текст в тексте. Если я выберу 0.5, это позволит мне просматривать только тексты, которые появляются в 50% случаев во всем элементе. Это делается путем вычисления после такой такой обработки, как

1- (sum (no_off_times_of_the_individual_text_element)/sum (no_off_total_text_elements)) <= Set_Value