Vous êtes ici : FIL > Portail > Master Informatique > M1S1 > PJE1

PJE A - analyse de plagiat

L'objectif du PJE est de développer un logiciel, en équipe, en utilisant des outils de travail collaboratif. Dans le cadre du PJE "analyse de plagiat", le logiciel développé a pour but de mesurer la ressemblance entre deux codes. Soulignons que les méthodes mises en œuvre dans ce type d'outil ne servent pas uniquement pour détecter la triche entre étudiants mais peut avoir des utilisations dans l'étude de l'évolution des codes. Le développement d'un logiciel pour traiter ce problème sera l'occasion de découvrir des méthodes de traitement du texte.

Compétences acquises

  • travail collaboratif
  • gestion de projet
  • utilisation d'API

Connaissances acquises

  • analyse de texte
  • algorithmes de recherche de mots dans un texte
  • algorithmes de comparaison de texte

Mode de travail

Le projet est développé en groupes de 4 ou 5 étudiants. Chaque groupe développe sous un dépôt GIT. L'évaluation en cours de projet et de la version finale se fera par clone à une heure donnée (voir planning sur le portail). Les séances de cours/TD servent à mener une réflexion sur les développements algorithmiques du projet. Des notions sont apportées par les enseignants sans nécessairement expliciter comment elles peuvent être utilisées dans le projet. A chaque début de séance de TP, chaque groupe fait le point avec l'enseignant en quelques minutes, en présentant les réussites, les difficultés rencontrées et la répartition du travail pour la semaine à venir. Une évaluation publique des développements effectués est également présentée à chaque début de séance.

Responsables

  • Mikaël Salson
  • Jean-Stéphane Varré

Volume horaire

3h30 de TD/TP par semaine sur 10 semaines

Crédits

5 ECTS

Ce planning est donné à titre indicatif.

Séance Cours Travail préparatoire TP Remarque
du 10/09 au 15/09 festival MIX CITE jeudi 13 septembre
1 du 17/09 au 22/09 Présentation du sujet et première réflexions. Outils de développement. Lire les chapitres du livre ProGit indiqués dans l'onglets Documents. Effectuez le petit tutoriel de découverte de Git dont le lien est fourni dans l'onglet Documents. TP sur Git
Exemple de codes à comparer
2 du 24/09 au 29/09 Lexémisation Rappels sur l'analyse lexicale et syntaxique. Voir comment mettre en place un projet Maven (cf portail L3-COO) TP sur la lexémisation. Premier outil naïf de mesure de la similarité entre deux codes source.
3 du 01/10 au 06/10 Q-gram. Fingerprint. Karp-Rabin. Mise en oeuvre d'un premier outil utilisant les Q-gram. Livrable 1 pour le jeudi 4/10, 9h.
4 du 08/10 au 13/10 Distance de Levenshtein. Alignement local.
5 du 15/10 au 20/10 Suffix tree. Suffix array. Mise en oeuvre d'une troisième version s'inspirant des méthodes vues en cours. Livrable 2 pour le jeudi 18/10, 9h.
du 22/10 au 26/10 pas de séance pour cause de JMI ? Livrable 3 pour le vendredi 26/10, 19h.
du 29/10 au 03/11 interruption pédagogique automne
6 du 5/11 au 10/11 Mesures de similarité.
7 du 12/11 au 17/11 Présentation des stratégies des différentes équipes. Extension à l'analyse d'un ensemble de travaux. Livrable 4 pour le jeudi 15/11, 9h.
8 du 19/11 au 24/11 Représentation graphique.
9 du 26/11 au 01/12 Un peu de clustering. Livrable 5 pour le jeudi 30/11, 9h
10 du 03/12 au 08/12 Livrable 6 pour le jeudi 7/12, 9h
11 du 12/12 au 16/12 pas de séance Soutenances. Livrable 7 pour le jeudi 15/12, 9h.
15 du 18/12 au 22/12

Documents et ressources

Git

Maven

R

Liens utiles
De jolis graphiques
## on va utiliser la bibliothèque ggplot2

## la premiere fois, on installe ggplot2, une seule fois
#install.packages("ggplot2")

## une fois installée, il faut charger la librairie, à chaque fois
library(ggplot2)

