Warum Sentiment-Analyse nicht die beste Methode ist:

  1. Sentiment-Analyse-Modelle und Wörterbücher berücksichtigen nicht immer den spezifischen sportbezogenen Kontext, was zu einer suboptimalen Stimmungsschätzung führen kann.

  2. Sport löst starke Emotionen aus, die die Ausdrucksweise von Stimmung verstärken und zu einer höheren wahrgenommenen Negativität führen können.

  3. Trainierte Sentiment-Analyse-Modelle könnten aufgrund unvollständiger Abdeckung von sportbezogenem Inhalt in den Trainingsdaten die Genauigkeit der Stimmungsschätzung in diesem Kontext beeinträchtigen. Zum beispiel “Aggressive Kurven fahren” ist nicht negativ oder direkt mit “Anger” verbunden. Oder “er ist kriminell gut” in diesem Fall ist kriminell eher was positives.

Aus diesen Gründen wurden die Resultate dieser Methode nicht direkt präsentiert, sondern nur um die Validität der Resultate zu unterstützen.

Preliminaries —–

Daten —–

kwic_all_dd <- read.csv("Inputs/kwic_results_all2.csv")
kwic_f_dd <- read.csv("Inputs/kwic_results_f2.csv")
kwic_m_dd <- read.csv("Inputs/kwic_results_m2.csv")

Vorbereitung —–

#tokens
kwic_all_toks <- kwic_all_dd %>% 
  corpus() %>% 
  tokens(remove_number=T, remove_punct=T) %>% 
  tokens_tolower()

kwic_f_toks <- kwic_f_dd %>% 
  corpus() %>% 
  tokens(remove_number=T, remove_punct=T) %>% 
  tokens_tolower()

kwic_m_toks <- kwic_m_dd %>% 
  corpus() %>% 
  tokens(remove_number=T, remove_punct=T) %>% 
  tokens_tolower()

# DFM
kwic_all_dfm <- kwic_all_toks %>% 
  dfm()

kwic_m_dfm <- kwic_m_toks %>% 
  dfm()

kwic_f_dfm <- kwic_f_toks %>% 
  dfm()

LSD Dictionary —–

load("C:/Users/arnol/Desktop/UZH_Master/FS23/Forschungsseminar Politischer Datenjournalismus/auto_dictionaries_lsd.RData")


rm(list=setdiff(ls(), c("extendeddict_de", 
                        "kwic_all_dd", "kwic_all_toks", "kwic_all_dfm",
                        "kwic_f_dd", "kwic_f_toks", "kwic_f_dfm",
                        "kwic_m_dd", "kwic_m_toks", "kwic_m_dfm")))

dict_sent_proksch <- dictionary(list
                                (positive = str_replace_all(extendeddict_de$pos,"ß", "ss"),
                                  negative = str_replace_all(extendeddict_de$neg,"ß", "ss")))
dict_sent_proksch

Notizen: Nicht wirklich perfekt, manchmal zu kategorisch. Z.B. akzeptabel als positiv obwohl meistens nicht so positiv gebraucht.

all_sent_proksch <- tokens_lookup(kwic_all_toks, dict_sent_proksch, valuetype = "glob")

all_sent_proksch

all_sent_proksch_dfm <- dfm_lookup(kwic_all_dfm, dict_sent_proksch, valuetype = "glob")
all_sent_proksch_dfm


f_sent_proksch <- tokens_lookup(kwic_f_toks, dict_sent_proksch, valuetype = "glob")

f_sent_proksch

f_sent_proksch_dfm <- dfm_lookup(kwic_f_dfm, dict_sent_proksch, valuetype = "glob")
f_sent_proksch_dfm


m_sent_proksch <- tokens_lookup(kwic_m_toks, dict_sent_proksch, valuetype = "glob")
m_sent_proksch

m_sent_proksch_dfm <- dfm_lookup(kwic_m_dfm, dict_sent_proksch, valuetype = "glob")
m_sent_proksch_dfm

NRC dictionary —–

nrc <- read.delim("C:/Users/arnol/Desktop/UZH_Master/FS23/Forschungsseminar Politischer Datenjournalismus/NRC-Emotion-Lexicon/NRC-Emotion-Lexicon/OneFilePerLanguage/German-NRC-EmoLex.txt")

nrc <- dplyr::rename(nrc, word = German.Word)
nrc <- dplyr::select(nrc, word, anger, trust, fear, joy)

nrc_long <- nrc %>% pivot_longer(-word, names_to="sentiment", values_to="val")
nrc_long <- nrc_long %>% filter(val==1)

dict_sent_nrc <- as.dictionary(nrc_long)
dict_sent_nrc

