# Libraries laden
library("quanteda")
## Warning: package 'quanteda' was built under R version 4.0.5
## Package version: 3.0.0
## Unicode version: 10.0
## ICU version: 61.1
## Parallel computing: 8 of 8 threads used.
## See https://quanteda.io for tutorials and examples.
library("quanteda.textmodels")
## Warning: package 'quanteda.textmodels' was built under R version 4.0.5
library("quanteda.textstats")
## Warning: package 'quanteda.textstats' was built under R version 4.0.5
library("quanteda.textplots")
## Warning: package 'quanteda.textplots' was built under R version 4.0.5
library("quanteda.corpora")
library("swissparl")
## Warning: package 'swissparl' was built under R version 4.0.5
library("tidyverse")
## Warning: package 'tidyverse' was built under R version 4.0.3
## -- Attaching packages --------------------------------------- tidyverse 1.3.0 --
## v ggplot2 3.3.3     v purrr   0.3.4
## v tibble  3.1.0     v dplyr   1.0.5
## v tidyr   1.1.3     v stringr 1.4.0
## v readr   1.3.1     v forcats 0.5.0
## Warning: package 'ggplot2' was built under R version 4.0.3
## Warning: package 'tibble' was built under R version 4.0.5
## Warning: package 'tidyr' was built under R version 4.0.5
## Warning: package 'dplyr' was built under R version 4.0.5
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library("dplyr")

1. Datensatz vorbereiten

# Datensatz laden
chparl.dt <- readRDS("swissparldata.rds")
chparl.dt <- chparl.dt[!is.na(chparl.dt$PartyNumber),]
chparl.dt <- chparl.dt[!is.na(chparl.dt$LanguageOfText),]
# Datensatz nach Sprachen filtern
chparl_de.dt <- chparl.dt %>% 
  filter(LanguageOfText == "DE")
text_id_de <- rownames(chparl_de.dt) #create text index
chparl_de.dt <- cbind(id=text_id_de, chparl_de.dt)


chparl_fr.dt <- chparl.dt %>% 
  filter(LanguageOfText == "FR")
text_id_fr <- rownames(chparl_fr.dt) #create text index
chparl_fr.dt <- cbind(id=text_id_fr, chparl_fr.dt)
# doc id kreieren & nach Parlamentsbeiträgen filtern
chparl_de.dt <- chparl_de.dt %>% 
  filter(CouncilId %in% (1:2)) %>% 
  group_by(PartyNumber) %>% 
    mutate(number=str_pad(row_number(),width=4,pad="0"),
           doc_id=paste0(id,number)) 
# Textanalyse vorbereiten
# create corpus
parl_de.corp <- corpus(chparl_de.dt, text_field = "Text")

#tokens
parl_de.toks <- tokens(parl_de.corp, "word")

#stopwords and puctuation
parl_de.toks <- tokens_remove(parl_de.toks, c(stopwords('de'), "dass", "p","pd_text", "i", "<", ">"))
parl_de.toks <- tokens_remove(parl_de.toks, c(stopwords('fr'), "commission", "entrer", 
                                                        "VS", "Proposition", "matière"))
parl_de.toks <- tokens(parl_de.toks, remove_punct = TRUE,
                       remove_numbers = TRUE,
                       remove_symbols = TRUE)
parl_de.toks[[1]]

#stemming
parl_de.toks <- tokens_wordstem(parl_de.toks, language = ("de"))
parl_de.toks[1]


#kleinbuchstaben
parl_de.toks <- tokens_tolower(parl_de.toks)


#document feature matrix
parl_de.dfm <- dfm(parl_de.toks)
parl_de.dfm[1:6,1:6]

topfeatures(parl_de.dfm)

2. Dictionary erstellen und validieren

Validierung nachaussen ergab folgende Worte, die auf Menschenrechte verweisen: menschenrecht*, emrk, nmri, skmr

# einfach validierter Datensatz erstellen
mr_basic_de.dict <- dictionary(list(menschenrecht = c("menschenrecht*", "emrk", "nmri", "skmr")))
# Geschäfte mit meisten Erwähnungen der Menschrechte finden
mr_de.dfm <- dfm_lookup(parl_de.dfm, mr_basic_de.dict, nomatch = "nomatch")
mr_de.dfm %>% 
  textstat_frequency()