## il faut commencer par charger les données
df <- read.csv("res_exemple4.txt",sep=" ",stringsAsFactors=FALSE)
## on peut préciser des noms pour les colonnes
names(df) <- c("file1","And","file2","sim")

## on ne garde seulement que les champs interessants pour nous
df = df[,c("file1","file2","sim")]

## on supprime les ':' à la fin de la colonne file2
get = function(x) gsub("(.*):", '\\1', x)
df$file2 <- get(df$file2)

## on transforme la chaîne contenant la similarité en nombre
get = function(x) gsub("(.*)%", '\\1', x)
df$sim <- get(df$sim)
df$sim <- as.numeric(df$sim)

##
## representations basiques
##

## on dessine simplement les points
qplot(file1,sim,data=df)

## on dessine une simple courbe, avec le nom du fichier 1 sur l'axe des x
qplot(df$file1,df$sim,geom="line")

## dessiner un bargraph
barplot(df$sim,names.arg=df$file1)
## avec ggplot
ggplot(df,aes(x=file1,y=sim)) + geom_bar(stat="identity")

##
## on veut voir la distribution des ressemblances
##

## dessiner un histograme
qplot(df$sim)
## avec ggplot
ggplot(df, aes(x=sim)) + geom_histogram(binwidth=10)
## pour passer l'axe des y en log
ggplot(df, aes(x=sim)) + geom_histogram(binwidth=10) + scale_y_log10()

## dessiner un boxplot
## auparavant il faut que la colonne des nom de fichier soit factorisé
str(df)
dfv = df[,c("file1","sim")]
dfv$file1 <- as.factor(dfv$file1)
str(dfv)
plot(dfv$file1,dfv$sim)
## avec ggplot
ggplot(dfv, aes(x=file1,y=sim)) + geom_boxplot()
## et pas besoin de transformer en vecteur !
ggplot(df, aes(x=file1,y=sim)) + geom_boxplot()

## on retrouve toutes les comparaisons
ggplot(df, aes(x=interaction(file1,file2),y=sim)) + geom_boxplot()

### on affiche les fichiers qui ont une moyenne superieure à 5, avec de la couleur
df5 = df
df5$pos <- df5$sim >= 5
ggplot(df5, aes(x=file1,y=sim,fill=pos)) + geom_boxplot()

## retour sur le bargraph
## avec des couleurs >= 5
ggplot(df5, aes(x=file1,y=sim,fill=pos)) + geom_bar(stat="identity")
## en empilant pour chaque fichier
ggplot(df5, aes(x=file1,y=sim,fill=file2)) + geom_bar(stat="identity")
ggplot(df5, aes(x=file1,y=sim,fill=file2)) + geom_bar(stat="identity") + geom_text(aes(y=sim,label=sim),colour="Black")

## graphes
library(igraph)
d = df[df$sim >= 5,]
g <- graph_from_data_frame(d,directed=FALSE)
plot(g,vertex.size=4,vertex.label.cex=0.5) 
plot(g,vertex.size=14,edge.label=paste(E(g)$sim,"%"))

## transformation en matrice
f = function(x) ((100-x)/100)
df1 = df
df1[3] = lapply(df1[3],FUN=f)
un1 = unique(unlist(df1[1:2]))
df1[1:2] = lapply(df1[1:2], factor, levels=un1)
m1 = xtabs(sim~file1+file2, df1)
d = as.dist(m1+t(m1))
m = as.matrix(d)

## matrice de ressemblance
library(corrplot)
corrplot(m,na.label=" ",tl.cex=1,type="upper",cl.lim=c(0,1))