Notizen: aggressiv im Kontext sport hat nicht unbedingt etwas mit Anger im negativen Sinn zu tun sondern kann auch sehr positiv sein.

all_sent_nrc <- tokens_lookup(kwic_all_toks, dict_sent_nrc, valuetype = "glob") %>% 
  dfm()
all_sent_nrc

all_sent_nrc_dfm <- dfm_lookup(kwic_all_dfm, dict_sent_nrc, valuetype = "glob")
all_sent_nrc_dfm


f_sent_nrc <- tokens_lookup(kwic_f_toks, dict_sent_nrc, valuetype = "glob") %>% 
  dfm()
f_sent_nrc

f_sent_nrc_dfm <- dfm_lookup(kwic_f_dfm, dict_sent_nrc, valuetype = "glob")
f_sent_nrc_dfm


m_sent_nrc <- tokens_lookup(kwic_m_toks, dict_sent_nrc, valuetype = "glob") %>% 
  dfm()
m_sent_nrc

m_sent_nrc_dfm <- dfm_lookup(kwic_m_dfm, dict_sent_nrc, valuetype = "glob")
m_sent_nrc_dfm

Analyse —–

all_sent_nrc_df <- convert(all_sent_nrc, "data.frame") %>%
  bind_cols(docvars(all_sent_nrc)) 

f_sent_nrc_df <- convert(f_sent_nrc, "data.frame") %>%
  bind_cols(docvars(f_sent_nrc))

m_sent_nrc_df <- convert(m_sent_nrc, "data.frame") %>%
  bind_cols(docvars(m_sent_nrc))

all_emotion_freq <- colSums(all_sent_nrc_df[, c("anger", "trust", "fear", "joy")])
f_emotion_freq <- colSums(f_sent_nrc_df[, c("anger", "trust", "fear", "joy")])
m_emotion_freq <- colSums(m_sent_nrc_df[, c("anger", "trust", "fear", "joy")])

Vergleich der Emotionen zwischen Geschlecht

f_emotion_prop <- f_emotion_freq / sum(f_emotion_freq)

m_emotion_prop <- m_emotion_freq / sum(m_emotion_freq)

f_emotion_percent <- f_emotion_prop * 100
m_emotion_percent <- m_emotion_prop * 100

emotion_comparison <- data.frame(Emotion = c("Anger", "Trust", "Fear", "Joy"),
                                 Female_Percent = f_emotion_percent,
                                 Male_Percent = m_emotion_percent)
emotion_comparison


all_sent_nrc_words <- tokens_select(kwic_all_toks, dict_sent_nrc , valuetype = "glob") %>%
  dfm()
topfeatures(all_sent_nrc_words)

Emotion Female_Percent Male_Percent anger Anger 15.68913 15.79792 trust Trust 34.44583 34.49536 fear Fear 22.84948 23.01245 joy Joy 27.01555 26.69427

Resultate: Bei beiden Geschlechtern sind die unterschiedliche Emotionen sehr ähnlich present. Zu viele Konklusionen sollte man aber nicht ziehen weil eben im Sport ein spezielles vokabular gebraucht wird und aggressiv etwas positives sein kann.

Positiv und negativ

f_sent_pos_freq <- colSums(f_sent_proksch_dfm[, c("positive")])
f_sent_neg_freq <- colSums(f_sent_proksch_dfm[, c("negative")])

m_sent_pos_freq <- colSums(m_sent_proksch_dfm[, c("positive")])
m_sent_neg_freq <- colSums(m_sent_proksch_dfm[, c("negative")])

f_sent_pos_prop <- f_sent_pos_freq / sum(f_sent_pos_freq, f_sent_neg_freq)
f_sent_neg_prop <- f_sent_neg_freq / sum(f_sent_pos_freq, f_sent_neg_freq)

m_sent_pos_prop <- m_sent_pos_freq / sum(m_sent_pos_freq, m_sent_neg_freq)
m_sent_neg_prop <- m_sent_neg_freq / sum(m_sent_pos_freq, m_sent_neg_freq)

vergleich <- data.frame(
  Sentiment = c("Positive", "Negative"),
  Female = c(f_sent_pos_prop, f_sent_neg_prop),
  Male = c(m_sent_pos_prop, m_sent_neg_prop)
)

Auch hier keine grosse Unterschiede zwischen den Geschlechtern. Mehrheitlich wird positiv über sie berichtet. Der Anteil des Negativen ist sehr hoch aber sehr wahrscheinlich liegt das daran, dass die Sentimentanalyse für Sportberichte nicht unbedingt die angepasste Methode ist. Dennoc ist das positive Sentiment mehrheitlich präsent.