2009-07-05 14 views
21

Innanzitutto, tieni presente che mi interessa sapere come funziona qualcosa di simile, e non intendo costruirlo per un client, ecc. Sono sicuro che potrebbero esserci già implementazioni open source.Come si codifica un sito anti plagio?

Come funzionano gli algoritmi che rilevano il plagio nel testo caricato? Usa regex per inviare tutte le parole a un indice, elimina parole conosciute come 'the', 'a', ecc e poi vedi quante parole sono le stesse in diversi saggi? Ha un numero magico di parole identiche che lo contrassegnano come possibile duplicato? Usa levenshtein()?

La mia lingua preferita è PHP.

UPDATE

sto pensando di non controllare per plagio a livello globale, ma più voce in 30 saggi caricati da una classe. Nel caso in cui gli studenti siano riuniti in un incarico rigorosamente di una sola persona.

Ecco un sito online che pretende di farlo: http://www.plagiarism.org/

risposta

30

Un buon rilevamento del plagio applicherà l'euristica in base al tipo di documento (ad esempio un saggio o codice di programma in una lingua specifica).

Tuttavia, è anche possibile applicare una soluzione generale. Dai uno sguardo allo Normalized Compression Distance (NCD). Ovviamente non è possibile calcolare esattamente il valore di Kolmogorov complexity di un testo, ma è possibile avvicinarlo semplicemente comprimendo il testo.

Un NCD più piccolo indica che due testi sono più simili. Alcuni algoritmi di compressione danno risultati migliori di altri. Fortunatamente PHP supporta gli algoritmi di compressione per gli algoritmi di compressione several, quindi è possibile avere il codice di rilevamento basato su NCD in esecuzione in nessun tempo. Qui di seguito vi darò esempio di codice che utilizza Zlib:

PHP:

function ncd($x, $y) { 
    $cx = strlen(gzcompress($x)); 
    $cy = strlen(gzcompress($y)); 
    return (strlen(gzcompress($x . $y)) - min($cx, $cy))/max($cx, $cy); 
} 

print(ncd('this is a test', 'this was a test')); 
print(ncd('this is a test', 'this text is completely different')); 

Python:

>>> from zlib import compress as c 
>>> def ncd(x, y): 
...  cx, cy = len(c(x)), len(c(y)) 
...  return (len(c(x + y)) - min(cx, cy))/max(cx, cy) 
... 
>>> ncd('this is a test', 'this was a test') 
0.30434782608695654 
>>> ncd('this is a test', 'this text is completely different') 
0.74358974358974361 

Si noti che per i testi più grandi (leggi: i file effettivi) i risultati saranno molto più pronunciato. Fai un tentativo e segnala le tue esperienze!

+1

+1. Ho letto sulla compressione utilizzata per misurare il contenuto delle informazioni molto tempo fa, ma il tuo post ha riportato questa idea interessante. –

+0

Il fatto che due file identici possano dare valori inferiori (0,03, 0,10) ma anche valori più alti a seconda della dimensione (0,99) è molto rilevante. Non mi affiderei esclusivamente a questo. – Chaotic

4

in realtà dipende "plagarised da dove". Se stai parlando nel contesto di un singolo sito, questo è molto diverso da tutto il web, o dalla biblioteca di congres, o ...

http://www.copyscape.com/ praticamente prova che si può fare.

concetto di base sembra essere

  • fare una ricerca su google per alcuni non comuni sequenze di parole
  • Per ogni risultato, fare un'analisi dettagliata

La porzione di analisi dettagliata può certamente essere simile , dal momento che è un confronto 1 a 1, ma individuare e ottenere i documenti di origine è il fattore chiave.

+3

Abbastanza intelligente con Google. Lo faccio di tanto in tanto quando ho bisogno di individuare un documento sorgente e tutto quello che ho è una frase o due. – Sampson

+0

@ Jonathan - lo stesso, o quando ho alcuni testi di una canzone e non ricordo l'artista o il titolo. @Roger - I risultati di Google sono raschianti legali e/o etici? C'è un modo migliore? – alex

+1

Se lo facevi su base "professionale", puoi iscriverti ai token dell'applicazione DEV, ecc. E utilizzare le API che forniscono. Termini abbastanza generosi per iniziare. –

5

Penso che questo problema sia complicato e non abbia una soluzione ottimale. È possibile rilevare la duplicazione esatta delle parole a livello di intero documento (ad esempio, qualcuno scarica un intero saggio dal web) fino al livello di frase. Fare questo a livello di documento è piuttosto semplice: la soluzione più banale dovrebbe prendere il checksum di ogni documento presentato e confrontarlo con un elenco di checksum di documenti noti. Dopo di ciò potresti provare a scoprire il plagio delle idee, o trovare frasi che sono state copiate direttamente, poi leggermente cambiate per buttare via software come questo.

