|
| 1 | +--- |
| 2 | +title: "breve" |
| 3 | +format: html |
| 4 | +--- |
| 5 | + |
| 6 | +Vi prøver et nyt format - stadig en hjemmeside, men nu med downloadbart quartodokument (ja, tough titties hvis du er på rstudio) |
| 7 | + |
| 8 | +Men det fungerer fint i Rstudio på min maskine. Vi skal blot have det testet på en |
| 9 | +maskine der ikke har positron installeret. |
| 10 | + |
| 11 | + |
| 12 | +På |
| 13 | + |
| 14 | +"https://kb-dk.github.io/cultural-heritage-data-guides-Python/Explore%20Denmarks%20Letters.html" |
| 15 | + |
| 16 | +kan man læse en pythonistisk ting med analyse af de her breve. |
| 17 | + |
| 18 | +Og herfra kan man downloade en zipfil: |
| 19 | +"https://loar.kb.dk/handle/1902/49123" |
| 20 | + |
| 21 | +Den findes på |
| 22 | + |
| 23 | + |
| 24 | +"https://kb-dk.github.io/cultural-heritage-data-guides-Python/Explore%20Denmarks%20Letters.html" |
| 25 | + |
| 26 | +```{r} |
| 27 | +# download.file("https://loar.kb.dk/bitstreams/15559883-a390-4ee2-8af2-4124948f7585/download", |
| 28 | +# "data/test.zip") |
| 29 | +``` |
| 30 | + |
| 31 | +Den skal vi nok ikke have på en hjemmeside... |
| 32 | + |
| 33 | +```{r} |
| 34 | +library(tidyverse) |
| 35 | +# unzip("data/public_domain_Danmarks_Breve.zip", list = TRUE) |
| 36 | +``` |
| 37 | + |
| 38 | +When we have downloaded the zip-file, we can extract the csv file that we |
| 39 | +are intererested in: |
| 40 | +```{r} |
| 41 | +# unzip("data/public_domain_Danmarks_Breve.zip", files="public_domain_Danmarks_Breve/Denmarks_letters_dataset.csv", |
| 42 | +# exdir="data", junkpaths = TRUE) |
| 43 | +``` |
| 44 | + |
| 45 | + |
| 46 | +The zip file contains other data - xml-files for each letter in the dataset, |
| 47 | +an python-notebook with examples on what to do with the data, a list of danish stopwords, readme files etc. |
| 48 | +And, a separate __MACOSX folder that we can safely ignore, and should not even exist in zip files meant for distribution. |
| 49 | + |
| 50 | +Anyway... |
| 51 | + |
| 52 | +Metadata for the csv-file is nowhere to be found in the zip-file, but we can reconstruct it: |
| 53 | + |
| 54 | + |
| 55 | +```{r} |
| 56 | +data <- read_csv("data/Denmarks_letters_dataset.csv") |
| 57 | +names(data) |
| 58 | +
|
| 59 | +``` |
| 60 | + |
| 61 | +|column_name | datatype| content| |
| 62 | +|---|---|---| |
| 63 | +|url | string | url til den oprindelige udgivelse| |
| 64 | +|sender | string | Afsendere - den person der skrev brevet | |
| 65 | +|sender_st | string | Afsendere - den person der skrev brevet - uden foranstillet komma | |
| 66 | +|recipiant| string | modtager af brevet, en del foranstillede kommaer | |
| 67 | +|recipiant_st| string | modtager af brevet, uden foranstillede kommaer. Når der står recipiant i stedet for recipent, er det formentlig en fejl introduceret da data blev ekstraheret fra kilden | |
| 68 | +|geo_name| string| Adresse - er det adressen på afsender eller modtager? | |
| 69 | +|raw_date| string | Den rå dato fra brevet| |
| 70 | +|raw_text | string | Den rå tekst - indholdet af brevet | |
| 71 | +|year_st |dbl | Året - står st mon for standardiseret? Eller renset.| |
| 72 | +|text_st | string | Også en relativt rå tekst. Det lader til primært at være at der ikke er escapeteng for linieskift etc. Og så er der sat en masse whitespaces ind mellem punktumme. bindestreger lader også til at være erstattet med mellemrum. | |
| 73 | +|word_count |dbl | Antal ord i brevet | |
| 74 | +|geo_name_st | string | adresse - men kogt ned til bynavne. | |
| 75 | +|xml_file_name | string | navn på source xml-fil. | |
| 76 | +|pubTitle | string | Titlen på den oprindelige brevudgivelse | |
| 77 | +|pubAuthor | string | Udgiveren af den oprindelige brevudgivelse | |
| 78 | +|pubPublisher| string | Forlaget på hvilket den oprindelige brevudgivelse kom | |
| 79 | +|pubPublisher_st | string | Standardiseret forlagsnavn.| |
| 80 | +|pubPlace | string | lokation for udgivelsen| |
| 81 | +|pubPlace_st | string | Standardiseret lokation for udgivelsen| |
| 82 | +|pubDate| string | årstal - og hvorfor bliver den opfattet som string? | |
| 83 | + |
| 84 | +pubDate står som string fordi der har sneget sig en "1903-09-18". Det kan ikke håndteres som hverken |
| 85 | +tal eller dato, så vi defaulter til text. |
| 86 | + |
| 87 | +Alle andre er text. |
| 88 | + |
| 89 | +Bemærk dog at i hans notebook, optræder year_st som float, og word_count som int. Er der noget her? |
| 90 | +Nej, det er blot fordi den rå tekst har eksempelvis 1864.00 stående. Hvorfor der gør det ved ingen, men det er |
| 91 | +ikke et problem her. |
| 92 | + |
| 93 | + |
| 94 | + |
| 95 | +Så trin 1 er noget rensning af data. |
| 96 | + |
| 97 | +pubDate skal til dbl. vi behøver ikke gøre noget ved year_st. Vi har ikke brug for pubPlace. af pub* kolonnerne er det faktisk kun pubDate |
| 98 | +Vi har heller ikke brug for url, sender, og recipiant |
| 99 | +|url | string | url til den oprindelige udgivelse| |
| 100 | +|sender | string | Afsendere - den person der skrev brevet | |
| 101 | +|sender_st | string | Afsendere - den person der skrev brevet - uden foranstillet komma | |
| 102 | +|recipiant| |
| 103 | + |
| 104 | + |
| 105 | +```{r} |
| 106 | +data <- data |> |
| 107 | + select(sender_st, recipiant_st, year_st, text_st, geo_name_st) |
| 108 | +
|
| 109 | +
|
| 110 | +``` |
| 111 | + |
| 112 | +Det er så det data vi skriver til en fil, og indlæser. Vi kan også tilbyde de studerende at hente den direkte. HUSK VI SKAL HAVE RETTET STAVEFEJLEN I RECIPIANT_ST! |
| 113 | + |
| 114 | + |
| 115 | +```{r} |
| 116 | +library(GGally) |
| 117 | +library(network) |
| 118 | +library(sna) |
| 119 | +library(ggplot2) |
| 120 | +
|
| 121 | +
|
| 122 | +``` |
| 123 | + |
| 124 | +Det er en lidt. Ja. |
| 125 | + |
| 126 | +Nå. Sådan et netværk viser hvem der skriver til hvem. Vi kunne også gøre det ved steder, |
| 127 | +men kender vi både afsender og modtager adressen? Det tror jeg ikke. |
| 128 | +Så - hvem skriver til hvem. Vi har brug for tokolonner: |
| 129 | + |
| 130 | + |
| 131 | +Vi kan nok ikke bruge rækker med NA-værdier til så meget: |
| 132 | + |
| 133 | +Men her er antallet af breve sendt fra sender_st til recipiant_st (se nu at få rettet den stavefejl.) |
| 134 | + |
| 135 | +Det er det vi kalder for edges. |
| 136 | +```{r} |
| 137 | +edges <- data |> |
| 138 | + drop_na(c(sender_st, recipiant_st)) |> |
| 139 | + count(from = sender_st, to = recipiant_st) |
| 140 | +
|
| 141 | +``` |
| 142 | + |
| 143 | +Så skal vi have knuderne - det er hver enkelt person (eller entitet) der optræder. Enten som |
| 144 | +afsender eller modtager. Så vi skal have en unik liste. |
| 145 | + |
| 146 | + |
| 147 | +```{r} |
| 148 | +nodes <- data |> |
| 149 | + select(sender_st, recipiant_st) |> |
| 150 | + pivot_longer(1:2) |> |
| 151 | + select(name = value) |> |
| 152 | + distinct(name) |> |
| 153 | + drop_na() |
| 154 | +``` |
| 155 | + |
| 156 | +Så kan vi bygge et graf-objekt: |
| 157 | + |
| 158 | + |
| 159 | +```{r} |
| 160 | +library(ggraph) |
| 161 | +library(tidygraph) |
| 162 | +g <- tbl_graph(nodes = nodes, edges = edges, directed = TRUE) |
| 163 | +g <- g %>% |
| 164 | + activate(edges) %>% |
| 165 | + filter(n >= 3) %>% # behold kun "tunge" forbindelser |
| 166 | + activate(nodes) %>% |
| 167 | + filter(!node_is_isolated()) |
| 168 | +ggraph(g, layout = "fr") + |
| 169 | + geom_edge_link(aes(width = n), alpha = 0.35, show.legend = TRUE) + |
| 170 | + geom_node_point(size = 3) + |
| 171 | + geom_node_text(aes(label = name), repel = TRUE, size = 3) + |
| 172 | + scale_edge_width(range = c(2, 2.5)) + |
| 173 | + theme_void() |
| 174 | +
|
| 175 | +``` |
| 176 | + |
| 177 | +hvilke andre layouts er der? |
| 178 | +der er flere, men ikke alle virker. |
| 179 | +fr |
| 180 | +focus |
| 181 | +nicely |
| 182 | + |
| 183 | + |
| 184 | +dh |
| 185 | +gem |
| 186 | +graphopt |
| 187 | +grid |
| 188 | +mds |
| 189 | +sphere |
| 190 | +randomly |
| 191 | +fr |
| 192 | +kk |
| 193 | +drl |
| 194 | +lgl |
| 195 | + |
| 196 | + |
| 197 | +Under alle omstændigheder er det tydeligt at se at der delnetværk. |
| 198 | +Netværk som ikke er forbundet med andre. |
| 199 | + |
| 200 | +Det er ikke så overraskende: |
| 201 | + |
| 202 | +Men vi kan kun vise det hvis vi husker at have url med i datasættet. Ellers er det knap så tydeligt at der er et antal kilder. |
| 203 | + |
| 204 | + |
| 205 | + |
| 206 | +Vi skal nok have lidt mere end bare det her. Det er lidt tyndt til to timer tror jeg. |
| 207 | + |
0 commit comments