germeval08-schimpf

2023
textmining
datawrangling
germeval
prediction
tidymodels
string
Published

November 16, 2023

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.

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(syuzhet)
library(beepr)
data("schimpfwoerter", package = "pradadata")

Um ein Wörterbuch zu erzeugen für syuzhet braucht es eine Spalte value:

schimpfwoerter$value <- 1

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))
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.676
2 f_meas   binary         0.336

Als Check: Das gepreppte/bebackene Rezept:

tic()
rec1_prepped <- prep(rec1)
toc()
12.817 sec elapsed
tic()
d_train_baked <- bake(rec1_prepped, new_data = NULL)
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