From 6a8966a26307cd6e460f5f306f70f122af722989 Mon Sep 17 00:00:00 2001 From: Linsberger Christian Date: Mon, 6 Sep 2021 14:04:48 +0200 Subject: [PATCH] Comments and more Config --- .gitignore | 5 +++++ config/config.R | 13 +++++++++--- find_and_replace_uri.R | 47 ++++++++++++++++++++++++++++++------------ find_new_entries.R | 9 ++++---- 4 files changed, 53 insertions(+), 21 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8b3c39f --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.Rproj.user +.Rhistory +.RData +.Ruserdata +*.xlsx \ No newline at end of file diff --git a/config/config.R b/config/config.R index 1c2862e..f9514ed 100644 --- a/config/config.R +++ b/config/config.R @@ -7,13 +7,20 @@ PFAD_OUT <- "data/Output/" PFAD_DB_OUT <- "data/Database/" #Datei in der ersetzt werden soll -FILENAME_EXCEL <- "GC3D_Limits_ref.xlsx" +FILENAME_EXCEL <- "project vocabulary_BB.xlsx" #Spaltennummer in denen ersetzt werden soll im Excel -SPALTEN <- c(2, 3, 4, 5, 6) +SPALTEN <- c(10, 11, 12, 13) #Spaltennummer mit der verglichen wird aus Datenbank (citations) INHALTE_DB <- 3 #Spaltennummer der Inhalte die eingesetzt werden soll (uris) -ID <- 1 \ No newline at end of file +ID <- 1 + +#Zeichenlänge unter der eventuell Zitate automatisch verworfen werden +THRESHOLD <- 20 + +#Match-Variablen, empfohlen wird das Jahr bei fast 1 zu lassen, mit der anderen kann je nach Datenqualität experimentiert werden +MATCH_ALL <- 0.8 +MATCH_YEAR <- 0.99 \ No newline at end of file diff --git a/find_and_replace_uri.R b/find_and_replace_uri.R index c9232f1..e493680 100644 --- a/find_and_replace_uri.R +++ b/find_and_replace_uri.R @@ -3,12 +3,11 @@ library("writexl") library("dplyr") library("xlsx") library("stringi") -library("SPARQL") library("stringr") library("tictoc") library("rlang") -#Funktionen einbinden +#Funktionen & Konfiguration einbinden source("sparql.R") source("config/config.R") @@ -16,53 +15,71 @@ source("config/config.R") ### Einlesen ### inDB <- get_current_geoera_lit_db() -to_replace_original <- read_excel(paste(PFAD_EXCEL, FILENAME_EXCEL, sep="")) +to_replace_original <- read_excel(paste(PFAD_EXCEL, FILENAME_EXCEL, sep=""), sheet = 1) to_replace_done <- to_replace_original -### - -#Schleife über den Spaltenvektor aus der Excel +#Erste Schleife über den Spaltenvektor aus der Excel for (spalte_excel in SPALTEN[1]:SPALTEN[length(SPALTEN)]) { #Start der Zeitmessung für aktuelle Spalte tic(paste("starte mit Spalte",spalte_excel)) + #Zweite Schleife über die jeweiligen Zeilen des Spaltenvektors for (zeile_excel in 1:nrow(to_replace_original[, spalte_excel])) { + #Current Excel ist das derzeit behandelte Zitate / Zelle current_excel <- tolower(to_replace_original[zeile_excel, spalte_excel]) + #Falls die aktuelle Zelle leer ist wird die nächste Iteration begonnen um Rechenleistung zu sparen if (is.na(current_excel)) { next } - if ((nchar(current_excel) < 20)) { + #Falls der Inhalt der aktuellen Zelle zu kurz ist wird ebenfalls die nächste Iteration begonnen und der Inhalt gelöscht + #der Grund dafür ist, dass es bei sehr wenigen Zeichen (<=THRESHOLD) sehr unwahrscheinlich ist, dass es ein gültiges Vollzitat ist + if ((nchar(current_excel) <= THRESHOLD)) { to_replace_done[zeile_excel, spalte_excel] <- "" next } + #Zerlegt den Zelleninhalt und macht daraus eine Liste "Wort"liste aus alphanumerischen Zeichen, getrennt wird jeweils bei nicht-alphanumischen Zeichen excel_search_all <- unlist(strsplit(gsub("[^[:alnum:] ]", "", current_excel), " +")) + #Legt eine Liste aus Zahlen zwischen 1900 & 2099 an, die in der aktuellen Zelle sind. (soll das Jahr der Publizierung finden) + #Grund hierfür ist, dass das Jahr ein sehr guter zusätzlicher Indikator ist ob eine Publikation gleich ist excel_search_numbers <- unlist(str_extract_all(current_excel, "(?:19|20)\\d{2}")) - + #Dritte Schleife die über die Vollzitatzeilen (INHALTE_DB) der Datenbank iteriert for (zeile_db in 1:nrow(inDB[, INHALTE_DB])) { + #aktuell behandeltes Element der Datenbank current_db <- tolower(inDB[zeile_db,INHALTE_DB]) + #Zerlegt den Zelleninhalt und macht daraus eine Liste "Wort"liste aus alphanumerischen Zeichen, getrennt wird jeweils bei nicht-alphanumischen Zeichen db_search_all <- unlist(strsplit(gsub("[^[:alnum:] ]", "", current_db), " +")) + + #Legt eine Liste aus Zahlen zwischen 1900 & 2099 an, die in der aktuellen Zelle sind. (soll das Jahr der Publizierung finden) db_search_numbers <- unlist(str_extract_all(current_db, "(?:19|20)\\d{2}")) + + #Initialiersierung der Countvariablen count_all <- 0 count_numbers <- 0 - percent_match_numbers <- 0.1 + #Initialiersierung der Matchvariablen + percent_match_all <- 0.01 + percent_match_numbers <- 0.01 + + #Vierter(a) Schleifendurchlauf - Eruiert welche Elemente des Excel-Vektors im Datenbankvektors sind und zählt diese for (k in 1:length(excel_search_all)) { if (excel_search_all[k] %in% db_search_all) { count_all <- count_all + 1 } } - + + #Vierter(b) Schleifendurchlauf - Eruiert welche Jahre des Excel-Vektors im Jahres-Datenbankvektors sind und zählt diese + #Wird nur durchgeführt wenn beide Vektoren gefüllt sind if ((length(db_search_numbers) > 0) && (length(excel_search_numbers) > 0)) { for (l in 1:length(excel_search_numbers)) { if (excel_search_numbers[l] %in% db_search_numbers) { @@ -72,24 +89,28 @@ for (spalte_excel in SPALTEN[1]:SPALTEN[length(SPALTEN)]) { } } + #Rechnet aus (in %) wieviele der Wörter gefunden wurden percent_match_all <- count_all / length(excel_search_all) + #Rechnet aus (in %) wieviele der Jahre gefunden wurden. Überprüfung ob der Excel-Jahresvektor leer ist, um Division durch 0 zu vermeiden if (length(excel_search_numbers) > 0) { percent_match_numbers <- count_numbers / length(excel_search_numbers) } - if ((percent_match_all > 0.80) && (percent_match_numbers > 0.99)) { + #Wenn genug Übereinstimmung gefunden wird, wird das Zitat durch die URI aus der Datenbank ersetzt + #Beim Jahr muss die Übereinstimmung höher sein, weil es ein sehr guter Indikator für die gleiche Publikation ist + if ((percent_match_all >= MATCH_ALL) && (percent_match_numbers > MATCH_YEAR)) { to_replace_done[zeile_excel, spalte_excel] <- str_remove_all(inDB[zeile_db,ID], "[<>]") } } } + #Ende der Laufzeitberechnung für die erste Schleife (gemacht um abschätzen zu können wie lange ein Durchgang dauert) toc() } -toc() - +#Schreibt die Exceldatei ins Outputverzeichnis pfad_output <- paste(PFAD_OUT, "replaced_", format(Sys.time(), "%Y_%m_%d_%H%M%S"), FILENAME_EXCEL, sep="") write_xlsx(to_replace_done, pfad_output) diff --git a/find_new_entries.R b/find_new_entries.R index 45f8a86..f4413d4 100644 --- a/find_new_entries.R +++ b/find_new_entries.R @@ -3,17 +3,16 @@ library("writexl") library("tidyverse") library("xlsx") +source("config/config.R") -pfad <- "data/Input/" - #select all *.xlsx files inside the Input-Folder and put them into a list -file_list <- list.files(pfad, "*.xlsx") +file_list <- list.files(PFAD_EXCEL, "*.xlsx") my_table <- c() for (file in 1:length(file_list)) { - temp_pfad <- paste(pfad, file_list[file], sep="") + temp_pfad <- paste(PFAD_EXCEL, file_list[file], sep="") my_table[[file]] <- read_excel(temp_pfad) } @@ -65,7 +64,7 @@ for (i in i:length(distincts$bibliographicCitation)) { distincts <- unique(distincts) -distincts <- data.frame(distincts[nchar(distincts$bibliographicCitation) >= 21, ]) +distincts <- data.frame(distincts[nchar(distincts$bibliographicCitation) >= THRESHOLD, ]) colnames(distincts) <- (c('bibliographicCitation')) write_xlsx(distincts, "data/Output/distincts_automated_gc3d.xlsx")