-
Notifications
You must be signed in to change notification settings - Fork 0
/
arkivhøsting.R
131 lines (99 loc) · 4.15 KB
/
arkivhøsting.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
## Formål: Høste norske institusjonelle arkiver og
## filtrere bort irrelevante poster
# Nødvendige pakker -------------------------------------------------------
library(tidyverse)
library(oai)
library(rvest)
# Klargjøring for arkivhøsting --------------------------------------------
## Hente arkivoversikt og id for Brage-arkiv
brage_arkiver <- read_html("https://sikt.no/tjenester/brage-lokale-vitenarkiv") |>
html_nodes(xpath = "/html/body/div/main/article/div[2]/div/figure/table") |>
html_table(header = TRUE)
brage_arkiver <- brage_arkiver[[1]] |>
filter(!str_detect(`OAI-PMH URL`, "løpig")) |>
mutate(url = paste0("https://", `OAI-PMH URL`, "request"),
identifier = map(url, list_identifiers)) |>
select(-`OAI-PMH URL`)
## UiT og UiO har separate vitenarkiv, disse må hentes separat
eksterne_arkiver <- tibble(Institusjon = c("UiT", "UiO"),
Vitenarkiv = c("Munin", "DUO"),
url = c("https://www.ub.uit.no/munin-oai/request",
"https://duo.uio.no/oai/request"),
identifier = map(url, list_identifiers))
## Binde sammen til en tabell
arkiver <- bind_rows(brage_arkiver,
eksterne_arkiver)
# Hente ID for alle arkivposter -------------------------------------------
## Hente ut ID per publikasjon
records <- arkiver |>
select(Institusjon,
url,
identifier) |>
unnest(identifier) |>
select(Institusjon,
url,
identifier) |>
nest_by(Institusjon,
url) |>
mutate(ids = map(data, ~as.vector(t(.)))) |>
select(-data) |>
unnest(ids)
## Lagre ID-sett
saveRDS(records, "oai_ids.rds")
# Høsting av metadata -----------------------------------------------------
## Funksjon for å hente poster fra API i tilfelle feilmeldinger
safe_get <- safely(.f = get_records)
## Hente metadata for hver ID
records <- records |>
mutate(results = map2(.x = url,
.y = ids,
~safe_get(id = .y, url = .x)))
## Lagre fullstendige metadata
saveRDS(records, "arkiv_poster.rds")
# Filtrering av metadata for komplett utvalg ------------------------------
## Hente ut relevante metadata: dato, id, tittel, emneord, sammendrag,
## publikasjonstype, språk, lisensiering
arkiv_metadata <- records |>
unnest_longer(results) |>
filter(results_id == "result") |>
unnest(results) |>
ungroup() |>
hoist(results,
date = list("metadata", "date"),
identifier = list("metadata", "identifier"),
title = list("metadata", "title"),
subject = list("metadata", "subject"),
description = list("metadata", "description"),
type = list("metadata", "type"),
language = list("metadata", "language"),
rights = list("metadata", "rights")) |>
mutate(cristin_id = str_extract(identifier, "(?<=cristin:).\\d*")) |>
select(-results, -results_id)
#Antall dokumenter totalt 17.02.23: 440581
## Filtrere bort duplikater og språk og
## kategorier uten oppdragsrelevans
arkiv_metadata <- arkiv_metadata |>
filter(str_detect(language, "[N|n]no") |
str_detect(language, "[E|e]ng"),
str_detect(type, "[P|p]eer") |
str_detect(type, "[A|a]rticle") |
str_detect(type, "[C|c]hapter") |
str_detect(type, "[D|d]octoral") |
str_detect(type, "[B|b]ook") |
str_detect(type, "[R|r]eport") |
str_detect(type, "ing [P|p]aper"))
## Antall dokumenter etter filtrering 17.02.23: 141976
## Filtrere for tidsperioden vi er interessert i
arkiv_metadata <- arkiv_metadata |>
separate_rows(date, sep = ";") |>
filter(str_detect(date, "^\\d")) |>
mutate(dato = str_extract(date, "^.{4}")) |>
mutate(dato = as.numeric(dato)) |>
filter(!is.na(dato)) |>
group_by(ids) |>
slice(which.min(dato)) |>
ungroup() |>
filter(dato > 2007)
## Endelig antall dokumenter 17.02.23: 126982
## Lagre metadata
saveRDS(arkiv_metadata, "arkiv_poster_til_filtrering.rds")