#convert dfm to dataframe
mr_basic_de.dt <- convert(mr_de.dfm, to = "data.frame")
#combine dataframes
chparl_de.dt <- left_join(chparl_de.dt, mr_basic_de.dt, by = "doc_id")
#crate dummy variable for existence of "menschenrecht" in text
chparl_de.dt$topic_mr <- ifelse(chparl_de.dt$menschenrecht !=0, 1, 0)
chparl_de.dt <- chparl_de.dt %>% 
  ungroup()

#filter business with "menschenrecht" frequency
chparl_de.dt %>% 
  filter(topic_mr !=0) %>% 
  select(BusinessNumber,menschenrecht) %>% 
  group_by(BusinessNumber) %>% 
  summarise_all(sum) %>% 
  arrange(desc(menschenrecht))

Ich habe die 10 Geschäfte, in denen am meisten über Menschenrechte gesprochen wurde herausgefiltert, um meinen Diktionär innerhalb des Datensatzes zu validieren.

# Datensatz Menschenrecht 1 kreieren
chparl_mr_de.dt <- chparl_de.dt %>% 
  filter(BusinessNumber %in% c(20160077, 20170046, 20000067, 20170060, 
                               20060061, 20130071, 20150030, 20150055,
                               20050081, 20090060)) 
table(chparl_mr_de.dt$Title)
# MR Datensatz für interne Validation vorbereiten
chparl_mr_de.corp <- corpus(chparl_mr_de.dt, text_field = "Text")
chparl_mr_de.toks <- tokens(chparl_mr_de.corp, "word")
# clean tokens
chparl_mr_de.toks <- chparl_mr_de.toks %>% 
  tokens_remove(c(stopwords('de'), "dass", "p","pd_text", "i", "<", ">")) %>% 
  tokens_remove(c(stopwords('fr'), "commission", "entrer", 
                  "VS", "Proposition", "matière")) %>% 
  tokens(remove_punct = TRUE,
         remove_numbers = TRUE,
         remove_symbols = TRUE) %>% 
  tokens_wordstem(language = ("de"))
# Suche nach Kollokationen
chparl_mr_de.colls <- tokens_select(chparl_mr_de.toks, pattern = "^[A-Z]",
                         valuetype = "regex",
                         case_insensitive = FALSE,
                         padding = TRUE) %>% 
  textstat_collocations(min_count = 10)

head(chparl_mr_de.colls, 50)

Die Suche nach Kollokationen im ganzen Datensatz hat nichts spezifisches ergeben, deshalb habe ich den datensatz in linke und konservative Parteien und in die SVP separat eingeteil, da sie öfters ein spezielles Vokabular benutzt. Danach habe ich für jede Gruppe eine Frequency Analyse gemacht und verdächtige Worte jeweils mit Keyword in Kontext überprüft. Danach habe ich die Gruppe noch nach Kollokations abgesucht, wobei ich nur bei der SVP fündig wurde.

# linke Parteien
chparl_de_left.dt <- chparl_mr_de.dt %>% 
  filter(PartyNumber %in% c(20, 12, 1336, 1582)) 
#corpus
chparl_de_left.corp <- corpus(chparl_de_left.dt, text_field = "Text")
chparl_de_left.toks <- tokens(chparl_de_left.corp, "word")
# clean tokens
chparl_de_left.toks <- chparl_de_left.toks %>% 
  tokens_remove(c(stopwords('de'), "dass", "p","pd_text", "i", "<", ">")) %>% 
  tokens_remove(c(stopwords('fr'), "commission", "entrer", 
                                              "VS", "Proposition", "matière")) %>% 
  tokens(remove_punct = TRUE,
                       remove_numbers = TRUE,
                       remove_symbols = TRUE) %>% 
  tokens_tolower()
#dfm
chparl_de_left.dfm <- dfm(chparl_de_left.toks)
# Frequancy Analyse
textstat_frequency(chparl_de_left.dfm, n = 100)
#words in kontext
chparl_de_leftlong.toks <- tokens(chparl_de_left.corp, "word")

