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()
#beep()
fit1
Test-Set-Güte
Vorhersagen im Test-Set:
tic()
<-
preds predict(fit1, new_data = germeval_test)
toc()
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)
Prep/Bake
Als Check: Das gepreppte/bebackene Rezept:
tic()
<- prep(rec1)
rec1_prepped toc()
tic()
<- bake(rec1_prepped, new_data = NULL)
d_train_baked toc()
Sehr viele Spalten
Das Problem ist, dass dieses Rezept sehr viele Spalten erzeugt. Das ist (sehr) rechen- und speicherintensiv.
dim(d_train_baked)
|>
d_train_baked head()
Categories:
- textmining
- datawrangling
- germeval
- prediction
- tidymodels
- string