germeval03-sent-wordvec-xgb

textmining
datawrangling
germeval
prediction
tidymodels
sentiment
string
xgb
Published

December 1, 2023

Aufgabe

Erstellen Sie ein prädiktives Modell für Textdaten. Nutzen Sie Sentiments und TextFeatures im Rahmen von Feature-Engineering. Nutzen Sie außerdem deutsche Word-Vektoren für das Feature-Engineering.

Als Lernalgorithmus verwenden Sie XGB.

Verwenden 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:

  • Orientieren Sie sich im Übrigen an den allgemeinen Hinweisen des Datenwerks.
  • Nutzen Sie Tidymodels.
  • Nutzen Sie das sentiws Lexikon.
  • ❗ Achten Sie darauf, die Variable c2 zu entfernen bzw. nicht zu verwenden.











Lösung

d_train <-
  germeval_train |> 
  select(id, c1, text)
library(tictoc)
library(tidymodels)
library(syuzhet)
library(beepr)
library(lobstr)  # object size
data("sentiws", package = "pradadata")

Eine Vorlage für ein Tidymodels-Pipeline findet sich hier.

Learner/Modell

mod <-
  boost_tree(mode = "classification",
             learn_rate = .01, 
             tree_depth = 5
             )

Rezept

Pfad zu den Wordvecktoren:

path_wordvec <- "/Users/sebastiansaueruser/datasets/word-embeddings/wikipedia2vec/part-0.arrow"
source("https://raw.githubusercontent.com/sebastiansauer/Datenwerk2/main/funs/def_recipe_wordvec_senti.R")

rec <- def_recipe_wordvec_senti(data_train = d_train,
                                path_wordvec = path_wordvec)

Workflow

source("https://raw.githubusercontent.com/sebastiansauer/Datenwerk2/main/funs/def_df.R")
wf <- def_wf()

wf

Check

tic()
rec_prepped <- prep(rec)
toc()

rec_prepped
obj_size(rec_prepped)

Groß!

tidy(rec_prepped)
d_rec_baked <- bake(rec_prepped, new_data = NULL)

head(d_rec_baked)
sum(is.na(d_rec_baked))
obj_size(d_rec_baked)

Fit

tic()
fit_wordvec_senti_xgb <-
  fit(wf,
      data = d_train)
toc()
beep()
fit_wordvec_senti_xgb

Objekt-Größe:

lobstr::obj_size(fit_wordvec_senti_xgb)

Groß!

Wie wir gesehen haben, ist das Rezept riesig.

library(butcher)
out <- butcher(fit_wordvec_senti_xgb)
lobstr::obj_size(out)

Test-Set-Güte

Vorhersagen im Test-Set:

tic()
preds <-
  predict(fit_wordvec_senti_xgb, 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))
my_metrics <- metric_set(accuracy, f_meas)
my_metrics(d_test,
           truth = c1,
           estimate = .pred_class)