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

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

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

3 ответа

Решение

В смысле 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 тогда будут сохраняться только те термины, которые встречаются в (почти) каждом документе. (Конечно, это зависит от количества терминов и количества документов, и на естественном языке общие слова, такие как "," могут встречаться в каждом документе и, следовательно, никогда не будут "редкими".)

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

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

В функции removeSparseTerms()аргумент sparse = x означает:
ms gstr "удалить все термины, редкость которых превышает пороговое значение (х)".
например: 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).

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

1- (сумма (no_off_times_of_the_individual_text_element)/ сумма (no_off_total_text_elements)) <= Set_Value

Другие вопросы по тегам