Skip to contents

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): cada doc_id e tratado como um documento;

  • com grupos (by = c("partido", ...)): cada combinacao de metadados e tratada como um "documento" no calculo de idf.

Usage

ac_tf_idf(x, by = NULL)

Arguments

x

Um data.frame ou tibble::tibble() contendo, no mínimo, as colunas token e n. Em geral, o resultado de ac_count().

by

Vetor de nomes de colunas em x que identificam documentos ou grupos. Se NULL (padrao), usa doc_id (que deve existir em x). Se não for NULL, cada combinacao de by e tratada como um documento no calculo de idf.

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: produto tf * idf.

Details

A definicao de tf, idf e tf_idf segue a literatura padrao de tf-idf em mineracao de texto:

  • tf e a frequência relativa do termo no documento;

  • idf e 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_idf e o produto tf * 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