kw_mehrheit <- kwic(chparl_de_leftlong.toks, pattern = "mehrheit*", window = 10)
sample_n(kw_mehrheit, 20)

kw_recht <- kwic(chparl_de_leftlong.toks, pattern = "recht*", window = 10)
sample_n(kw_recht, 20)

kw_rechte <- kwic(chparl_de_leftlong.toks, pattern = "recht", window = 10)
sample_n(kw_rechte, 20)

kw_abkommen <- kwic(chparl_de_leftlong.toks, pattern = "abkommen", window = 10)
sample_n(kw_abkommen, 20)
# keine interessanten Worte
# Kollokationen Analyse
chparl_de_leftstem.toks <- tokens_wordstem(chparl_de_left.toks, language = ("de"))
chparl_left_de.colls <- tokens_select(chparl_de_leftstem.toks, pattern = "^[A-Z]",
                                     valuetype = "regex",
                                     case_insensitive = FALSE,
                                     padding = TRUE) %>% 
  textstat_collocations(min_count = 5)

head(chparl_left_de.colls, 100)
#keine interessanten Phrasen/Worte
# konservative Parteien
chparl_de_cons.dt <- chparl_mr_de.dt %>% 
  filter(PartyNumber %in% c(18, 14, 15, 1551, 1586, 1577)) 

chparl_de_cons.corp <- corpus(chparl_de_cons.dt, text_field = "Text")
chparl_de_cons.toks <- tokens(chparl_de_cons.corp, "word")
# clean tokens
chparl_de_cons.toks <- chparl_de_cons.toks %>% 
  tokens_remove(c(stopwords('de'), "dass", "p","pd_text", "i", "<", ">")) %>% 
  tokens_remove(c(stopwords('fr'), "commission", "entrer", 
                  "VS", "Proposition", "matière")) %>% 
  tokens(remove_punct = TRUE,
         remove_numbers = TRUE,
         remove_symbols = TRUE) %>% 
  tokens_tolower()
#dfm
chparl_de_cons.dfm <- dfm(chparl_de_cons.toks)
# Frequancy Analyse
textstat_frequency(chparl_de_cons.dfm, n = 100)

# Kontextanalyse häufiger Worte
chparl_de_conslong.toks <- tokens(chparl_de_cons.corp, "word")

kw_recht <- kwic(chparl_de_conslong.toks, pattern = "recht", window = 10)
sample_n(kw_recht, 20)

kw_minderheit <- kwic(chparl_de_conslong.toks, pattern = "minderheit*", window = 10)
sample_n(kw_minderheit, 20)

kw_mehrheit <- kwic(chparl_de_conslong.toks, pattern = "mehrheit*", window = 10)
sample_n(kw_mehrheit, 20)

kw_ausland <- kwic(chparl_de_conslong.toks, pattern = "ausland", window = 10)
sample_n(kw_ausland, 20)

kw_völkerrecht <- kwic(chparl_de_conslong.toks, pattern = "völkerrecht*", window = 10)
sample_n(kw_völkerrecht, 20)

kw_international <- kwic(chparl_de_conslong.toks, pattern = "international*", window = 10)
sample_n(kw_international, 20)

kw_abkommen <- kwic(chparl_de_conslong.toks, pattern = "abkommen", window = 10)
sample_n(kw_abkommen, 20)

kw_gesetz <- kwic(chparl_de_conslong.toks, pattern = "gesetz*", window = 10)
sample_n(kw_gesetz, 20)
# Kollokationen Analyse
chparl_de_consstem.toks <- tokens_wordstem(chparl_de_cons.toks, language = ("de"))
chparl_cons_de.colls <- tokens_select(chparl_de_consstem.toks, pattern = "^[A-Z]",
                                      valuetype = "regex",
                                      case_insensitive = FALSE,
                                      padding = TRUE) %>% 
  textstat_collocations(min_count = 5)

head(chparl_cons_de.colls, 100)
#keine interessanten Phrasen/Worte
# SVP
chparl_de_SVP.dt <- chparl_mr_de.dt %>% 
  filter(PartyNumber == 13) 

