Benötigte Bibliotheken

Das Korpus wurde mithilfe der Bibliothek quanteda untersucht. Außerdem wird die Bibliothek readtext benötigt, um die Textdateien einlesen zu können. Die Bibliothek udpipe wird benötigt, um Lemmatisierungen und Annotationen durchzuführen.

library(quanteda)
library(readtext)
library(udpipe)

Einlesen des Korpus

Um das Korpus einlesen zu können, muss sich der Ordner Korpus-Dateien mit den Wahlprogrammen im aktuellen Arbeitsverzeichnis befinden. Die Namen der Dateien sind nach dem folgenden Muster aufgebaut: <Wahl>-<Partei>-<Jahr>. Das Wahlprogramm der CDU zur Bundestagswahl von 2017 ist zum Beispiel in der Datei Bundestagswahl-CDU-2017 gespeichert. Mithilfe von readtext können aus den Dateinamen so Document Level Variables erstellt werden, die das Filtern nach Parteien und Jahren vereinfachen.

# Read in files and set document level variables
programs <- readtext("Korpus-Dateien", 
                     docvarsfrom = "filenames",
                     docvarnames = c("type", "party", "year"),
                     dvsep = "-",
                     encoding="utf-8")

Lemmatisierung

Die folgende Funktion nimmt ein readtext-Objekt und ein udpipe-Model als Argument und lemmatisiert für jede Zeile im readtext-Objekt die Textspalte. Das zurückgegebene readtext-Objekt besitzte die gleichen Dokumentvariablen und Spalten.

# Lemmatize a readtext object, while keeping docvars etc.
# Parameter: 
# readtext object --> contains a column text with characters
# model_udpipe --> A trained model from the udpipe package
lemmatize <- function(readtext_obj, model_udpipe) {
  for (n in 1:nrow(readtext_obj)) {
    text <- readtext_obj[n,]$text
    annotated <- udpipe_annotate(model_udpipe, x = text, parser = "none")
    # Filter out NA cells.
    annotated.df <- subset(as.data.frame(annotated), lemma != "NA")
    # Special case where lemma is not useful when text is collapsed again.
    annotated.df$lemma <- replace(annotated.df$lemma, annotated.df$lemma == "er|es|sie", "sich")
    readtext_obj[n,]$text <- paste(annotated.df$lemma, collapse = " ")
  }
  return(readtext_obj)
}

Die Lemmatisierung des Korpus kann etwas dauern. Deshalb ist eine lemmatisierte Version unter RData/lemmatized_corpus.RData abgespeichert.

Erweiterung der Stoppwörter

Einige Stoppwörter wurden manuell hinzugefügt. Sie sind zusätzlich unter RData/custom_stops.RData gespeichert.

# Add custom stopwords
custom_stops <- c(stopwords("german"), c("", "|","dass", "dabei", "dafür", "sowie", "daher", "deshalb"))
custom_stops
##   [1] "aber"      "alle"      "allem"     "allen"     "aller"     "alles"     "als"      
##   [8] "also"      "am"        "an"        "ander"     "andere"    "anderem"   "anderen"  
##  [15] "anderer"   "anderes"   "anderm"    "andern"    "anderr"    "anders"    "auch"     
##  [22] "auf"       "aus"       "bei"       "bin"       "bis"       "bist"      "da"       
##  [29] "damit"     "dann"      "der"       "den"       "des"       "dem"       "die"      
##  [36] "das"       "daß"       "derselbe"  "derselben" "denselben" "desselben" "demselben"
##  [43] "dieselbe"  "dieselben" "dasselbe"  "dazu"      "dein"      "deine"     "deinem"   
##  [50] "deinen"    "deiner"    "deines"    "denn"      "derer"     "dessen"    "dich"     
##  [57] "dir"       "du"        "dies"      "diese"     "diesem"    "diesen"    "dieser"   
##  [64] "dieses"    "doch"      "dort"      "durch"     "ein"       "eine"      "einem"    
##  [71] "einen"     "einer"     "eines"     "einig"     "einige"    "einigem"   "einigen"  
##  [78] "einiger"   "einiges"   "einmal"    "er"        "ihn"       "ihm"       "es"       
##  [85] "etwas"     "euer"      "eure"      "eurem"     "euren"     "eurer"     "eures"    
##  [92] "für"       "gegen"     "gewesen"   "hab"       "habe"      "haben"     "hat"      
##  [99] "hatte"     "hatten"    "hier"      "hin"       "hinter"    "ich"       "mich"     
## [106] "mir"       "ihr"       "ihre"      "ihrem"     "ihren"     "ihrer"     "ihres"    
## [113] "euch"      "im"        "in"        "indem"     "ins"       "ist"       "jede"     
## [120] "jedem"     "jeden"     "jeder"     "jedes"     "jene"      "jenem"     "jenen"    
## [127] "jener"     "jenes"     "jetzt"     "kann"      "kein"      "keine"     "keinem"   
## [134] "keinen"    "keiner"    "keines"    "können"    "könnte"    "machen"    "man"      
## [141] "manche"    "manchem"   "manchen"   "mancher"   "manches"   "mein"      "meine"    
## [148] "meinem"    "meinen"    "meiner"    "meines"    "mit"       "muss"      "musste"   
## [155] "nach"      "nicht"     "nichts"    "noch"      "nun"       "nur"       "ob"       
## [162] "oder"      "ohne"      "sehr"      "sein"      "seine"     "seinem"    "seinen"   
## [169] "seiner"    "seines"    "selbst"    "sich"      "sie"       "ihnen"     "sind"     
## [176] "so"        "solche"    "solchem"   "solchen"   "solcher"   "solches"   "soll"     
## [183] "sollte"    "sondern"   "sonst"     "über"      "um"        "und"       "uns"      
## [190] "unse"      "unsem"     "unsen"     "unser"     "unses"     "unter"     "viel"     
## [197] "vom"       "von"       "vor"       "während"   "war"       "waren"     "warst"    
## [204] "was"       "weg"       "weil"      "weiter"    "welche"    "welchem"   "welchen"  
## [211] "welcher"   "welches"   "wenn"      "werde"     "werden"    "wie"       "wieder"   
## [218] "will"      "wir"       "wird"      "wirst"     "wo"        "wollen"    "wollte"   
## [225] "würde"     "würden"    "zu"        "zum"       "zur"       "zwar"      "zwischen" 
## [232] ""          "|"         "dass"      "dabei"     "dafür"     "sowie"     "daher"    
## [239] "deshalb"