library(tidyverse)
data("germeval_train", package = "pradadata")
data("germeval_test", package = "pradadata")
germeval04
2023
textmining
datawrangling
germeval
prediction
tidymodels
sentiment
string
Aufgabe
Erstellen Sie ein prädiktives Modell für Textdaten. Nutzen Sie Sentiments und TextFeatures 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(syuzhet)
library(beepr)
library(textrecipes)
data("sentiws", package = "pradadata")
Eine Vorlage für ein Tidymodels-Pipeline findet sich hier.
# model:
<-
mod1 nearest_neighbor(mode = "classification",
neighbors = tune())
# cv:
set.seed(42)
<- vfold_cv(d_train, v = 5)
rsmpl
# recipe:
<-
rec1 recipe(c1 ~ ., data = d_train) |>
update_role(id, new_role = "id") |>
#update_role(c2, new_role = "ignore") |>
update_role(text, new_role = "ignore") |>
step_mutate(n_emo = get_sentiment(text, # aus `syuzhet`
method = "custom",
lexicon = sentiws)) |>
step_textfeature(text) |>
step_zv(all_predictors()) |> # der vorherige Step erzeugt Features ohne Varianz
step_normalize(all_numeric_predictors())
# workflow:
<-
wf1 workflow() %>%
add_model(mod1) %>%
add_recipe(rec1)
Tuning:
tic()
<-
wf1_fit %>%
wf1 tune_grid(
resamples = rsmpl,
grid = 2, # nur um Zeit zu sparen
metrics = metric_set(accuracy, f_meas, roc_auc),
control = control_grid(verbose = TRUE))
toc()
68.604 sec elapsed
beep()
wf1_fit
# Tuning results
# 5-fold cross-validation
# A tibble: 5 × 4
splits id .metrics .notes
<list> <chr> <list> <list>
1 <split [4007/1002]> Fold1 <tibble [6 × 5]> <tibble [0 × 3]>
2 <split [4007/1002]> Fold2 <tibble [6 × 5]> <tibble [0 × 3]>
3 <split [4007/1002]> Fold3 <tibble [6 × 5]> <tibble [0 × 3]>
4 <split [4007/1002]> Fold4 <tibble [6 × 5]> <tibble [0 × 3]>
5 <split [4008/1001]> Fold5 <tibble [6 × 5]> <tibble [0 × 3]>
Finalisieren
<- select_best(wf1_fit) fit1_best
<- finalize_workflow(wf1, fit1_best)
wf1_final <- fit(wf1_final, data = d_train) wf1_final_fit
Vorhersagen:
<- predict(wf1_final_fit, germeval_test) preds
Test-Set-Güte
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.639
2 f_meas binary 0.286
Fazit
Eine Reihe der Text-Features passen nicht gut auf nicht-englische Texte.
Categories:
- 2023
- textmining
- datawrangling
- germeval
- prediction
- tidymodels
- sentiment
- string