germeval09-tfidf

textmining
datawrangling
germeval
prediction
tidymodels
string
Published

November 16, 2023

Aufgabe

Erstellen Sie ein prädiktives Modell für Textdaten, nutzen Sie einen Entscheidungsbaum als Modell. Erstellen Sie pro Wort tfIDF-Kennwerte im Rahmen von Feature-Engineering.

Nutzen Sie die GermEval-2018-Daten.

Die Daten sind unter CC-BY-4.0 lizensiert. Author: Wiegand, Michael (Spoken Language Systems, Saarland University (2010-2018), Leibniz Institute for the German Language (since 2019)),

Die Daten sind auch über das R-Paket PradaData zu beziehen.

library(tidyverse)
data("germeval_train", package = "pradadata")
data("germeval_test", package = "pradadata")

Die AV lautet c1. Die (einzige) UV lautet: text.

Hinweise:











Lösung

d_train <-
  germeval_train |> 
  select(id, c1, text)
library(tictoc)
library(tidymodels)
library(tidytext)
library(beepr)
library(textrecipes)  # step_tokenfilter, step_tokenize

Eine Vorlage für ein Tidymodels-Pipeline findet sich hier.

Workflow

# model:
mod1 <-
  decision_tree(mode = "classification")

# recipe:
rec1 <-
  recipe(c1 ~ ., data = d_train) |> 
  update_role(id, new_role = "id")  |> 
  step_tokenize(text) %>%
  step_tokenfilter(text, max_tokens = 1e3) %>%
  step_tfidf(text) %>%
  step_zv(all_predictors()) %>%
  step_normalize(all_numeric_predictors())

# workflow:
wf1 <-
  workflow() %>% 
  add_model(mod1) %>% 
  add_recipe(rec1)

Fit

Ohne Tuning:

tic()
fit1 <-
  fit(wf1,
      data = d_train)
toc()
28.45 sec elapsed
#beep()
fit1
══ Workflow [trained] ══════════════════════════════════════════════════════════
Preprocessor: Recipe
Model: decision_tree()

── Preprocessor ────────────────────────────────────────────────────────────────
5 Recipe Steps

• step_tokenize()
• step_tokenfilter()
• step_tfidf()
• step_zv()
• step_normalize()

── Model ───────────────────────────────────────────────────────────────────────
n= 5009 

node), split, n, loss, yval, (yprob)
      * denotes terminal node

1) root 5009 1688 OTHER (0.3369934 0.6630066)  
  2) tfidf_text_merkel>=1.084677 279  117 OFFENSE (0.5806452 0.4193548) *
  3) tfidf_text_merkel< 1.084677 4730 1526 OTHER (0.3226216 0.6773784) *

Test-Set-Güte

Vorhersagen im Test-Set:

tic()
preds <-
  predict(fit1, new_data = germeval_test)
toc()
0.453 sec elapsed

Und die Vorhersagen zum Test-Set hinzufügen, damit man TRUTH und ESTIMATE vergleichen kann:

d_test <-
  germeval_test |> 
  bind_cols(preds) |> 
  mutate(c1 = as.factor(c1))
my_metrics <- metric_set(accuracy, f_meas)
my_metrics(d_test,
           truth = c1,
           estimate = .pred_class)
# A tibble: 2 × 3
  .metric  .estimator .estimate
  <chr>    <chr>          <dbl>
1 accuracy binary        0.657 
2 f_meas   binary        0.0706

Prep/Bake

Als Check: Das gepreppte/bebackene Rezept:

tic()
rec1_prepped <- prep(rec1)
toc()
3.376 sec elapsed
tic()
d_train_baked <- bake(rec1_prepped, new_data = NULL)
toc()
0.026 sec elapsed

Sehr viele Spalten

Das Problem ist, dass dieses Rezept sehr viele Spalten erzeugt. Das ist (sehr) rechen- und speicherintensiv.

dim(d_train_baked)
[1] 5009 1002
d_train_baked |> 
  head()
# A tibble: 6 × 1,002
     id c1      tfidf_text__macmike tfidf_text_1 tfidf_text_10 tfidf_text_100
  <int> <fct>                 <dbl>        <dbl>         <dbl>          <dbl>
1     1 OTHER                -0.137      -0.0692       -0.0531        -0.0475
2     2 OTHER                -0.137      -0.0692       -0.0531        -0.0475
3     3 OTHER                -0.137      -0.0692       -0.0531        -0.0475
4     4 OTHER                -0.137      -0.0692       -0.0531        -0.0475
5     5 OFFENSE              -0.137      -0.0692       -0.0531        -0.0475
6     6 OTHER                -0.137      -0.0692       -0.0531        -0.0475
# ℹ 996 more variables: tfidf_text_12 <dbl>, tfidf_text_14 <dbl>,
#   tfidf_text_15 <dbl>, tfidf_text_19 <dbl>, tfidf_text_2 <dbl>,
#   tfidf_text_20 <dbl>, tfidf_text_2017 <dbl>, tfidf_text_2018 <dbl>,
#   tfidf_text_3 <dbl>, tfidf_text_30 <dbl>, tfidf_text_4 <dbl>,
#   tfidf_text_5 <dbl>, tfidf_text_6 <dbl>, tfidf_text_66freedom66 <dbl>,
#   tfidf_text_8 <dbl>, tfidf_text_90 <dbl>, tfidf_text_a <dbl>,
#   tfidf_text_ab <dbl>, tfidf_text_abend <dbl>, tfidf_text_aber <dbl>, …

Categories:

  • textmining
  • datawrangling
  • germeval
  • prediction
  • tidymodels
  • string