#------------------------------------------------------------------------# #Authoren: Marco Costa & Mario Lanfranchi #HTW Chur / Studienarbeit 2 #TETv08 / TETt08 #Datum: 22. Juni 2009 #------------------------------------------------------------------------# # Begrüssung cat(" ################################################","\n","# Plagiatfinder v 1.2 #","\n","################################################","\n\n") #------------------------------------------------------------------------# #Das Programm R hat Schwierigkeiten beim Vergleichen von Sonderzeichen. So musste #man eine Funktion programmieren, die die Sonderzeichen in einem Text in andere #Zeichen umwandelte oder löschte. Am Ende wird der bereinigte Text zurückgegeben. charClean <- function (text){ char <- matrix(0, 20,2) char[1,1] <- "ä" char[1,2] <- "ae" char[2,1] <- "ö" char[2,2] <- "oe" char[3,1] <- "ü" char[3,2] <- "ue" char[4,1] <- "Ä" char[4,2] <- "Ae" char[5,1] <- "Ü" char[5,2] <- "Ue" char[6,1] <- "Ö" char[6,2] <- "Oe" char[7,1] <- "é" char[7,2] <- "é" char[8,1] <- "\\(" char[8,2] <- "" char[9,1] <- ")" char[9,2] <- "" char[10,1] <- "è" char[10,2] <- "e" char[11,1] <- "à" char[11,2] <- "a" char[12,1] <- "ä" char[12,2] <- "ae" char[13,1] <- "ä" char[13,2] <- "ae" char[14,1] <- "ä" char[14,2] <- "ae" char[15,1] <- "ä" char[15,2] <- "ae" char[16,1] <- " " char[16,2] <- " " i<-1 while(i <= length(char) / 2){ text <- gsub(char[i,1], char[i,2], text) i <- i+1 } return (text) } #------------------------------------------------------------------------# #Die Sätze des Textes werden getrennt und in einem Array gespeichert splitter <- function (text){ splitter <- c("\\. ", "\\, ") i <- 1 while(i<=length(splitter)){ text <- unlist(strsplit(text, splitter[i])) i <- i+1 } return (text) } #------------------------------------------------------------------------# #Diese Funktion erstellt eine Verbindung zwischen dem Webserver und dem Programm #R. Grundsätzlich sucht der Webserver auf der Google-Suchmachine nach dem #weitergegebenen Satz mit Hilfe des Parameters und der gesuchte Quelltext wird von #der Suchmaschine zurückgegeben. urlConnection <- function (satz, verfahren, seite){ splittext <- splitter(originaltext) splittexturl <- gsub(' ', '%20', splittext[satz]) if(verfahren == 0){ urlcon = paste('http://cosweb.dyndns.org/search.php?s=%22', splittexturl, '%22', sep = "") } else{ urlcon = paste('http://cosweb.dyndns.org/search.php?res=1&s=', splittexturl, '&start=', seite, sep = "") } con <- url(urlcon , "r") quelltext <- readLines(con, warn = FALSE) Encoding(quelltext) Encoding(quelltext) <- "latin1" close(con) return (quelltext) } #------------------------------------------------------------------------# #1. Verfahren analyze <- function (){ u<-1 a<-1 splittextOrg <- splitter(originaltext) splittext <- tolower(splitter(originaltext)) cop <- matrix(0, length(splittext),2) while(u <= length(splittext)){ quelltext <- urlConnection(u,0) start <- gregexpr("
", article[1]) stop <- gregexpr("", article[1]) urlarticle[1] <- substr(article[1], start[[1]][[1]]+6, stop[[1]][[1]]-4) #Suche nach Plagiaten if(nchar(splittext[u]) > 130){ splittext[u] <- substr(splittext[u], 0, 130) lastspace <- gregexpr(" ", splittext[u]) splittext[u] <- substr(splittext[u], 0, lastspace[[1]][[length(lastspace[[1]])]]-1) } article[1] <- gsub('"','', article[1]) splittext[u] <- gsub('"','', splittext[u]) splittext[u] <- gsub("\\.","", splittext[u]) if(regexpr(splittext[u], article[1], ignore.case = TRUE, extended = TRUE) != -1){ cop[a,1] <- splittextOrg[u] urlarticle[1] <- gsub("","", urlarticle[1]) urlarticle[1] <- gsub("","", urlarticle[1]) cop[a,2] <- urlarticle[1] a <- a+1 } u <- u+1 } return (cop) } #------------------------------------------------------------------------# #2. Verfahren analyzePro <- function (){ seite <- 0 splittextOrg <- splitter(originaltext) splittext <- tolower(splitter(originaltext)) cop <- matrix(0, length(splittext)*3, 2) a <- 1 while(seite <= 2){ u<-1 while(u <= length(splittext)){ quelltext <- urlConnection(u,1,seite) start <- gregexpr("
", article[i]) stop <- gregexpr("", article[i]) urlarticle[i] <- substr(article[i], start[[1]][[1]]+6, stop[[1]][[1]]-4) i <- i+1 } #Suche nach Plagiaten if(nchar(splittext[u]) > 130){ splittext[u] <- substr(splittext[u], 0, 130) lastspace <- gregexpr(" ", splittext[u]) splittext[u] <- substr(splittext[u], 0, lastspace[[1]][[length(lastspace[[1]])]]-1) } splittext[u] <- gsub('"','', splittext[u]) splittext[u] <- gsub("\\.","", splittext[u]) i <- 1 words <- unlist(strsplit(splittext[u], " ")) while(i <= length(article)){ article[i] <- gsub('"','', article[1]) h <- 1 find <- 0 count <- 0 ok <- 0 while(h <= length(words)){ if(regexpr(words[h], article[i]) != -1){ count <- count+1 } h <- h+1 } find <- gregexpr("", article[i]) find <- length(find[[1]]) if(find == 1 || find == 2){ ok <- 1 } if(count >= length(words)-1 & ok == 1){ cop[a,1] <- splittextOrg[u] urlarticle[i] <- gsub("", "", urlarticle[i]) urlarticle[i] <- gsub("", "", urlarticle[i]) cop[a,2] <- urlarticle[i] a <- a+1 break } i <- i+1 } u <- u+1 } seite <- seite+1 } #Doppelt erfasste Einträge löschen i <- length(cop[])/2 while(i >= 1){ u <- 1 while(u <= length(cop[])/2){ if(i != u) { if(cop[i,1] == cop[u,1]) { cop[i,1] <- "0" cop[i,2] <- "0" } } u <- u+1 } i <- i-1 } return (cop) } #------------------------------------------------------------------------# #Die Ergebnisse werden gezeigt printResult <- function (x){ if(x == 0){results <- analyze()} else{results = analyzePro()} resultsm <- results cat("Die folgende Sätze wurden aus dem Internet kopiert:","\n\n") i <- 1 anzahlSaetze <- 0 while(i <= length(results)/2){ if(results[i,1] != "0"){anzahlSaetze <- anzahlSaetze+1} i <- i+1 } data <- array() data1 <- c(anzahlSaetzeStart-anzahlSaetze, anzahlSaetze) labels <- array() labels1 <- c(anzahlSaetzeStart-anzahlSaetze,anzahlSaetze) text<-array() i <- 1 a <- 1 while(i <= length(results)/2) { u <- 1 count <- 0 if(results[i,1] != 0) { while(u <= length(results)/2) { resultsm[i,2] <- substr(results[i,2], 0, 15) if(regexpr(resultsm[i,2], resultsm[u,2]) != -1 & resultsm[i,2] != 0){ count<-count+1 } u <- u+1 } cat(i,". ",results[i,1]," -> ",results[i,2],"\n\n", sep = "") text[a] <- paste(i,". ",results[i,1]," -> ",results[i,2],"\n\n", sep = "") labels[a] <- results[i,2] data[a] <- count a <- a+1 } i <- i+1 } cat("Wollen Sie die Ergebnisse als Diagramme sehen? (j/n)","\n", sep="") id <- readline() if(id == "j") { pie(data,labels = labels, main="Ergebnisse", clockwise=TRUE, lty = 2, radius=0.5) } cat("Wollen Sie einen Übersicht als Diagramm von wie vielen Sätzen kopiert wurden? (j/n)","\n", sep="") id <- readline() if(id == "j") { pie(data1, labels = labels1, main="Blau -> Anzahl kopierte Sätze", clockwise=TRUE, lty = 2) } cat("Wollen Sie einen anderen Text analysieren? (j/n)","\n", sep="") id <- readline() if(id == "j") {start()} else{q(save = "no")} } #------------------------------------------------------------------------# #Start / Menü start <- function(){ cat("Bitte wählen Sie welches Verfahren anwenden wollen.","\n\n","1 -> Datei auswählen","\n","2 -> Text eingeben","\n", sep = "") id<-readline() if(id == 1){ textfile <- file(file.choose(), "r") originaltext <- readLines(textfile, warn = FALSE) } if(id == 2){ originaltext <- readline() } if(id != 1 & id != 2){ cat("Bitte geben Sie eine Nummer zwischen 1 und 2 an!","\n\n") start() } originaltext <<- charClean(originaltext) splittext <- splitter(originaltext) anzahlSaetzeStart <<- length(splittext) cat("Bitte wählen Sie welches Verfahren anwenden wollen.","\n\n","1 -> Schnelles Verfahren (Besonders gut für Sätze, die eins zu eins kopiert wurden)","\n","2 -> Dettaliertes Verfahren (Besonders für Sötze, die leicht gändert wurden)","\n","3 -> Beenden","\n", sep = "") id <- readline() if(id == 1){printResult(0)} if(id == 2){printResult(1)} if(id == 3){q(save = "no")} if(id != 1 & id != 2){ cat("Bitte geben Sie eine Nummer zwischen 1 und 3 an!", "\n\n") start() } } #------------------------------------------------------------------------# #Plagiatfinder starten start()