Rilevamento di cluster di codici sorgente "simili"


10

Supponiamo che io abbia 400 studenti (che sono in una grande università) che devono fare un progetto di informatica e che devono lavorare da soli (nessun gruppo di studenti). Un esempio di progetto potrebbe essere quello di "implementare un algoritmo di trasformazione di Fourier veloce in fortran" (lo so, non sembra sexy ma rende la mia domanda più semplice). Sono il correttore e voglio inviare routine per verificare se ci sono gruppi di studenti che hanno proposto l'implementazione "troppo simili per essere scritti in modo veramente indipendente".

Questa è la ricerca senza supervisione dei cluster. Penso che la domanda sia più su quali attributi usare piuttosto che su quale algoritmo di clustering usare. La prima cosa che vorrei fare è un istogramma lettera per lettera. Idealmente, poiché gli imbroglioni sono più intelligenti di così, alla fine proverei le permutazioni casuali di lettere ben scelte per vedere se esiste una buona corrispondenza dell'istogramma della lettera (con permutazione). Inoltre quelli che non esplorano la struttura del codice, solo la distribuzione marginale delle lettere ... quale soluzione hai? esistono software o pacchetti esistenti dedicati a quel problema? (in realtà ai miei vecchi tempi gli insegnanti di informatica sostenevano di avere quel tipo di strumento, ma ora sospetto che avessero qualcosa di molto semplice)

Suppongo che l'avvocato degli sviluppi software abbia anche quel tipo di problemi (non con 1000 studenti, ma con 2 codici di grandi dimensioni ... che rendono le cose più difficili)?

Risposte:


4

L'ovvio passaggio di pre-elaborazione è quello di unire file che sono veramente identici.

Dopodiché la chiave è la normalizzazione . Ad un certo punto, gli studenti inizieranno a refactoring del codice, rinominando variabili e simili. O riformulare i commenti. Un istogramma di lettere è troppo influenzato da questo (in più catturerà molte delle proprietà del linguaggio).

Una tecnica comune consiste nell'utilizzare un parser specifico per la lingua e trasformare il codice sorgente in un albero di sintassi astratto. Quindi estrarre le funzionalità da questo. E magari analizzare i commenti separatamente in parallelo.

Poi c'è l'approccio basato sulla linea "sottosequenza comune più lunga". Se hai una somiglianza ragionevolmente buona su singole righe, puoi cercare la sottosequenza comune più lunga tra due file. Ciò produrrà anche un numero di partite.


Volevo solo aggiungere che la sottosequenza comune più lunga può essere trovata in modo efficiente usando alberi di suffisso o array di suffissi.
sebp

Grazie Anony, mi piace molto lo spirito della tua risposta (e l'ho votata). Sembra una vera statistica ad alta dimensione con "trasformazione dei dati" e ricerca di schemi estremi. Che tipo di distanza metteresti su quegli alberi?
Robin Girard,

Non sono un esperto per la somiglianza delle rappresentazioni AST. Credo che ci sia un concetto di "simulazione" nel senso che un albero è un tipo speciale di sottostruttura dell'altro. Per confrontare gli AST, dovresti allinearli e contare le differenze relative, immagino. Forse non prendere in considerazione l'ordine delle filiali, quindi i riordini del codice banali non cambiano i risultati. Tieni presente che potresti arrivare al punto in cui ottieni falsi positivi perché non ci sono semplicemente modi per risolvere il problema in modo efficiente e ottieni falsi positivi solo perché hanno trovato la soluzione corretta ...
Ha QUIT - Anony-Mousse

0

Dal mondo anti plagio, in precedenza mi ero imbattuto nella nozione di "Isomorfismo grafico". Forse puoi dare un'occhiata anche a quello.

LCS - È possibile anche la conseguenza comune più lunga. Ma prova a confrontare tutte queste soluzioni e scopri qual è il migliore :)


Benvenuti in questo sito! Potresti fornire alcuni riferimenti sul lavoro di cui sopra e forse maggiori dettagli in modo che i lettori possano avere un'idea migliore di come l'isomorfismo grafico o LCS potrebbero risolvere il problema in questione?
chl
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.