131 lines
No EOL
5.2 KiB
R
131 lines
No EOL
5.2 KiB
R
library("readxl")
|
|
library("writexl")
|
|
library("dplyr")
|
|
library("xlsx")
|
|
library("stringi")
|
|
library("stringr")
|
|
library("tidyverse")
|
|
|
|
#Konfiguration einbinden
|
|
source("config/config.R")
|
|
source("sparql.R")
|
|
|
|
#Datenbank einlesen und doppelte entfernen
|
|
inDB <- data.frame(get_current_geoera_lit_db()$citation)
|
|
inDB <- unique(inDB)
|
|
|
|
#Spaltenname setzen
|
|
colnames(inDB) <- (c(COLUMN_NAME))
|
|
|
|
#Excel mit den Zitaten die hinzugefügt werden sollen einlesen
|
|
neu_df <- data.frame(read_excel(paste(PFAD_EXCEL, "distincts_kontrolliert.xlsx", sep="")))
|
|
neu_df <- data.frame(lapply(neu_df, stri_enc_toutf8))
|
|
|
|
#die beiden Dataframes zusammenfügen (braucht gleiche Spaltennamen)
|
|
all_df <- rbind(inDB, neu_df)
|
|
all_df_2 <- unique(all_df)
|
|
|
|
#inner_join finds common elements between two data frames
|
|
#anti_join finds elements the are exclusively in one of the data frames
|
|
|
|
#Gemeinsame Element finden
|
|
common <- inner_join(neu_df, inDB)
|
|
|
|
#Finde die Element die noch nicht in der Datenbank sind
|
|
not_in_db <- anti_join(neu_df, common)
|
|
|
|
#### TO DO ####
|
|
# Die direkte Vergleichsfunktion durch die %-Match-Funktion aus 03 ersetzen.
|
|
# Ist etwas heikler, sollte aber weiterhin ganz gut funktionieren.
|
|
# Gehört komplett ausprogrammiert und getest.
|
|
|
|
not_in_db_2 <- c()
|
|
|
|
#Erste Schleife über die Zeilen der Einträge die nicht in der Datenbank sind
|
|
for (zeile_excel in 1:nrow(not_in_db)) {
|
|
|
|
#Current Excel ist das derzeit behandelte Zitate / Zelle
|
|
current_excel <- str_squish(not_in_db[zeile_excel, 1])
|
|
|
|
#Falls die aktuelle Zelle leer ist wird die nächste Iteration begonnen um Rechenleistung zu sparen
|
|
if (is.na(current_excel)) {
|
|
next
|
|
}
|
|
|
|
#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)) {
|
|
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}"))
|
|
|
|
#Zweite Schleife die über die Vollzitatzeilen der Datenbank iteriert
|
|
for (zeile_db in 1:nrow(inDB)) {
|
|
|
|
#aktuell behandeltes Element der Datenbank
|
|
#current_db <- tolower(inDB[zeile_db, 1])
|
|
current_db <- str_squish(inDB[zeile_db, 1])
|
|
|
|
#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
|
|
|
|
#Initialiersierung der Matchvariablen
|
|
percent_match_all <- 0.01
|
|
percent_match_numbers <- 0.01
|
|
|
|
#Dritter(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
|
|
}
|
|
}
|
|
|
|
#Dritter(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) {
|
|
|
|
count_numbers <- count_numbers + 1
|
|
}
|
|
}
|
|
}
|
|
|
|
#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)
|
|
}
|
|
|
|
#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, 1] <- str_remove_all(inDB[zeile_db,ID], "[<>]")
|
|
not_in_db_2 <- c(not_in_db_2, current_excel)
|
|
}
|
|
|
|
}
|
|
}
|
|
#muss in einen Data-Frame umgewandelt werden um write_xlsx zu verwenden
|
|
not_in_db_2 <- data.frame(not_in_db_2)
|
|
not_in_db_2 <- unique(not_in_db_2)
|
|
colnames(not_in_db_2) <- (c(COLUMN_NAME))
|
|
|
|
#Die der Uniques in eine Datei schreiben
|
|
write_xlsx(not_in_db_2, paste(PFAD_OUT, "not_in_db_",format(Sys.time(), "%Y_%m_%d") ,".xlsx", sep="")) |