```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
library(tidyverse)
library(RCurl)
library(quanteda)
library(quanteda.textstats)
library(quanteda.textplots)
library(lingmatch)
```

# US Inauguration Speeches
Im folgenden Anschauungsbeispiel nutzen wir einen Korpus, welcher die US Inauguration Speeches von 1789 bis heute enthält. Dieser Korpus kommt mit dem Paket quanteda, welches wir auch für andere Formen der Textanalyse verwenden werden. 

## 1. Vorbereitung der Daten
Zunächst einmal müssen wir die Daten noch in das richtige Format für verschiedene Analysen bringen. Wir werden in Zukunft noch ausführlich über Transformationsschritte sprechen und diese teils auch noch etwas verfeinern. Für jetzt reicht es aber aus, zu wissen, dass es grundsätzlich drei Formate gibt: 

1. Korpus (in diesem Fall sind die Daten bereits in dem Korpus-Format)
2. Tokens 
3. Document-Frequency-Matrix (kurz dfm)

```{r}
corp <- data_corpus_inaugural
toks <- tokens(corp, "word")
dfm_inaug <- dfm(toks, tolower=T)
```

## 2. Definition eines Dictionary

Wir können Wörterbücher entweder selbst definieren oder existierende nutzen. Im Folgenden nutzen wir erst einmal das existierende "Moral Foundations Dictionary" (hier von GitHub heruntergeladen). 

```{r}
file_git <- getURL("https://raw.githubusercontent.com/medianeuroscience/emfd/refs/heads/master/dictionaries/mfd2.0.dic")
mf <- read.dic(file_git, raw=T)
mf_dic <- dictionary(mf)
```

## 3. Matchen des Dictionaries

Im Folgenden suchen wir nach Schlüsselbegriffen, welche bestimmte Tugenden (und Makel) ausmachen. Hierfür können wir die Funktion dfm_lookup des quanteda-Packages nutzen. 

```{r}
res <- dfm_lookup(dfm_inaug, mf_dic)
```


## 4. Visualisierung 

Wir können uns u.a. anschauen, wie sich die Reden im Zeitverlauf entwickelt haben. In diesem Beispiel fokussieren wir uns darauf, wie wichtig "Fairness" als Tugend ist. 

```{r}
meta <- data.frame(docvars(res))
res_df <- data.frame(res)

df <- bind_cols(meta, res_df)
df %>%
  ggplot(aes(Year, fairness.virtue)) + 
  geom_line() + theme_light()
```


## 5. Vergleich zwischen zwei Präsidenten

Während wir in der vorigen Analyse uns vor allem einen globalen Überblick über die Tugenden verschafft haben, können wir natürlich auch bestimmte Präsidenten miteinander vergleichen, in diesem Fall Trump und Obama. 

```{r}
df_long <- pivot_longer(df, 6:15)
df_long %>%
  filter(name %in% c("authority.virtue", "care.virtue", "fairness.virtue", "loyalty.virtue", "sanctity.virtue") & President %in% c("Obama", "Trump")) %>%
  group_by(President, name) %>%
  summarise(mean_val = mean(value, na.rm=T)) %>%
  ggplot(aes(name, mean_val, fill=President)) + 
  geom_col(position = "dodge")
```

quanteda.textplots und quanteda.textstats kommen mit einigen anderen nützlichen Funktionen. Beispielsweise können wir uns die sogenannte Keyness-Statistik zwischen zwei Texten ausgeben lassen. Keyness zeigt anhang eines Chi-Quadrat-Tests an, wie eigen gewisse Tokens einem Dokument im Vergleich zum anderen Dokument sind.

```{r}
dfm_obama_trump <- dfm(tokens(corpus_subset(corp, President %in% c("Obama", "Trump")))) 

keyness_obama_trump <- textstat_keyness(dfm_obama_trump, target = "2017-Trump")
textplot_keyness(keyness_obama_trump)


dfm_obama_trump <- dfm(tokens(corpus_subset(corp, President %in% c("Obama", "Trump")))) %>% dfm_remove(stopwords("en"))

keyness_obama_trump2 <- textstat_keyness(dfm_obama_trump, target = "2017-Trump")
textplot_keyness(keyness_obama_trump2)
```

Eine interessante (aber teils nicht allzu aussagekräftige) Methode ist es, sich die Einfachheit von Text anzuzeigen. Dafür gibt es verschiedene Indikatoren, wie den Flesch-Score, welche vor allem auf der Länge von Wörtern und Sätzen basieren. 
Dieser lässt sich einfach über die Funktion textstat_readability auf dem Korpus anwenden. 

