- Lien GitHub du projet ========================
https://github.com/guzhouyiye/guzhouyiye/tree/main
| Ce devoir est lié à quel cours | Génie logiciel |
|---|---|
| Où se trouve la spécification du devoir | Projet individuel |
| Objectif de ce devoir | Réaliser un système de vérification de plagiat de thèses |
- Tableau PSP ==============
| PSP2.1 | Étapes du processus personnel | Temps estimé (min) | Temps réel (min) |
|---|---|---|---|
| Planning | Planification | 20 | 20 |
| ·Estimate | ·Estimation de la durée de la tâche | 20 | 20 |
| Development | Développement | 295 | 320 |
| ·Analysis | ·Analyse des besoins (apprentissage des nouvelles technologies) | 50 | 30 |
| ·Design Spec | ·Génération du document de conception | 25 | 15 |
| ·Design Review | ·Revue de conception | 20 | 5 |
| ·Coding Standard | ·Normes de codage | 20 | 15 |
| ·Design | ·Conception détaillée | 30 | 20 |
| ·Coding | ·Implémentation | 120 | 180 |
| ·Code Review | ·Revue de code | 20 | 15 |
| ·Test | ·Tests (auto-test, modification, commit) | 10 | 40 |
| Reporting | Rapport | 75 | 80 |
| ·Test Report | ·Rapport de test | 30 | 40 |
| ·Size Measurement | ·Calcul de la charge de travail | 15 | 15 |
| ·Postmortem & Process Improvement Plan | ·Bilan post-mortem et plan d'amélioration | 20 | 25 |
| Total | 390 | 420 |
- Conception et implémentation des interfaces des modules ==========================================================
Principe de réalisation
Pour la vérification de plagiat de thèses, nous utilisons l'algorithme SimHash, présenté par Google en 2007 dans l'article « Detecting Near-Duplicates for Web Crawling ». Cet algorithme génère une empreinte numérique pour chaque texte via cinq étapes : segmentation lexicale, hachage, pondération, fusion et réduction de dimension. Ensuite, la distance de Hamming entre les deux empreintes SimHash permet de calculer le taux de similarité (et donc de plagiat) des documents.
Classes et fonctions du projet
- Classe principale (PlagiarismChecker) : reçoit les arguments de la ligne de commande, appelle les autres classes utilitaires pour effectuer la détection.
- Énumération des exceptions (ExceptionType) : définit toutes les exceptions possibles pendant l'exécution, améliorant la sécurité de type, la lisibilité et la maintenabilité.
- Utilitaire de distance de Hamming (HammingUtil) :
computeHammingDistance(String a, String b)calcule la distance de Hamming entre deux chaînes ;computeSimilarity(String a, String b)retourne le taux de similarité. - Utilitaire SimHash (SimHashUtil) :
generateSimHash(String text)produit l'empreinte SimHash ;hashContent(String segment)calcule la valeur de hachage d'un segment. - Utilitaire de fichiers (FileUtil) :
readFile(String path)lit le contenu d'un fichier texte et le retourne sous forme deString;writeFile(String path, String content)écrit le taux de similarité dans le fichier spécifié. - Classe de tests unitaires (PlagiarismTest) : teste différents scénarios d'entrée en ligne de comande.
Flux du programme
Le diagramme de flux montre l'enchaînement : lecture du fichier original → calcul de l'empreinte SimHash → lecture du fichier suspect → calcul de l'empreinte → calcul de la distance de Hamming → calcul du taux de similarité → écriture du résultat.
Structure des fichiers
src/main/java/com/plagiarism/PlagiarismChecker.javaHammingUtil.javaSimHashUtil.javaFileUtil.javaExceptionType.java
src/main/resources/orig.txt(fichier original)orig_0.8_add.txt(fichier suspect)
src/test/java/com/plagiarism/PlagiarismTest.java
- Analyse de performance et améliorations ==========================================
Analyse avec le profileur intégré d'IntelliJ IDEA
Carte de chaleur
(graphique de profilage)
Liste des méthodes
(liste des appels)
Fonction la plus coûteuse
(capture d'écran de l'analyse)
Améliorations apportées
Idée : remplacer l'extraction de mots-clés par une segmentation lexicale simple. L'extraction de mots-clés est plus lourde ; utiliser un segmentateur pur est plus rapide. Nous avons donc utilisé HanLP.segment pour une segmentation rapide.
Résultat : le temps d'exécution est passé d'environ 400 ms à 290 ms (voir graphique).
- Tests unitaires et gestion des exceptions ============================================
Au total, 10 cas de test unitaires ont été conçus. Voici quelques exemples :
// Aucun argument
@Test
void testSansArgument() {
PlagiarismChecker.main(new String[]{});
}
// Chemin de fichier incorrect
@Test
void testCheminIncorrect() {
PlagiarismChecker.main(new String[]{
"src/main/orig.txt", // chemin volontairement erroné
"src/main/resources/orig_0.8_add.txt",
"src/main/resources/result.txt"
});
}
// Entrée normale
@Test
void testNormal() {
PlagiarismChecker.main(new String[]{
"src/main/resources/orig.txt",
"src/main/resources/orig_0.8_add.txt",
"src/main/resources/result.txt"
});
}
Couverture des tests
(graphique de couverture)
Gestion des exceptions
Nous avons défini une énumération ExceptionType pour décrire chaque type d'erreur possible. Cela permet à l'utilisateur d'identifier rapidement la cause du problème.
public enum ExceptionType {
FICHIER_INTROUVABLE("Le fichier spécifié n'existe pas."),
NOMBRE_ARGUMENTS_INVALIDE("Trois arguments sont attendus."),
ERREUR_LECTURE("Erreur lors de la lecture du fichier."),
ERREUR_ECRITURE("Erreur lors de l'écriture du fichier.");
private final String message;
ExceptionType(String message) { this.message = message; }
public String getMessage() { return message; }
}