library(tidyverse)
data("germeval_train", package = "pradadata")
data("germeval_test", package = "pradadata")
germeval08-schimpf
Aufgabe
Erstellen Sie ein prädiktives Modell für Textdaten. Nutzen Sie Schimpfwörter 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(syuzhet)
library(beepr)
data("schimpfwoerter", package = "pradadata")
Um ein Wörterbuch zu erzeugen für syuzhet
braucht es eine Spalte value
:
$value <- 1 schimpfwoerter
Eine Vorlage für ein Tidymodels-Pipeline findet sich hier.
Workflow
# model:
<-
mod1 rand_forest(mode = "classification")
# 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_schimpf = get_sentiment(text, # aus `syuzhet`
method = "custom",
lexicon = schimpfwoerter)) |>
step_rm(text) # Datensatz verschlanken
# workflow:
<-
wf1 workflow() %>%
add_model(mod1) %>%
add_recipe(rec1)
Fit
Ohne Tuning:
tic()
<-
fit1 fit(wf1,
data = d_train)
toc()
12.185 sec elapsed
#beep()
fit1
══ Workflow [trained] ══════════════════════════════════════════════════════════
Preprocessor: Recipe
Model: rand_forest()
── Preprocessor ────────────────────────────────────────────────────────────────
2 Recipe Steps
• step_mutate()
• step_rm()
── Model ───────────────────────────────────────────────────────────────────────
Ranger result
Call:
ranger::ranger(x = maybe_data_frame(x), y = y, num.threads = 1, verbose = FALSE, seed = sample.int(10^5, 1), probability = TRUE)
Type: Probability estimation
Number of trees: 500
Sample size: 5009
Number of independent variables: 1
Mtry: 1
Target node size: 10
Variable importance mode: none
Splitrule: gini
OOB prediction error (Brier s.): 0.2137385
Test-Set-Güte
Vorhersagen im Test-Set:
tic()
<-
preds predict(fit1, new_data = germeval_test)
toc()
7.444 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.676
2 f_meas binary 0.336
Als Check: Das gepreppte/bebackene Rezept:
tic()
<- prep(rec1)
rec1_prepped toc()
12.817 sec elapsed
tic()
<- bake(rec1_prepped, new_data = NULL)
d_train_baked toc()
0.006 sec elapsed
|>
d_train_baked arrange(-n_schimpf) |>
head()
# A tibble: 6 × 3
id c1 n_schimpf
<int> <fct> <dbl>
1 4493 OFFENSE 4
2 707 OFFENSE 3
3 771 OFFENSE 3
4 1504 OTHER 3
5 3145 OTHER 3
6 3354 OFFENSE 3
|>
d_train filter(id == 707) |>
pull(text)
[1] "@mastermikeg @machtjanix23 @AthinaMala @_macmike @Norbinator2403 @ennof_ @troll_putin @NancyPeggyMandy @petpanther0 @info2099 @lifetrend @ThomasGBauer @SchmiddieMaik @charlie_silve @NoHerrman @willjrosenblatt @feldenfrizz @nasanasal @ellibisathide @MD_Franz Der Typ hat sich mit etlichen hier angelegt, hat inhaltlich nichts zu bieten - nur Klugscheißern. Eigenes hat er auch nicht zu bieten - dafür reicht sein Intellekt nicht."
|>
d_train filter(id == 707) |>
select(text) |>
unnest_tokens(output = word, input = text) |>
inner_join(schimpfwoerter)
word value
1 typ 1
2 nichts 1
|>
d_train filter(id == 4493) |>
pull(text)
[1] "@Der_Eisenhans @focusonline Soweit mir bekannt ist das Wort Muschi ein kosenahme für eine Katze die es auch Geschlechts spezifisch gibt. Als Schwanz oder Schweif bezeichnet man das End Stück eines Pferdes oder Hund. Beides nicht Ursprung der Fortpflanzung. Ich hoffe ich konnte helfen. :-)"
|>
d_train filter(id == 4493) |>
select(text) |>
unnest_tokens(output = word, input = text) |>
inner_join(schimpfwoerter)
word value
1 katze 1
2 schwanz 1
3 schweif 1
4 stück 1
5 hund 1
Categories:
- 2023
- textmining
- datawrangling
- germeval
- prediction
- tidymodels
- string