Hält Trump, als populistischer Präsident, also einfachere Ansprachen?
```{r}
textstat_readability(corp)
```


Und addressieren Präsidenten bestimmte soziale Gruppen besonders oft?
```{r}
soc_groups <- list(
  public_service = c("public servic*"),
  officers = c("officer*"),
  homeowner = c("homeown*"),
  owner = c("owner"),
  self_employed = c("self-employ*"),
  rich = c("rich"),
  high_earner = c("high earner"),
  caregiver = c("caregiv*"),
  kindergarten_teacher = c("kindergarten teacher"),
  business = c("busi*"),
  companies = c("compani"),
  enterpreneurs = c("enterpreneur"),
  unemployed = c("unemploy*"),
  wage_earner = c("wage earner*"),
  worker = c("worker*"),
  low_earner = c("low earner*"),
  pensioner = c("pension*"),
  farmer = c("farmer*"),
  student = c("student*"),
  unionist = c("unionist*"),
  renter = c("renter"),
  teacher = c("teacher"),
  workforce = c("workforc*"),
  low_wage_workers = c("low-wage workers"),
  tenant = c("tenant"),
  urban = c("urban"),
  suburbs = c("suburbs"),
  poor = c("poor"),
  policeman = c("policeman"),
  soldier = c("soldier"),
  middle_class = c("middle class"),
  medical_staff = c("medical staff"),
  doctors = c("doctors"),
  banks = c("banks"),
  SMEs = c("SMEs"),
  wealthy = c("wealthy"),
  low_income = c("low income"),
  low_income_hyphen = c("low-income"),
  welfare_recipients = c("welfare recipients"),
  needy = c("needy"),
  employed = c("employed"),
  foreigner = c("foreigner"),
  asylum_seekers = c("asylum seekers"),
  single_mother = c("single mother"),
  single_parent = c("single parent"),
  single_father = c("single father"),
  girl = c("girl"),
  boy = c("boy"),
  man = c("man"),
  woman = c("woman"),
  transgender = c("transgender"),
  gay = c("gay"),
  lesbian = c("lesbian"),
  queer = c("queer"),
  homosexual = c("homosexual"),
  same_sex = c("same sex"),
  heterosexual = c("heterosexual"),
  middle_age = c("middle age"),
  old_people = c("old people"),
  young_people = c("young people"),
  LGBTQ = c("LGBTQ"),
  jew = c("jew"),
  muslim = c("muslim"),
  christian = c("christian"),
  patient = c("patient"),
  british = c("british"),
  migrant = c("migrant"),
  immigrant = c("immigrant"),
  married = c("married"),
  single = c("single"),
  parents = c("parents"),
  people_in_need = c("people in need"),
  sick = c("sick"),
  rural = c("rural"),
  children = c("children"),
  family = c("famil"),
  displaced = c("displaced"),
  skilled_worker = c("skilled worker"),
  business = c("business"),
  company = c("company"),
  caregiver = c("caregiver"),
  high_earner_repeat = c("high earner"),
  rich_repeat = c("rich"),
  self_employed = c("self-employed"),
  owner_repeat = c("owner"),
  homeowner = c("homeowner"),
  civil_servant = c("civil servant"),
  public_service = c("public service")
)

soc_group_dic <- dictionary(soc_groups)
```

Wie oben nutzen wir die Funktion dfm_lookup()
```{r}
res2 <- dfm_lookup(dfm_inaug, soc_group_dic)
meta2 <- data.frame(docvars(res2))
res_df2 <- data.frame(res2)

df2 <- bind_cols(meta2, res_df2)
df_long2 <- pivot_longer(df2, 6:88)

df_long2 %>%
  group_by(name) %>%
  summarise(tot_usage = sum(value, na.rm=T),
            avg_usage = mean(value, na.rm=T)) %>%
  arrange(desc(tot_usage))


# restrict to top 5 groups and plot over time
top5 <- df_long2 %>%
  group_by(name) %>%
  summarise(tot_usage = sum(value, na.rm=T),
            avg_usage = mean(value, na.rm=T)) %>%
  arrange(desc(tot_usage)) %>%
  slice(1:5) %>%
  select(name) %>%
  unlist()
  

df_long2 %>%
  filter(name %in% c(top5)) %>%
  group_by(Year, name) %>%
  summarise(count = sum(value, na.rm=T)) %>%
  ggplot(aes(Year, count, colour=name)) +
  geom_line() + theme_light()
```