04 de dezembro de 2018

Justificativa e objetivos

  • A representação espaço vetor é utilizada por muitas técnicas em mineração de texto.
  • As coordenadas dos documentos dependem das métricas usadas para construção da matriz de documentos e termos.
  • As métricas mais adotadas.

Ponderação da matriz de documentos e termos

Frequência dos termos

  • Expressa a frequência dos termos dentro de um documento.
  • Funções da quantidade de vezes que o termo aparece:
    • Linear: \(n(t) = \text{count}(t, d)\).
    • Indicadora ou binária: \(b(t) = I(n(t) > 0)\).
    • Logarítmica: \(l(t) = \log(n(t) + 1)\).
    • Outras funções sublineares.
  • Evitam o predomínio das palavras mais frequentes.

Frequência dos documentos

  • Uma palavra que ocorre em todos os documento diz muito pouco sobre cada um deles.
  • Usa-se dar mais peso para palavras no corpus que ocorrem em poucos documentos.
  • Frequência inversa dos documentos: \[ \text{IDF}(t) = \log\left(\frac{\text{count}(d, C) + 1}{\text{count}(d: t \in d, C)}\right). \]
  • Em algumas referências pode não aparecer o \(+1\) no numerador.

Ponderação de cada termo

  • Combina a frequência no termo no documento com a ocorrência dele na coleção.
  • A medida mais adotada é a TF-IDF.
  • O peso de um termo no documento é \[ w(t, d) = \text{TF}(t, d) \times \text{IDF}(t) \]

Aplicação com o R

Importação dos textos

library(tm)

# Arquivo com uma lista contendo textos.
load(file = "scripts/ufpr-news.RData")

length(ufpr)
str(ufpr[[1]])

# Para criar um data.frame da lista.
L <- lapply(ufpr, FUN = "[",
            c("id_noticia", "ts_publicacao", "str_titulo"))
L <- lapply(L, FUN = as.data.frame, stringsAsFactors = FALSE)
da <- do.call(what = plyr::rbind.fill, args = L)

# Encurta os nomes.
names(da) <- gsub("^[^_]*_", "", names(da))

# Cria a variável dia da notícia como data.
da$dia <- strptime(da$publicacao, "%Y-%m-%d")
str(da)

Criação do corpus

# Pega apenas documentos de uma data.
db <- subset(da, dia == "2017-03-24")
cps <- VCorpus(VectorSource(x = db$titulo),
               readerControl = list(language = "pt", load = TRUE))
content(cps[[1]])
## [1] "Marta é aquela que lê"
content(cps[[4]])
## [1] "Feira de carreiras na UFPR tem entrada gratuita nos dois dias"
content(cps[[5]])
## [1] "Pezão defende cortar salário de professor da Uerj"

Pré-processamento

# Pré-processamento.
cps <- tm_map(cps, FUN = content_transformer(tolower))
cps <- tm_map(cps, FUN = removePunctuation)
cps <- tm_map(cps, FUN = removeNumbers)
cps <- tm_map(cps, FUN = removeWords, words = stopwords("portuguese"))
cps <- tm_map(cps, FUN = stripWhitespace)
cps <- tm_map(cps, FUN = content_transformer(trimws))
content(cps[[1]])
## [1] "marta é lê"
content(cps[[4]])
## [1] "feira carreiras ufpr entrada gratuita dois dias"
content(cps[[5]])
## [1] "pezão defende cortar salário professor uerj"

Criação da matriz de documentos e termos

apropos("^weight[A-Z]", ignore.case = FALSE)
## [1] "weightBin"   "weightSMART" "weightTf"    "weightTfIdf"
dtm <- DocumentTermMatrix(cps, control = list(weighting = weightTfIdf))
dtm
## <<DocumentTermMatrix (documents: 109, terms: 210)>>
## Non-/sparse entries: 746/22144
## Sparsity           : 97%
## Maximal term length: 14
## Weighting          : term frequency - inverse document frequency (normalized) (tf-idf)
nTerms(dtm)
## [1] 210
nDocs(dtm)
## [1] 109

Referências