chparl_de_SVP.corp <- corpus(chparl_de_SVP.dt, text_field = "Text")
chparl_de_SVP.toks <- tokens(chparl_de_SVP.corp, "word")

# clean tokens
chparl_de_SVP.toks <- chparl_de_SVP.toks %>% 
  tokens_remove(c(stopwords('de'), "dass", "p","pd_text", "i", "<", ">")) %>% 
  tokens_remove(c(stopwords('fr'), "commission", "entrer", 
                  "VS", "Proposition", "matière")) %>% 
  tokens(remove_punct = TRUE,
         remove_numbers = TRUE,
         remove_symbols = TRUE) %>% 
  tokens_tolower()
#dfm
chparl_de_SVP.dfm <- dfm(chparl_de_SVP.toks)
# Frequancy Analyse
textstat_frequency(chparl_de_SVP.dfm, n = 100)

# häufige Keywords in Kontext
chparl_de_SVPlong.toks <- tokens(chparl_de_SVP.corp, "word")

kw_recht <- kwic(chparl_de_SVPlong.toks, pattern = "recht", window = 10)
sample_n(kw_recht, 20)

kw_minderheit <- kwic(chparl_de_SVPlong.toks, pattern = "minderheit", window = 10)
sample_n(kw_minderheit, 20)

kw_mehrheit <- kwic(chparl_de_SVPlong.toks, pattern = "mehrheit", window = 10)
sample_n(kw_mehrheit, 20)

kw_volk <- kwic(chparl_de_SVPlong.toks, pattern = "volk", window = 10)
sample_n(kw_volk, 20)

kw_völkerrecht <- kwic(chparl_de_SVPlong.toks, pattern = "völkerrecht", window = 10)
sample_n(kw_völkerrecht, 20)

kw_selbstbestimmung <- kwic(chparl_de_SVPlong.toks, pattern = "selbstbestimmung", window = 10)
sample_n(kw_selbstbestimmung, 20)

kw_verfassung <- kwic(chparl_de_SVPlong.toks, pattern = "verfassung", window = 10)
sample_n(kw_verfassung, 20)

kw_richter <- kwic(chparl_de_SVPlong.toks, pattern = "richter", window = 10)
sample_n(kw_richter, 20)

kw_bürger <- kwic(chparl_de_SVPlong.toks, pattern = "bürger", window = 10)
sample_n(kw_bürger, 20)

kw_strassburg <- kwic(chparl_de_SVPlong.toks, pattern = "strassburg", window = 10)
sample_n(kw_strassburg, 20)

kw_gesetz <- kwic(chparl_de_SVPlong.toks, pattern = "gesetz", window = 10)
sample_n(kw_gesetz, 20)
# Kollokationen Analyse
chparl_de_SVPstem.toks <- tokens_wordstem(chparl_de_SVP.toks, language = ("de"))
chparl_SVP_de.colls <- tokens_select(chparl_de_SVPstem.toks, pattern = "^[A-Z]",
                                      valuetype = "regex",
                                      case_insensitive = FALSE,
                                      padding = TRUE) %>% 
  textstat_collocations(min_count = 5)

head(chparl_SVP_de.colls, 100)

# collocations in kontext
kw_1 <- kwic(chparl_de_SVPlong.toks, pattern = phrase("richter* in strassburg"))
head(kw_1, 20) #--> menschenrechte --> richter* strassburg

kw_2 <- kwic(chparl_de_SVPlong.toks, pattern = phrase("gerichtshof* in strassburg"), window = 10)
head(kw_2, 20) #-->menschenrechte --> gerichtshof* strassburg

kw_3 <- kwic(chparl_de_SVP.toks, pattern = phrase("prinzip* eigenverantwortung"), window = 10)
head(kw_3, 20) #--> gegenteil von Menschenrechten

kw_4 <- kwic(chparl_de_SVP.toks, pattern = phrase("sprech* recht"), window = 10)
head(kw_4, 20) # --> nicht bestimmbar

kw_5 <- kwic(chparl_de_SVP.toks, pattern = phrase("selbstbestimm* schweiz"), window = 10)
head(kw_5, 20) #gegenteil von Menschenrechten

