ac_tf_idf() calcula a frequencia de termos (tf), a frequencia
inversa de documentos (idf) e o produto tf_idf a partir de uma
tabela de frequencias de termos (tipicamente o resultado de
ac_count()).
A funcao segue a mesma logica 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 minimo, 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 nao 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: frequencia do termo no documento/grupo;idf: frequencia 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 frequencia relativa do termo no documento;idfe log(N / df), em que N e o numero de documentos e df e o numero 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 vocabulario proprio de cada texto,
# nao os termos comuns a todos (que a frequencia bruta mostraria).
df <- data.frame(
id = paste0("d", 1:6),
texto = c(
"reforma tributaria 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 basica recebe recursos Fundeb Congresso",
"alfabetizacao idade certa meta Plano Nacional Educacao"
),
tema = rep(c("tributario", "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 tributaria 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