## sortir les graphes dans des fichiers
png("plot1.png")
ggplot(df,aes(x=file1,y=sim)) + geom_bar(stat="identity")
dev.off()  
Preparation des données
les données initiales exple8.txt
# obtention du CSV
cat exple8.txt | sed -e 's/and//g' | tr ':' ' ' | tr '%' ' ' > exple8.csv
# chargement du dataframe
mydata = read.csv("exple8.csv",sep="", header=FALSE)
names(mydata) = c("file1","file2","sim")
# installation des librairies (à faire une fois)
install.packages(igraph)
# chargement des librairies
library(igraph)
Construire le graphe de similarité
# creation du graphe de similarité
df = mydata[(mydata$sim >= 10),]
g <- graph.data.frame(df, directed=FALSE)
plot(g,vertex.size=4,vertex.label.cex=0.5)  
Mettre les composantes en couleur
# calcul et coloriage des composantes
comps <- components(g)$membership
colbar <- rainbow(max(comps)+1)
V(g)$color <- colbar[comps+1]
plot(g, layout=layout_with_fr, vertex.size=5, vertex.label=NA)  
Transformation en une matrice de distance
# transformation en matrice de distance
f = function(x) ((100-x)/100)
df1 = df
df1[3] = lapply(df1[3],FUN=f)
un1 = unique(unlist(df1[1:2]))
df1[1:2] = lapply(df1[1:2], factor, levels=un1)
m1 = xtabs(sim~file1+file2, df1)
d = as.dist(m1+t(m1))  
Construction d'un clusetring hierarchique
# clustering hierarchique
library(cluster)  
hc = hclust(d)
plot(hc)
rect.hclust(hc, k=9, border="red")  
Clustering des paires ayant le même niveau de ressemblance
C'est juste un exemple qui ici ne signifie vraiement pas grand chose.
d = dist(df1)
fit = kmeans(d,8)
clusplot(df1, fit$cluster, color=TRUE, shade=TRUE,labels=2, lines=0)  
Pour une sortie graphique dans un fichier
Avant de faire le plot il faut dire à R qu'on redirige celui-ci dans un fichier:
png("monimage.png")
Puis on lance le plot. Et ensuite on ferme le fichier PNG.
dev.off()

Supports de cours

Articles scientifiques

Jeux de données

Résultats

Description des benchmarks

  1. exemple 0
  2. exemple 1 : modification de noms de variables, ajout de commentaires, réorganisation de lignes de code
  3. exemple 2 : variations autour de la structure d'une classe, méthodes dans des ordres différents mais le contenu reste identique
  4. exemple 3 : une interface et des classes implémentants celle-ci, différentes implémentations provenant de TP étudiants
  5. exemple 4 : une classe, différentes implémentations provenant d'un TP étudiant, mais sans ressemblance évidente entre les différentes implantations
  6. exemple 5 : proposé par l'équipe Wallaby en 2016/2017
  7. exemple 6 : proposé par l'équipe Wallaby en 2016/2017
  8. exemple 7 : proposé par l'équipe VEMP (deux gros fichiers) en 2016/2017
  9. exemple 8 : toutes les classes d'un projet étudiant
  10. exemple 9 : toutes les classes d'un projet étudiant

Evolution des commits par équipe (maj le 11/10/2018)

Evolution des commits par équipe

Evolution du nombre de merge requests

Evolution du nombre de merge requests width=

Evolution de la couverture de code

Evolution de la couverture de code

Livrables

  1. Livrable 1
  2. Livrable 2
  3. Livrable 3
  4. Livrable 4
  5. Livrable 5
  6. Livrable 6

TEAM Inglorious Basterds

**** Version v1.0 ****
**** Compiling package ****
**** Launching benchmarks ****
**** Running exemple0 ****
**** Running exemple0_17-18 ****
**** Running exemple0_18-19 ****
**** Running exemple1 ****
**** Running exemple2 ****
**** Running exemple3 ****
**** Running exemple4 ****

TEAM PlagiatChecker

**** Version v1.0 **** **** Compiling package **** **** Creating JAR **** **** Launching benchmarks **** **** Running exemple0 **** **** Running exemple0_17-18 **** **** Running exemple0_18-19 **** **** Running exemple1 **** **** Running exemple2 **** **** Running exemple3 **** **** Running exemple4 ****

TEAM PSG

**** Version v1.0 ****
**** Compiling package ****
**** Launching tests ****
**** Creating JAR ****
**** Launching benchmarks ****
**** Running exemple0 ****
aucun attribut manifest principal dans target/yapt-v1.0.jar
exemple0 Inglorious Basterds PlagiatChecker secrettool
exemple0_17-18 Inglorious Basterds PlagiatChecker secrettool
exemple0_18-19 Inglorious Basterds PlagiatChecker secrettool
exemple1 Inglorious Basterds PlagiatChecker secrettool
exemple2 Inglorious Basterds PlagiatChecker secrettool
exemple3 Inglorious Basterds PlagiatChecker secrettool
exemple4 Inglorious Basterds PlagiatChecker secrettool
Page en cours de construction
Page en cours de construction
Page en cours de construction
Page en cours de construction
Page en cours de construction