From 1828d23a837b22d1f22001891a3ad8ed23ec0134 Mon Sep 17 00:00:00 2001 From: Linsberger Christian Date: Tue, 7 Sep 2021 14:00:40 +0200 Subject: [PATCH] Aktueller Stand --- 02_not_in_db.R | 88 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 85 insertions(+), 3 deletions(-) diff --git a/02_not_in_db.R b/02_not_in_db.R index c540ae3..6151273 100644 --- a/02_not_in_db.R +++ b/02_not_in_db.R @@ -32,9 +32,6 @@ common <- inner_join(neu_df, vorhanden_df) #Finde die Element die noch nicht in der Datenbank sind not_in_db <- anti_join(neu_df, common) -#Variante 2 -not_in_db_2 <- anti_join(all_df, vorhanden_df) - #Die der Uniques in eine Datei schreiben write_xlsx(not_in_db, paste(PFAD_OUT, "not_in_db_",format(Sys.time(), "%Y_%m_%d") ,".xlsx", sep="")) @@ -42,3 +39,88 @@ write_xlsx(not_in_db, paste(PFAD_OUT, "not_in_db_",format(Sys.time(), "%Y_%m_%d" # 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() + +#Zweite Schleife über die jeweiligen Zeilen des Spaltenvektors +for (zeile_excel in 1:nrow(not_in_db)) { + + #Current Excel ist das derzeit behandelte Zitate / Zelle + current_excel <- tolower(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}")) + + #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 + + #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) { + + 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.append(current_excel) + } + + } +} +