kw_6 <- kwic(chparl_de_SVPlong.toks, pattern = phrase("völkerrecht* im landesrecht*"), window = 10)
head(kw_6, 20) # --> nicht bestimmbar

kw_7 <- kwic(chparl_de_leftlong.toks, pattern = phrase("fremd* richt*"), window = 10)
head(kw_7, 20) 

Der Begriff “Fremde Richter” ist in der Analyse zur SVP nicht aufgetaucht. Da es aber ein besoders polarisierender Begriff ist, habe ich ihn nochmals extra untersucht: Er wird zwar von der SVP benutzt, um auf fremde Rechte zu referieren, allerdings eher auf Völkerrecht. Ausserdem wird er von den anderen Parteien auch benutzt, um auf die Selbstbestimmungsinitiative zu verweisen und ist daher nicht eindeutig zuweisbar.

kw_frich_left <- kwic(chparl_de_leftlong.toks, pattern = phrase("fremd* richt*"), window = 10)
head(kw_frich_left, 20) # --> 15 Erwähnungen, negativ an SVP gerichtet

kw_frich_cons <- kwic(chparl_de_conslong.toks, pattern = phrase("fremd* richt*"), window = 10)
head(kw_frich_cons, 40) # --> 20 Erwähnungen, negativ, sich am Begriff störend

kw_frich_SVP <- kwic(chparl_de_SVPlong.toks, pattern = phrase("fremd* richt*"), window = 10)
head(kw_frich_SVP, 20) # --> 20 mal, kann als Synonym für Menscherechte gelesen werden, allerdings eher für Völkerrecht
# Reevaluation der ausgewählten Geschäfte mit validiertem Dictionary

# create dictionary and binary variable for "menschenrecht"
mr_complex_de.dict <- dictionary(list(menschenrechte = c("menschenrecht*", "richter* strassburg", "gerichtshof* strassburg", "emrk", "nmri", "skmr")))
# lookup Resultate zu Datasatz konvertieren
mr_de.dfm <- dfm_lookup(parl_de.dfm, mr_complex_de.dict)
mr_complex_de.dt <- convert(mr_de.dfm, to = "data.frame")
# Datensätze zusammenfügen
chparl_de_comp.dt <- left_join(chparl_de.dt, mr_complex_de.dt, by = "doc_id")

chparl_de_comp.dt$menschenrecht <- NULL
chparl_de_comp.dt$nomatch <- NULL
#Topic Variablen dichotominsieren
chparl_de_comp.dt$topic_mr <- dplyr::recode(chparl_de_comp.dt$menschenrechte, '0' = 0, .default = 1)

#filter business with "menschenrecht" frequency
chparl_de_comp.dt %>% 
  filter(topic_mr !=0) %>% 
  select(BusinessNumber,menschenrechte) %>% 
  group_by(BusinessNumber) %>% 
  summarise_all(sum) %>% 
  arrange(desc(menschenrechte))

#create final dataframe
chparl_mr_de.dt <- chparl_de_comp.dt %>% 
  filter(BusinessNumber %in% c(20160077, 20170046, 20000067, 20170060, 
                               20060061, 20130071, 20150030, 20150055,
                               20050081, 20090060)) 

3. Französischer Datensatz

# Datensatz erstellen
chparl_fr.dt <- chparl.dt %>% 
  filter(LanguageOfText == "FR")
text_id_fr <- rownames(chparl_fr.dt) #create text index
chparl_fr.dt <- cbind(id=text_id_fr, chparl_fr.dt)

# create doc id, filter for parliament text (exclude government)
chparl_fr.dt <- chparl_fr.dt %>% 
  filter(CouncilId %in% (1:2)) %>% 
  group_by(PartyNumber) %>% 
  mutate(number=str_pad(row_number(),width=4,pad="0"),
         doc_id=paste0(id,number)) 
#bearbeiten, corpus, tokens, dfm
chparl_fr.corp <- corpus(chparl_fr.dt, text_field = "Text")
chparl_fr.toks <- tokens(chparl_fr.corp, "word")
chparl_fr.toks <- chparl_fr.toks %>% 
  tokens_remove(c(stopwords('fr'), "p","pd_text", "i", "<", ">")) %>% 
  tokens(remove_punct = TRUE,
         remove_numbers = TRUE,
         remove_symbols = TRUE) %>% 
  tokens_tolower()

