Håndholdte tilpasninger og download

Forfattet af

Klart som blæk

Senest opdateret

8.2.2024

Her følger en kort beskrivelse af de endelige justeringer af datasættet. Der er tale om manuelle tilpasninger og oprydning med henblik på præsentationen i vores søge-interface. Artiklen opdateres løbende. Nederst i artiklen kan du downloade den aktuelle version af datasættet.

Skabelsen af kolonnen “seneste_overskrift”

Da flere artikler kan optræde under en og samme overkrift, vurderede vi, at det var nødvendigt med en kolonne, der for hver artikel angiver den senest identificerede overskrift. Dette skabte vi på følgende måde.

library(tidyverse)
library(zoo)

df <- read_csv2("data/df_topics.csv")

df_overskrifter <- df %>% filter(str_detect(type, "overskrift")) %>% 
  mutate(overskrift = tekst) %>% 
  select(org_ID, overskrift)

df_2 <- df %>% 
  left_join(df_overskrifter)

df_2$overskrift <- na.locf(df_2$overskrift, na.rm = FALSE)

df_2 <- df_2 %>% 
  rename(seneste_overskrift = overskrift) %>% 
  filter(str_detect(type, "annonce"))

Det er i denne forbindelse vigtigt at fremhæve, at identifikationen af overskrifter ikke er fejlfri. På denne måde blotlægger denne kolonne også usikkerhederne i vores forsøg på at definere overskrifter automatisk.

Gennemsigtighed er en kvalitet, men vi fandt alligevel, at det var værd at lave nogle manuelle tilpasninger for at gøre brugen af avisen lettere. Dette gør vi ved at tælle, hvor ofte forskellige overskrifter optræder og gå de hyppigste igennem for at identificere fejl. Disse fejl vedrører typisk navne, der optræder hyppigt i avisen og derfor får samme kendetegn som en overskrift: en kort og hyppigt forekommende linje .

# Vi tæller overskrifter
overskrifter <- df_2 %>% 
  count(seneste_overskrift, sort = TRUE)

# Vi eksporterer optællingen, så den kan tjekkes manuelt i Excel
overskrifter %>% 
  write_excel_csv2("data/overskrifter.csv")

# Vi læser den ind igen
falske_overskrifter <- read_csv2("data/overskrifter_read.csv") %>% 
  filter(fjern == "x")

artikler_med_forkerte_overskrifter <- df_2 %>% 
  semi_join(falske_overskrifter, by = "seneste_overskrift")

# Imidlertid har vi det problem, at den forkerte overskrift ved første forekomst faktisk er en linje, der tilsvarende mangler fra den foregående artikel. Det fikser vi sådan her:
første_artikel_med_forkert_overskrift <- artikler_med_forkerte_overskrifter %>% 
  filter(seneste_overskrift!= lag(seneste_overskrift, default="1")) %>%
  mutate(org_ID = as.numeric(org_ID -2)) %>% 
  rename(forsvundet_linje = seneste_overskrift) %>% 
  select(org_ID, forsvundet_linje)

df_2 <- df_2 %>% 
  left_join(første_artikel_med_forkert_overskrift, by = "org_ID") %>% 
  mutate(tekst = paste(tekst, forsvundet_linje, sep = " "),
         tekst = str_remove_all(tekst, " NA")) %>% 
  select(-forsvundet_linje)

# Herefter fjernes alle de forkerte overskrifter
artikler_med_forkerte_overskrifter <- artikler_med_forkerte_overskrifter %>% 
  mutate(skal_overskriften_fjernes = "ja") %>% 
  select(org_ID, skal_overskriften_fjernes) %>% 
  distinct()

df_2 <- df_2 %>% 
  left_join(artikler_med_forkerte_overskrifter, by = "org_ID")

df_2 <- df_2 %>% 
  mutate(seneste_overskrift = case_when(
    skal_overskriften_fjernes == "ja" ~ NA, 
    .default = as.character(seneste_overskrift))) %>% 
  select(-skal_overskriften_fjernes)

# Til sidst fylder vi de tomme overskrifter ud på samme måde som i forrige kodestykke
df_2$seneste_overskrift <- na.locf(df_2$seneste_overskrift, na.rm = FALSE)

Manuelle rettelser af segmentering og stavemåder

Her følger en kort beskrivelse af en række manuelle rettelser.

“Ved Tallotteriet”

En gennemgående artikeltype i avisen er annonceringer af lotterinumre. Disse korte artikler driller vores segmenteringsalgoritme og er ofte ikke korrekt inddelt. De optræder ofte sammenblandet med stof om kirkelige handlinger. Følgende kodestykker identificerer disse artikler, splitter dem op og tildeler et nyt ID og en manuel indeksering til artiklerne om lotteri.

