#------------------------------------------------------------------------#
#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()