library(tidyverse)
data("germeval_train", package = "pradadata")
data("germeval_test", package = "pradadata")
germeval07
Aufgabe
Erstellen Sie ein prädiktives Modell für Textdaten. Nutzen Sie deutsche Word-Vektoren für das 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 Wikipedia2Vec als Grundlage für die Wordembeddings in deutscher Sprache. Laden Sie die Daten herunter (Achtung: ca. 2.8 GB).
Lösung
<-
d_train |>
germeval_train select(id, c1, text)
library(tictoc)
library(tidymodels)
library(syuzhet)
library(beepr)
library(textrecipes)
Eine Vorlage für ein Tidymodels-Pipeline findet sich hier.
Deutsche Textvektoren importieren
<- "/Users/sebastiansaueruser/datasets/word-embeddings/wikipedia2vec/dewiki_20180420_100d.txt"
wiki_de_embeds_path
tic()
<- arrow::read_feather(file = "/Users/sebastiansaueruser/datasets/word-embeddings/wikipedia2vec/part-0.arrow")
wiki_de_embeds toc()
0.558 sec elapsed
names(wiki_de_embeds)[1] <- "word"
<- as_tibble(wiki_de_embeds) wiki
Die Arrow-Datei ist viel schneller zu importieren als die Text-Datei.
tic()
<-
wiki_de_embeds ::fread(file = wiki_de_embeds_path,
data.tablesep = " ",
header = FALSE,
showProgress = FALSE) # progressbar
toc()
Als Parquet-Datei speichern (effizienter):
tic()
::write_dataset(wiki_de_embeds, path = "/Users/sebastiansaueruser/datasets/word-embeddings/wikipedia2vec",
arrowformat = "arrow")
toc()
Workflow
# model:
<-
mod1 logistic_reg()
# recipe:
<-
rec1 recipe(c1 ~ ., data = d_train) |>
update_role(id, new_role = "id") |>
#update_role(c2, new_role = "ignore") |>
step_tokenize(text) %>%
step_stopwords(text, language = "de", stopword_source = "snowball") |>
step_word_embeddings(text,
embeddings = wiki,
aggregation = "mean") |>
step_normalize(all_numeric_predictors())
# workflow:
<-
wf1 workflow() %>%
add_model(mod1) %>%
add_recipe(rec1)
Preppen/Baken
tic()
<- prep(rec1)
rec1_prepped toc()
25.165 sec elapsed
<-
d_train_baked bake(rec1_prepped, new_data = NULL)
head(d_train_baked)
# A tibble: 6 × 102
id c1 wordembed_text_V2 wordembed_text_V3 wordembed_text_V4
<int> <fct> <dbl> <dbl> <dbl>
1 1 OTHER 0.557 -0.140 1.24
2 2 OTHER -0.552 0.291 0.195
3 3 OTHER -0.850 -0.473 -0.367
4 4 OTHER 0.953 -1.48 0.0741
5 5 OFFENSE 0.436 -0.885 -0.112
6 6 OTHER -0.453 0.333 0.0949
# ℹ 97 more variables: wordembed_text_V5 <dbl>, wordembed_text_V6 <dbl>,
# wordembed_text_V7 <dbl>, wordembed_text_V8 <dbl>, wordembed_text_V9 <dbl>,
# wordembed_text_V10 <dbl>, wordembed_text_V11 <dbl>,
# wordembed_text_V12 <dbl>, wordembed_text_V13 <dbl>,
# wordembed_text_V14 <dbl>, wordembed_text_V15 <dbl>,
# wordembed_text_V16 <dbl>, wordembed_text_V17 <dbl>,
# wordembed_text_V18 <dbl>, wordembed_text_V19 <dbl>, …
Tuninig/Fitting
tic()
<-
wf1_fit %>%
wf1 fit(data = d_train)
toc()
10.085 sec elapsed
beep()
Aus Zeitgründen verzichten wir hier auf Tuning.
Test-Set-Güte
Vorhersagen im Test-Set:
tic()
<-
preds predict(wf1_fit, new_data = germeval_test)
toc()
6.318 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.715
2 f_meas binary 0.533
Fazit
wikipedia2vec
ist für die deutsche Sprache vorgekocht. Das macht Sinn für einen deutschsprachigen Corpus.
Categories:
- 2023
- textmining
- datawrangling
- germeval
- prediction
- tidymodels
- string