library(tidyverse)
data("germeval_train", package = "pradadata")
data("germeval_test", package = "pradadata")
germeval09-tfidf
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.
Die AV lautet c1
. Die (einzige) UV lautet: text
.
Hinweise:
- Orientieren Sie sich im Übrigen an den allgemeinen Hinweisen des Datenwerks.
- Nutzen Sie Tidymodels.
- Nutzen Sie das
sentiws
Lexikon.
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))
<- metric_set(accuracy, f_meas)
my_metrics 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()
<- prep(rec1)
rec1_prepped toc()
3.376 sec elapsed
tic()
<- bake(rec1_prepped, new_data = NULL)
d_train_baked 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