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
Vous aborderez notamment (dans l'ordre que vous souhaitez) les
points suivants :
- description de la méthode implantée
- justification des choix réalisés : paramètres, méthodes retenues, … mesures à l'appui
- explication du contenu du rapport HTML fourni à l’utilisateur
- explication de la méthodologie de travail du groupe
- conception logicielle
|
Livrable 7 pour le jeudi 15/12, 9h.
|
15 |
du 18/12 au 22/12 |
|
|
|
|
Documents et ressources
Git
Maven
R
Représentation graphique
Clustering
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
Quelques petits exemples en R utilisant les données précédentes.
Supports de cours
Articles scientifiques
- Matija Novak, 2016,
Review of source-code plagiarism detection in academia. In Information and Communication Technology, Electronics and Microelectronics (MIPRO), 2016 39th International Convention on (pp. 796-801). IEEE.
- KARP R.M., RABIN M.O., 1987, Efficient randomized pattern-matching algorithms. IBM J. Res. Dev. 31(2):249-260., exemple
- SCHLEIMER et al., 2003, Winnowing: local algorithms for document fingerprinting, SIGMOD'03 Proceedings of the 2003 ACM SIGMOD international conference on Management of data
Pages 76-85.
Jeux de données
Résultats
Description des benchmarks
- exemple 0
- exemple 1 : modification de noms de variables, ajout de commentaires, réorganisation de lignes de code
- exemple 2 : variations autour de la structure d'une classe, méthodes dans des ordres différents mais le contenu reste identique
- exemple 3 : une interface et des classes implémentants celle-ci, différentes implémentations provenant de TP étudiants
- exemple 4 : une classe, différentes implémentations provenant d'un TP étudiant, mais sans ressemblance évidente entre les différentes implantations
- exemple 5 : proposé par l'équipe Wallaby en 2016/2017
- exemple 6 : proposé par l'équipe Wallaby en 2016/2017
- exemple 7 : proposé par l'équipe VEMP (deux gros fichiers) en 2016/2017
- exemple 8 : toutes les classes d'un projet étudiant
- exemple 9 : toutes les classes d'un projet étudiant
Evolution des commits par équipe (maj le 6/12/2018)
Evolution du nombre de merge requests
Evolution de la couverture de code
Livrables
- Livrable 1
- Livrable 2
- Livrable 3
- Livrable 4
- Livrable 5
- 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
TEAM Inglorious Basterds
**** Version v2.0 ****
**** Compiling package ****
**** Launching tests ****
**** Creating JAR ****
**** Launching benchmarks ****
**** Running exemple0 ****
Error: Unable to access jarfile target/yapt-v2.0.jar
**** Running exemple0_17-18 ****
Error: Unable to access jarfile target/yapt-v2.0.jar
**** Running exemple0_18-19 ****
Error: Unable to access jarfile target/yapt-v2.0.jar
**** Running exemple1 ****
Error: Unable to access jarfile target/yapt-v2.0.jar
**** Running exemple2 ****
Error: Unable to access jarfile target/yapt-v2.0.jar
**** Running exemple3 ****
Error: Unable to access jarfile target/yapt-v2.0.jar
**** Running exemple4 ****
Error: Unable to access jarfile target/yapt-v2.0.jar
TEAM PlagiatChecker
**** Version v2.0 ****
**** Compiling package ****
**** Launching tests ****
**** Launching benchmarks ****
**** Running exemple0 ****
WARNING: Percentages should be between 0% and 100%
**** Running exemple0_17-18 ****
WARNING: Percentages should be between 0% and 100%
**** Running exemple0_18-19 ****
WARNING: Percentages should be between 0% and 100%
**** Running exemple1 ****
**** Running exemple2 ****
WARNING: Percentages should be between 0% and 100%
**** Running exemple3 ****
WARNING: Percentages should be between 0% and 100%
**** Running exemple4 ****
WARNING: Percentages should be between 0% and 100%
TEAM PSG
**** Version v2.0 ****
**** Compiling package ****
**** Launching tests ****
**** Creating JAR ****
**** Launching benchmarks ****
**** Running exemple0 ****
**** Running exemple0_17-18 ****
**** Running exemple0_18-19 ****
**** Running exemple1 ****
**** Running exemple2 ****
**** Running exemple3 ****
**** Running exemple4 ****
TEAM Inglorious Basterds
**** Version v3.0 ****
**** Compiling package ****
**** Launching tests ****
**** Creating JAR ****
**** Launching benchmarks ****
**** Running exemple0 ****
**** Running exemple0_17-18 ****
**** Running exemple0_18-19 ****
**** Running exemple1 ****
**** Running exemple2 ****
**** Running exemple3 ****
**** Running exemple4 ****
**** Running exemple5 ****
**** Running exemple6 ****
**** Running exemple7 ****
**** Running exemple8 ****
Exception in thread "main" java.lang.IllegalArgumentException: wSize has to be between 1 and the list length
at pje.kmer.Winnower.transform(Winnower.java:23)
at pje.comparator.Comparator.lambda$compare$1(Comparator.java:45)
at pje.kmer.Kmerisator_Abstract.transform(Kmerisator_Abstract.java:69)
at pje.kmer.Kmerisator_Abstract.hashCodes(Kmerisator_Abstract.java:62)
at pje.comparator.Comparator.compare(Comparator.java:45)
at pje.App.main(App.java:19)
**** Running exemple9 ****
TEAM PlagiatChecker
**** Version v3.0 ****
**** Compiling package ****
**** Launching tests ****
**** Creating JAR ****
**** Launching benchmarks ****
**** Running exemple0 ****
Error: Unable to access jarfile target/yapt-v3.0.jar
**** Running exemple0_17-18 ****
Error: Unable to access jarfile target/yapt-v3.0.jar
**** Running exemple0_18-19 ****
Error: Unable to access jarfile target/yapt-v3.0.jar
**** Running exemple1 ****
Error: Unable to access jarfile target/yapt-v3.0.jar
**** Running exemple2 ****
Error: Unable to access jarfile target/yapt-v3.0.jar
**** Running exemple3 ****
Error: Unable to access jarfile target/yapt-v3.0.jar
**** Running exemple4 ****
Error: Unable to access jarfile target/yapt-v3.0.jar
**** Running exemple5 ****
Error: Unable to access jarfile target/yapt-v3.0.jar
**** Running exemple6 ****
Error: Unable to access jarfile target/yapt-v3.0.jar
**** Running exemple7 ****
Error: Unable to access jarfile target/yapt-v3.0.jar
**** Running exemple8 ****
Error: Unable to access jarfile target/yapt-v3.0.jar
**** Running exemple9 ****
Error: Unable to access jarfile target/yapt-v3.0.jar
TEAM PSG
**** Version v3.0 ****
**** Compiling package ****
**** Launching tests ****
**** Creating JAR ****
**** Launching benchmarks ****
**** Running exemple0 ****
**** Running exemple0_17-18 ****
**** Running exemple0_18-19 ****
**** Running exemple1 ****
**** Running exemple2 ****
**** Running exemple3 ****
**** Running exemple4 ****
**** Running exemple5 ****
**** Running exemple6 ****
**** Running exemple7 ****
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at fil.pje.comparator.LevenshteinGlobalComparator.distanceGlobal(LevenshteinGlobalComparator.java:32)
at fil.pje.comparator.LevenshteinGlobalComparator.compare(LevenshteinGlobalComparator.java:24)
at fil.pje.comparator.LevenshteinGlobalComparator.compare(LevenshteinGlobalComparator.java:9)
at fil.pje.Main4.main(Main4.java:52)
**** Running exemple8 ****
**** Running exemple9 ****
TEAM Inglorious Basterds
**** Version v4.0 ****
**** Compiling package ****
**** Launching tests ****
**** Creating JAR ****
**** Launching benchmarks ****
**** Running exemple0 ****
**** Running exemple0_17-18 ****
**** Running exemple0_18-19 ****
**** Running exemple1 ****
**** Running exemple2 ****
**** Running exemple3 ****
**** Running exemple4 ****
**** Running exemple5 ****
**** Running exemple6 ****
**** Running exemple7 ****
**** Running exemple8 ****
**** Running exemple9 ****
TEAM PlagiatChecker
**** Version v4.0 ****
**** Compiling package ****
**** Launching tests ****
**** Creating JAR ****
**** Launching benchmarks ****
**** Running exemple0 ****
**** Running exemple0_17-18 ****
**** Running exemple0_18-19 ****
**** Running exemple1 ****
**** Running exemple2 ****
**** Running exemple3 ****
**** Running exemple4 ****
**** Running exemple5 ****
**** Running exemple6 ****
**** Running exemple7 ****
**** Running exemple8 ****
**** Running exemple9 ****
TEAM PSG
**** TEAM PSG ****
**** Version v4.0 ****
**** Compiling package ****
**** Launching tests ****
**** Creating JAR ****
**** Launching benchmarks ****
**** Running exemple0 ****
**** Running exemple0_17-18 ****
**** Running exemple0_18-19 ****
**** Running exemple1 ****
**** Running exemple2 ****
**** Running exemple3 ****
**** Running exemple4 ****
**** Running exemple5 ****
**** Running exemple6 ****
**** Running exemple7 ****
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at fil.pje.comparator.LevenshteinGlobalComparator.distanceGlobal(LevenshteinGlobalComparator.java:32)
at fil.pje.comparator.LevenshteinGlobalComparator.compare(LevenshteinGlobalComparator.java:24)
at fil.pje.comparator.LevenshteinGlobalComparator.compare(LevenshteinGlobalComparator.java:9)
at fil.pje.Main4.main(Main4.java:52)
**** Running exemple8 ****
**** Running exemple9 ****
TEAM Inglorious Basterds
**** Version v5.0 ****
**** Compiling package ****
**** Launching tests ****
**** Creating JAR ****
**** Launching benchmarks ****
**** Running exemple0 ****
**** Running exemple0_17-18 ****
**** Running exemple0_18-19 ****
**** Running exemple1 ****
**** Running exemple2 ****
**** Running exemple3 ****
**** Running exemple4 ****
**** Running exemple5 ****
**** Running exemple6 ****
**** Running exemple7 ****
**** Running exemple8 ****
**** Running exemple9 ****
TEAM PlagiatChecker
**** Version v5.0 ****
**** Compiling package ****
**** Launching tests ****
**** Creating JAR ****
**** Launching benchmarks ****
**** Running exemple0 ****
**** Running exemple0_17-18 ****
**** Running exemple0_18-19 ****
**** Running exemple1 ****
**** Running exemple2 ****
**** Running exemple3 ****
**** Running exemple4 ****
**** Running exemple5 ****
**** Running exemple6 ****
**** Running exemple7 ****
**** Running exemple8 ****
**** Running exemple9 ****
TEAM PSG
**** Version v5.0 ****
**** Compiling package ****
**** Launching tests ****
**** Creating JAR ****
**** Launching benchmarks ****
**** Running exemple0 ****
**** Running exemple0_17-18 ****
**** Running exemple0_18-19 ****
**** Running exemple1 ****
**** Running exemple2 ****
**** Running exemple3 ****
**** Running exemple4 ****
**** Running exemple5 ****
**** Running exemple6 ****
**** Running exemple7 ****
**** Running exemple8 ****
WARNING: Percentages should be between 0% and 100%
**** Running exemple9 ****
TEAM Inglorious Basterds
**** Version v6.0 ****
**** Compiling package ****
**** Launching tests ****
**** Creating JAR ****
**** Launching benchmarks ****
**** Running exemple0 ****
**** Running exemple0_17-18 ****
**** Running exemple0_18-19 ****
**** Running exemple1 ****
**** Running exemple2 ****
**** Running exemple3 ****
**** Running exemple4 ****
**** Running exemple5 ****
**** Running exemple6 ****
**** Running exemple7 ****
**** Running exemple8 ****
**** Running exemple9 ****
TEAM PlagiatChecker
**** Version v6.0 ****
**** Compiling package ****
**** Launching tests ****
**** Creating JAR ****
**** Launching benchmarks ****
**** Running exemple0 ****
**** Running exemple0_17-18 ****
**** Running exemple0_18-19 ****
**** Running exemple1 ****
**** Running exemple2 ****
**** Running exemple3 ****
**** Running exemple4 ****
**** Running exemple5 ****
**** Running exemple6 ****
**** Running exemple7 ****
**** Running exemple8 ****
**** Running exemple9 ****
TEAM PSG
**** Version v6.0 ****
**** Compiling package ****
**** Launching tests ****
**** Creating JAR ****
**** Launching benchmarks ****
**** Running exemple0 ****
**** Running exemple0_17-18 ****
**** Running exemple0_18-19 ****
**** Running exemple1 ****
**** Running exemple2 ****
**** Running exemple3 ****
**** Running exemple4 ****
**** Running exemple5 ****
**** Running exemple6 ****
**** Running exemple7 ****
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at fil.pje.comparator.LevenshteinGlobalComparator.distanceGlobal(LevenshteinGlobalComparator.java:32)
at fil.pje.comparator.LevenshteinGlobalComparator.compare(LevenshteinGlobalComparator.java:24)
at fil.pje.comparator.LevenshteinGlobalComparator.compare(LevenshteinGlobalComparator.java:9)
at fil.pje.Main_Levenshtein_NComparator.main(Main_Levenshtein_NComparator.java:90)
**** Running exemple8 ****
**** Running exemple9 ****
TEAM Inglorious Basterds
**** Version v7.0 ****
**** Compiling package ****
**** Launching tests ****
[ERROR] Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.169 s <<< FAILURE! - in comparator.TokenComparator_Text_Test
[ERROR] compareTest(comparator.TokenComparator_Text_Test) Time elapsed: 0.127 s <<< FAILURE!
java.lang.AssertionError
at comparator.TokenComparator_Text_Test.compareTest(TokenComparator_Text_Test.java:53)
**** Creating JAR ****
**** Launching benchmarks ****
**** Running exemple0 ****
**** Running exemple0_17-18 ****
**** Running exemple0_18-19 ****
**** Running exemple1 ****
**** Running exemple2 ****
**** Running exemple3 ****
**** Running exemple4 ****
**** Running exemple5 ****
**** Running exemple6 ****
**** Running exemple7 ****
**** Running exemple8 ****
**** Running exemple9 ****
TEAM PlagiatChecker
**** Version v7.0 ****
**** Compiling package ****
**** Launching tests ****
**** Creating JAR ****
**** Launching benchmarks ****
**** Running exemple0 ****
**** Running exemple0_17-18 ****
**** Running exemple0_18-19 ****
**** Running exemple1 ****
**** Running exemple2 ****
**** Running exemple3 ****
**** Running exemple4 ****
**** Running exemple5 ****
**** Running exemple6 ****
**** Running exemple7 ****
**** Running exemple8 ****
**** Running exemple9 ****
TEAM PSG
**** Version v7.0 ****
**** Compiling package ****
**** Launching tests ****
**** Creating JAR ****
**** Launching benchmarks ****
**** Running exemple0 ****
**** Running exemple0_17-18 ****
**** Running exemple0_18-19 ****
**** Running exemple1 ****
**** Running exemple2 ****
TIMEOUT! (> 15 MINUTES)
**** Running exemple3 ****
**** Running exemple4 ****
**** Running exemple5 ****
**** Running exemple6 ****
**** Running exemple7 ****
TIMEOUT! (> 15 MINUTES)
**** Running exemple8 ****
**** Running exemple9 ****