Как работает 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