Sim , embora sua confusão aqui seja compreensível, já que o termo "esparsidade" é difícil de definir claramente nesse contexto.
No sentido do sparse
argumento para removeSparseTerms()
, esparsidade refere-se ao limite da frequência relativa do documento para um termo, acima do qual o termo será removido. A frequência relativa de documentos aqui significa uma proporção. Como declara a página de ajuda do comando (embora não seja muito clara), a escarsidade é menor à medida que se aproxima da versão 1.0. (Observe que a dispersão não pode aceitar valores de 0 ou 1,0, apenas valores entre eles.)
Portanto, sua interpretação está correta, pois sparse = 0.99
removerá apenas termos mais esparsos que 0,99. A interpretação exata para sparse = 0.99
é que, para o termo , você manterá todos os termos para os quais
, onde é o número de documentos - nesse caso, provavelmente todos os termos serão mantidos (veja o exemplo abaixo) .jdfj> N∗ ( 1 - 0,99 )N
Perto do outro extremo, se sparse = .01
, somente os termos que aparecem em (quase) todos os documentos serão mantidos. (Obviamente, isso depende do número de termos e do número de documentos e, em linguagem natural, palavras comuns como "o" provavelmente ocorrerão em todos os documentos e, portanto, nunca serão "esparsas".)
Um exemplo do limite de escassez de 0,99, em que um termo que ocorre no máximo em (primeiro exemplo) menos de 0,01 documentos e (segundo exemplo) pouco mais de 0,01 documentos:
> # 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)
Aqui estão alguns exemplos adicionais com texto e termos reais:
> 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
No último exemplo de sparse = 0.34
, apenas os termos que ocorrem em dois terços dos documentos foram mantidos.
Uma abordagem alternativa para aparar termos de matrizes de termo de documento com base na frequência de um documento é o pacote de análise de texto quanteda . A mesma funcionalidade aqui se refere não à escarsidade, mas diretamente à frequência dos termos do documento (como em 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
Esse uso parece muito mais direto para mim.