Preliminaries —–

Daten einlesen —–

Für diese Analyse wurde nicht der ursprüngliche Datensatz gebraucht, da öfters innerhalb der Artikel andere SkifahrerInnen erwähnt werden und es somit unmöglich macht ein Artikel präzis einem Geschlecht zuzuordnen. Um die Analyse präziser zu machen, verwende ich für diese Studie die Resultate der KWIC-Filterung. Das heisst, dass ich anhand der Namen der SkimeisterInnen die 15 Wörter vorher und die 15 Wörter nacher zusammengefügt habe und einem Geschlecht zugeordnet habe. Somit werde ich die Eigennamen direkt aus diesem Datensatz entfernen.

Zudem habe ich probiert im ursprünglichen Datensatz die Eigennamen zu entfernen aber das führte zur folgenden Fehlermeldung: Error in py_run_string_impl(code, local, convert) : numpy.core._exceptions._ArrayMemoryError: Unable to allocate 1.41 MiB for an array with shape (1284, 288) and data type float32

#ski2 <- read.csv("ski1.csv")
dd_kwic <- read.csv("Inputs/kwic_results_all.csv")
dd_kwic <- as.data.frame(dd_kwic)

Eigennamen erkennen (POS) —–

Idee: Eigennamen mittels Part-of-Speech (POS) tagging oder named entity recognition aus den Texten entfernen.
Grund: Die Analysen ergaben bis jetzt keine optimale Ergebnisse wegen der straken Präsenz von Eigennamen (z.B. Ortsnamen, Namen anderer SportlerInnen)

Spacyr

#installation in python
#reticulate::py_config()
spacy_initialize(model = "de_core_news_sm")

Liste der Namen die NICHT entfernt werden sollen:

\(\bullet\) Eigentlich nur relevant wenn POS auf ski2 angewendet wird. Für KWIC-Datensatz fällt dieser Schritt aus.

#allowed_names <- c("cuche", "imboden", "défago", "defago", "albrecht", "hari", "kernen", "grünenfelder", "gruenenfelder", "gini", "siebenthal", "zurbriggen", "küng","kueng", "murisier", "oreiller", "vogel", "spescha", "caviezel", "schmidiger", "feuz", "lüönd","lueoend", "tumler", "aerni","ärni", "viletta", "kryenbühl", "kryenbuehl", "niederberger", "schmed", "meillard", "caviezel", "odermatt", "zenhäusern", "zenhaeusern", "simonet", "roulin", "noger", "mettler", "reymond", "grünigen", "mächler", "weber", "rösti", "corthay", "hächler", "müller", "nef", "öster", "styger", "pieren", "suter", "dicht", "aufdenblatten", "kummer", "volken", "gmür", "gmuer", "abderhalden", "weirather", "camastral", "dettling","gut", "gut-behrami", "behrami", "bonjour", "schild", "grand", "pünchera","puenchera", "jnglin-kamer", "kamer",  "nigg", "flury", "good", "givel", "holdener", "gisin", "suter",  "feierabend", "danioth", "kopp", "meillard", "nufer", "gröbli","groebli", "härri","haerri", "rast", "flütsch", "fluetsch", "klopfenstein", "durrer", "kolly", "darbellay", "brändli", "braendli", "berthod")

Eigennamen extrahieren:

# ski2$text <- tolower(ski2$text)
# toks_pos <- tokens(ski2$text, 
#                             remove_symbols = TRUE,
#                             remove_url = TRUE,
#                             remove_separators = TRUE,
#                             remove_punct = TRUE, 
#                             remove_numbers = TRUE,
#                             verbose = TRUE)
# parsed_text2 <- spacy_parse(as.character(toks_pos), pos = TRUE, tag = FALSE, lemma = FALSE)
toks_kwic_pos <- tokens(dd_kwic$text, 
                            remove_symbols = TRUE,
                            remove_url = TRUE,
                            remove_separators = TRUE,
                            remove_punct = TRUE, 
                            remove_numbers = TRUE,
                            verbose = TRUE)

# remove_token <- function(doc, index) {
#   doc <- doc[-index]
#   return(doc)
# }
# 
# 
# remove_eigennamen <- function(doc) {
#   for (i in rev(seq_along(doc))) {
#     token <- doc[i, ]
#     if (token$pos == "PROPN") {
#       doc <- remove_token(doc, i)
#     }
#   }
#   doc
# }

kwic_parsed_text <- spacy_parse(as.character(toks_kwic_pos), 
                                pos = TRUE, tag = FALSE, lemma = FALSE)
tabyl(kwic_parsed_text$pos)
#saveRDS(kwic_parsed_text, file = "Inputs/kwic_parsed_text.rds")

#dd_kwic_parsed <- remove_eigennamen(kwic_parsed_text)

