Projet individuel : Détection de plagiat de documents avec SimHash

  1. 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
  1. 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
  1. 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 de String ; 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.java
    • HammingUtil.java
    • SimHashUtil.java
    • FileUtil.java
    • ExceptionType.java
  • src/main/resources/
    • orig.txt (fichier original)
    • orig_0.8_add.txt (fichier suspect)
  • src/test/java/com/plagiarism/
    • PlagiarismTest.java
  1. 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).

  1. 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; }
}

Étiquettes: SimHash HanLP Distance de Hamming Segmentation lexicale Java

Publié le 2 juillet à 03h25