Essa interpretação da escarsidade é precisa?

10

De acordo com a documentação da removeSparseTermsfunção do tmpacote, é isso que a escarsidade implica:

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.

Então, é uma interpretação correta disso para dizer se sparseé igual a 0,99, então estamos removendo termos que aparecem apenas em no máximo 1% dos dados?

zthomas.nc
fonte
Esta pergunta é mais apropriada para o Stackoverflow, onde há tags para tm e mineração de texto.
Ken Benoit

Respostas:

16

Sim , embora sua confusão aqui seja compreensível, já que o termo "esparsidade" é difícil de definir claramente nesse contexto.

No sentido do sparseargumento 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.99removerá 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 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.

Ken Benoit
fonte
11
Bem-vindo ao site Ken. Obrigado pela sua excelente resposta. Espero que vejamos mais vocês.
Glen_b -Reinstate Monica