chparl_fr.toks[1:10] #keine deutschen Worte --> ist ok!

chparl_frlong.toks <- chparl_fr.toks <- tokens(chparl_fr.corp, "word")

#dfm
chparl_fr.dfm <- dfm(chparl_fr.toks)

Ich habe das deutsche Wörterbuch mit Deep L übersetzt und die Worte dann intern validiert.

# keywords in kontext --> alle Übersetzungsvarianten, die nicht vorkommen, löschen
kw_droit1 <- kwic(chparl_fr.toks, pattern = phrase("droit* l'homme"))
head(kw_droit1, 20) #gängig

kw_droit2 <- kwic(chparl_fr.toks, pattern = phrase("droit* homme"))
head(kw_droit2, 20)# kommt nicht vor

kw_droit3 <- kwic(chparl_fr.toks, pattern = phrase("droit* humain*"))
head(kw_droit3, 20) #gängig

kw_juge <- kwic(chparl_fr.toks, pattern = phrase("juge* strasbourg"))
head(kw_juge, 20) #gängig

kw_cour <- kwic(chparl_fr.toks, pattern = phrase("cour strasbourg"))
head(kw_cour, 20) #gängig

kw_tribunal <- kwic(chparl_fr.toks, pattern = phrase("tribunal strasbourg"))
head(kw_tribunal, 20) #kommt nicht vor
# Dictionary Französisch
mr_complex_fr.dict <- dictionary(list(menschenrechte =  c("droit* l'homme ", "droit* homme", "droit* humain*", "cedh", "indh", "csdh", "juge* strasbourg", "cour strasbourg")))
# lookup Resultate zu Datasatz konvertieren FR
mr_fr.dfm <- dfm_lookup(chparl_fr.dfm, mr_complex_fr.dict)
mr_complex_fr.dt <- convert(mr_fr.dfm, to = "data.frame")
# Datensätze zusammefügen
chparl_fr_comp.dt <- left_join(chparl_fr.dt, mr_complex_fr.dt, by = "doc_id")
#Topic Variablen dichotominsieren
chparl_fr_comp.dt$topic_mr <- dplyr::recode(chparl_fr_comp.dt$menschenrechte, '0' = 0, .default = 1)

#filter Geschäfte mit "menschenrecht" frequency
chparl_fr_comp.dt %>% 
  filter(topic_mr !=0) %>% 
  select(BusinessNumber,menschenrechte) %>% 
  group_by(BusinessNumber) %>% 
  summarise_all(sum) %>% 
  arrange(desc(menschenrechte))
## Adding missing grouping variables: `PartyNumber`
#Geschäfte raussuchen FR
chparl_mr_fr.dt <- chparl_fr_comp.dt %>% 
  filter(BusinessNumber %in% c(20170046, 20150055)) 
table(chparl_mr_fr.dt$Title)

4. Sprach-Datensätze verbinden

# Datensätze verbinden
menschenrechte.dt <- rbind(chparl_mr_de.dt, chparl_mr_fr.dt) # 10 Geschäfte zu Menschenrechten
chparl_komplett.dt <- rbind(chparl_de_comp.dt, chparl_fr_comp.dt)# alle Geschäfte

5. Datensätze speichern

# Datensätze abspeichern
# ganzer Datensatz mit mr themen variablen
write.csv(chparl_komplett.dt,'chparl_komplett.csv', row.names = FALSE)
saveRDS(chparl_komplett.dt,"chparl_komplett.rds")

# datensatz mit 10 Geschäften, in denen menschenrechte am häufigsten vorkommen
write.csv(menschenrechte.dt, 'menschenrechte.csv', row.names = FALSE)
saveRDS(menschenrechte.dt, "menschenrechte.rds")

# datensatz mit 10 Geschäften, in denen menschenrechte am häufigsten vorkommen Deutsch für Keyness Analyse
write.csv(chparl_mr_de.dt, 'menschenrechteDE.csv', row.names = FALSE)
saveRDS(chparl_mr_de.dt, "menschenrechteDE.rds")