Per ottenere qualcosa che funzioni a livello di frase, potrebbe essere necessario diventare più sofisticati se si desidera qualsiasi livello di efficienza. Ad esempio, potresti cercare le differenze nello stile di scrittura tra i paragrafi e concentrare l'attenzione sui paragrafi che sembrano "fuori luogo" rispetto al resto di un foglio.

Ci sono molti articoli su questo argomento, quindi sospetto che non esista ancora una soluzione perfetta. Ad esempio, questi due articoli forniscono introduzioni ad alcuni dei problemi generali relativi a questo tipo di software e contengono molti riferimenti a cui potresti approfondire se lo desideri.

http://ir.shef.ac.uk/cloughie/papers/pas_plagiarism.pdf

http://proceedings.informingscience.org/InSITE2007/IISITv4p601-614Dreh383.pdf

+0

Grazie per i collegamenti Peter - +1 – alex

4

Per migliori risultati sul non-così-grandi stringhe:

ci sono problemi con l'uso diretto della formula NCD sulle stringhe o piccoli testi. NCD (X, X) non è zero (!). Per rimuovere questo artefatto sottrarre il confronto personale.

See similar_NCD_gzip() demo http://leis.saocarlos.sp.gov.br/SIMILAR.php

function similar_NCD_gzip($sx, $sy, $prec=0, $MAXLEN=90000) { 
# NCD with gzip artifact correctoin and percentual return. 
# sx,sy = strings to compare. 
# Use $prec=-1 for result range [0-1], $pres=0 for percentual, 
#  $pres=1 or =2,3... for better precision (not a reliable) 
# Use MAXLEN=-1 or a aprox. compress lenght. 
# For NCD definition see http://arxiv.org/abs/0809.2553 
# (c) Krauss (2010). 
    $x = $min = strlen(gzcompress($sx)); 
    $y = $max = strlen(gzcompress($sy)); 
    $xy= strlen(gzcompress($sx.$sy)); 
    $a = $sx; 
    if ($x>$y) { # swap min/max 
    $min = $y; 
    $max = $x; 
    $a = $sy; 
    } 
    $res = ($xy-$min)/$max; # NCD definition. 

    # Optional correction (for little strings): 
    if ($MAXLEN<0 || $xy<$MAXLEN) { 
    $aa= strlen(gzcompress($a.$a)); 
    $ref = ($aa-$min)/$min; 
    $res = $res - $ref; # correction 
    } 
    return ($prec<0)? $res: 100*round($res,2+$prec); 
} 
3

Bene, prima di tutto capire che cosa si sta di fronte.

Il plagio di parola per parola dovrebbe essere ridicolmente facile da individuare. L'approccio più ingenuo sarebbe prendere delle tuple di parole di lunghezza sufficiente e confrontarle con il tuo corpus. La lunghezza sufficiente può essere incredibilmente bassa. Confronta risultati di Google:

"I think" => 454,000,000 
"I think this" => 329,000,000 
"I think this is" => 227,000,000 
"I think this is plagiarism" => 5 

Quindi, anche con questo approccio si ha una probabilità molto alta di trovare una buona partita o due (fatto divertente: la maggior parte dei criminali sono veramente stupido).

Se il plagio ha usato sinonimi, modificato l'ordine delle parole e così via, ovviamente diventa un po 'più difficile. Dovresti memorizzare anche i sinonimi e cercare di normalizzare un po 'la struttura grammaticale per mantenere lo stesso approccio operativo. Lo stesso vale per l'ortografia, ovviamente (ad esempio, cercare di far corrispondere la normalizzazione o cercare di spiegare le deviazioni nella corrispondenza, come negli approcci NCD pubblicati nelle altre risposte).

Tuttavia il problema più grande è il plagio concettuale. Questo è davvero difficile e non ci sono soluzioni ovvie senza analizzare la semantica di ogni frase (cioè un'IA sufficientemente complessa).

La verità è, tuttavia, che è necessario trovare solo un tipo di corrispondenza. Non è necessario trovare una corrispondenza esatta per trovare un testo pertinente nel corpus. La valutazione finale dovrebbe sempre essere fatta da un umano comunque, quindi va bene se trovi una corrispondenza inesatta.

I plagi sono per lo più stupidi e pigri, quindi anche le loro copie saranno stupide e pigre.Alcuni mettono uno sforzo incredibile nel loro lavoro, ma quelle opere sono spesso un plagio non ovvio in primo luogo, quindi è difficile rintracciare programmaticamente (cioè se un umano ha difficoltà a riconoscere il plagio con entrambi i testi presentati fianco a fianco molto probabilmente lo farà anche un computer). Per tutto il restante 80%, quindi, l'approccio stupido è abbastanza buono.