Eigennamen in Liste speichern:

eigennamen <- kwic_parsed_text$token[kwic_parsed_text$pos == "PROPN"]
eigennamen <- unique(eigennamen)

#saveRDS(eigennamen, file = "Inputs/eigennamen.rds")
#write.csv(eigennamen, file = "Inputs/eigennamen.csv", row.names = FALSE)
eigennamen <- read.csv("Inputs/eigennamen.csv")
#eigennamen <- readRDS("Inputs/eigennamen.rds")

Mir ist aufgefallen, dass gewisse Namen in der Liste keine Eigennamen sind. Da die Liste zu lang ist um diese von Hand durchzugehen verwende ich udpipe nochmals auf eigennamen. udpipe scheint es aber noch schlechter zu machen (und auch hier ist die Liste zu lang um sie non Hand durchzugehen) also vertraue ich lieber Spacyr.

udpipe —–

#download model
m_ger <- udpipe::udpipe_download_model(language = "german-gsd")
#print(m_ger$file_model)

m_ger <- udpipe_load_model(file = "C:/Users/arnol/Desktop/UZH_Master/FS23/Forschungsseminar Politischer Datenjournalismus/Blog/blog_R/blog_R/german-gsd-ud-2.5-191206.udpipe")

#annotate
eigennamen_char <- as.character(eigennamen$x)
eigennamen_annotations <- udpipe_annotate(m_ger, x = eigennamen_char) %>%
  as.data.frame()


#filter
filtered_eigennamen <- eigennamen_annotations %>%
  filter(upos != "PROPN") %>%
  .$token
View(filtered_eigennamen)

filtered_eigennamen <- as.data.frame(filtered_eigennamen)
filtered_eigennamen <- unique(filtered_eigennamen)

Eigennamen von text enfernen —–

Liste zu gross um direkt als Stopwörter im Corpus anzugeben. Zu grosse Datenmenge um die Funktionen str_remove_all, stri_replace_all_regex oder gsub-loop anzuwenden. tokens_remove hat auch nicht gut funktioniert.

Aus diesem Grund habe ich diesen Schritt in Python durchgeführt.

#dd_kwic$text <- str_remove_all(dd_kwic$text, str_c("\\b", eigennamen, "\\b", collapse = "|"))

# eigennamen_pattern <- paste0("\\b(", paste(eigennamen, collapse = "|"), ")\\b")
# dd_kwic$text <- stringi::stri_replace_all_regex(dd_kwic$text, eigennamen_pattern, "")

# for (x in eigennamen$x) {
# dd_kwic <- dd_kwic %>%
#   mutate(text = gsub(x,"",text))
# }

# eigennamen_coprus <- corpus(eigennamen, text = "x")
# eigennamen_tokens <- tokens(eigennamen_coprus)
# dd_kwic_tokens_removed <- tokens_remove(toks_kwic_pos, eigennamen_tokens, padding = TRUE)
import csv

#daten importieren
kwic_file = "C:/Users/arnol/Desktop/UZH_Master/FS23/Forschungsseminar Politischer Datenjournalismus/Blog/blog_R/blog_R/Inputs/kwic_results_all.csv"
eigennamen_file = "C:/Users/arnol/Desktop/UZH_Master/FS23/Forschungsseminar Politischer Datenjournalismus/Blog/blog_R/blog_R/Inputs/eigennamen.csv"
output_file = "C:/Users/arnol/Desktop/UZH_Master/FS23/Forschungsseminar Politischer Datenjournalismus/Blog/blog_R/blog_R/Inputs/kwic_results_filtered.csv"

#stopwords von eigennamen_file als liste
with open(eigennamen_file, "r", encoding="utf-8") as file:
    reader = csv.reader(file)
    stopwords = [row[0] for row in reader]
print(stopwords[:20])

#stopwords von text variable im kwic_file entfernen und output_file schreiben
with open(kwic_file, "r", encoding="utf-8") as file:
    reader = csv.DictReader(file)
    fieldnames = reader.fieldnames

    with open(output_file, "w", newline="", encoding="utf-8") as output:
        writer = csv.DictWriter(output, fieldnames=fieldnames)
        writer.writeheader()

        for row in reader:
            text = row["text"]

            #stopwörter entfernen
            cleaned_text = " ".join(word for word in text.split() if word.lower() not in stopwords)

            #text in row updaten
            row["text"] = cleaned_text

            #modified row für output file
            writer.writerow(row)
dd_kwic_filtered <- read.csv("Inputs/kwic_results_filtered.csv")
dd_kwic_filtered <- subset(dd_kwic_filtered, select = -c(pre, post))

#write.csv(dd_kwic_filtered,"Inputs/kwic_filtered.csv")