df_tallotteriet <- df_2 %>% 
  filter(str_detect(tekst, "Ved Tallotteriet"))

df_tallotteriet_2 <- df_tallotteriet %>% 
  mutate(tekst = str_replace_all(tekst, "Ved Tallotteriet", "SPLITVed Tallotteriet"),
         tekst = str_split(tekst, "SPLIT")) %>% 
  unnest(tekst) %>% 
  mutate(tekst_længde = str_count(tekst)) %>% 
  filter(tekst_længde > 0) %>% 
  select(-tekst_længde)

df_lotteri_artikler <- df_tallotteriet_2 %>% 
  filter(str_detect(tekst, "Ved Tallotteriet")) %>% 
  mutate(indeks = "lotteri (manuel)",
         ID_mod = "x1",
         org_ID = paste(org_ID, ID_mod, sep = "")) %>% 
  select(-ID_mod)

df_tallotteriet_3 <- df_tallotteriet_2 %>% 
  filter(!str_detect(tekst, "Ved Tallotteriet")) %>% 
  rbind(df_lotteri_artikler)

df_2 <- df_2 %>% 
  mutate(org_ID = as.character(org_ID)) %>% 
  anti_join(df_tallotteriet_3, by = "org_ID") %>% 
  rbind(df_tallotteriet_3)

df_2 <- df_2 %>% 
  arrange(dato, as.numeric(org_ID))

“Cours den”

Artikler om kurser er endnu en tilbagevendende genre. Som med lotteriartiklerne kommer de oftest i midten af avisen, hvor en række mindre artikler forefindes sammenklemt og i formater, der forvirrer vores segmenteringsalgoritme. Som med artiklerne om lotteri identificerer vi dem derfor manuelt.

df_kurs <- df_2 %>% 
  filter(str_detect(tekst, "Cours den"))

df_kurs_2 <- df_kurs %>% 
  mutate(tekst = str_replace_all(tekst, "Cours den", "SPLITCours den"),
         tekst = str_split(tekst, "SPLIT")) %>% 
  unnest(tekst) %>% 
  mutate(tekst_længde = str_count(tekst)) %>% 
  filter(tekst_længde > 0) %>% 
  select(-tekst_længde)

df_kurs_artikler <- df_kurs_2 %>% 
  filter(str_detect(tekst, "Cours den")) %>% 
  mutate(indeks = "kurser (manuel)",
         seneste_overskrift = "Cours",
         ID_mod = "x2",
         org_ID = paste(org_ID, ID_mod, sep = "")) %>% 
  select(-ID_mod)

df_kurs_3 <- df_kurs_2 %>% 
  filter(!str_detect(tekst, "Cours den")) %>% 
  rbind(df_kurs_artikler)

df_2 <- df_2 %>% 
  mutate(org_ID = as.character(org_ID)) %>% 
  anti_join(df_kurs_3, by = "org_ID") %>% 
  rbind(df_kurs_3)

df_2 <- df_2 %>% 
  arrange(dato, as.numeric(org_ID))

Tilbagevendende fejltranskriberinger

Her følger et kodestykke, der retter en række tilbagevendende transkriberingsfejl og løse ender. Finder du selv hyppige fejl, der kan rettes via “søg og erstat” er du velkommen til at kontakte os.

df_2 <- df_2 %>% 
  mutate(tekst = str_replace_all(tekst, 
                                 c("ugtog" = "ugt og",
                                   "¬" = " ")),
         seneste_overskrift = str_replace_all(seneste_overskrift,
                                              c("Dansk Børneven" = "Bekendtgørelser",
                                                "Russiske Fløde" = "Russiske Flåde")))

Tilpasning af indeks

I vores indeksering fandt vi en række emner, der ikke gav umiddelbar mening og derfor ikke blev navngivet. De optræder med navnet NA. Disse fjernes med følgende kode, der også fjerner og omdøber enkelte emneord.

df_2 <- df_2 %>% 
  mutate(indeks = str_remove_all(indeks, "NA \\(\\w+\\|\\w+\\)(; |)"),
         indeks = str_remove_all(indeks, "sko, støvler \\(86\\|180\\)"),
         indeks = str_remove_all(indeks, "; $"),
         indeks = str_replace_all(indeks, "konklave", "religion"))

Endelig eksport

Det endelige datasæt eksporteres med følgende kode og kan udforskes i vores søgeinterface.

df_2 %>% 
  select(org_ID, tekst, seneste_overskrift, dato, indeks) %>% 
  write_csv2("data/df_housekept.csv")

Download

Her kan du downloade det endelige datasæt.