ac_tf_idf() calcula a frequência de termos (tf), a frequência
inversa de documentos (idf) e o produto tf_idf a partir de uma
tabela de frequências de termos (tipicamente o resultado de
ac_count()).
A função segue a mesma lógica de tidytext::bind_tf_idf(), mas
adaptada para o fluxo de trabalho do pacote:
sem grupos (
by = NULL): cadadoc_ide tratado como um documento;com grupos (
by = c("partido", ...)): cada combinacao de metadados e tratada como um "documento" no calculo deidf.
Arguments
- x
Um
data.frameoutibble::tibble()contendo, no mínimo, as colunastokenen. Em geral, o resultado deac_count().- by
Vetor de nomes de colunas em
xque identificam documentos ou grupos. SeNULL(padrao), usadoc_id(que deve existir emx). Se não forNULL, cada combinacao debye tratada como um documento no calculo deidf.
Value
Um tibble::tibble() com as colunas originais de x mais
tres colunas numeric as:
tf: frequência do termo no documento/grupo;idf: frequência inversa de documentos;tf_idf: produtotf * idf.
Details
A definicao de tf, idf e tf_idf segue a literatura padrao de
tf-idf em mineracao de texto:
tfe a frequência relativa do termo no documento;idfe log(N / df), em que N e o número de documentos e df e o número de documentos que contem o termo;tf_idfe o produtotf * idf.
A tabela de entrada deve ter exatamente uma linha por combinacao de documento/grupo e termo (isto e, uma linha por termo-em-documento).
Examples
# Corpus com discursos sobre tres agendas distintas.
# TF-IDF vai destacar o vocabulário proprio de cada texto,
# não os termos comuns a todos (que a frequência bruta mostraria).
df <- data.frame(
id = paste0("d", 1:6),
texto = c(
"reforma tributária simplifica sistema impostos empresas",
"IVA dual substitui PIS COFINS ICMS federal",
"programa habitacional amplia recursos moradia popular urbana",
"deficit habitacional afeta familias baixa renda cidades",
"educacao básica recebe recursos Fundeb Congresso",
"alfabetizacao idade certa meta Plano Nacional Educacao"
),
tema = rep(c("tributário", "habitacao", "educacao"), each = 2),
stringsAsFactors = FALSE
)
corp <- ac_corpus(df, text = texto, docid = id)
# TF-IDF por documento
freq <- ac_count(corp)
tfidf <- ac_tf_idf(freq)
head(tfidf)
#> # A tibble: 6 × 6
#> doc_id token n tf idf tf_idf
#> <chr> <chr> <int> <dbl> <dbl> <dbl>
#> 1 d1 empresas 1 0.167 1.79 0.299
#> 2 d1 impostos 1 0.167 1.79 0.299
#> 3 d1 reforma 1 0.167 1.79 0.299
#> 4 d1 simplifica 1 0.167 1.79 0.299
#> 5 d1 sistema 1 0.167 1.79 0.299
#> 6 d1 tributária 1 0.167 1.79 0.299
# TF-IDF por tema (cada tema tratado como "documento agregado")
freq_by <- ac_count(corp, by = "tema")
tfidf_by <- ac_tf_idf(freq_by, by = "tema")
head(tfidf_by)
#> # A tibble: 6 × 6
#> tema token n tf idf tf_idf
#> <chr> <chr> <int> <dbl> <dbl> <dbl>
#> 1 habitacao habitacional 2 0.143 1.10 0.157
#> 2 educacao Congresso 1 0.0769 1.10 0.0845
#> 3 educacao Educacao 1 0.0769 1.10 0.0845
#> 4 educacao Fundeb 1 0.0769 1.10 0.0845
#> 5 educacao Nacional 1 0.0769 1.10 0.0845
#> 6 educacao Plano 1 0.0769 1.10 0.0845
