Quali algoritmi posso usare per rilevare se articoli o post sono duplicati?


17

Sto cercando di rilevare se un articolo o un post sul forum è una voce duplicata all'interno del database. Ci ho pensato, arrivando alla conclusione che qualcuno che duplica il contenuto lo farà usando uno dei tre (in ordine decrescente difficile da rilevare):

  1. copia semplice incolla l'intero testo
  2. copia e incolla parti di testo fondendole con le loro
  3. copiare un articolo da un sito esterno e mascherarlo come proprio

Preparazione del testo per l'analisi

Fondamentalmente eventuali anomalie; l'obiettivo è rendere il testo il più "puro" possibile. Per risultati più accurati, il testo è "standardizzato" da:

  1. Strippaggio di spazi bianchi duplicati e rifilatura iniziale e finale.
  2. Le newline sono standardizzate a \ n.
  3. I tag HTML vengono rimossi.
  4. L'uso di un RegEx chiamato Daring Fireball URL viene rimosso.
  5. Uso il codice BB nella mia applicazione in modo che vada a.
  6. (ä) ccentati e stranieri (oltre a Enlgish) vengono convertiti nella loro forma non straniera.

Conservo le informazioni su ciascun articolo nella (1) tabella delle statistiche e nella (2) tabella delle parole chiave.

(1) Tabella delle statistiche Le seguenti statistiche sono memorizzate sul contenuto testuale (proprio come questo post)

  1. lunghezza del testo
  2. conteggio delle lettere
  3. conteggio parole
  4. conteggio delle frasi
  5. parole medie per frase
  6. indice di leggibilità automatizzato
  7. punteggio della nebbia di sparo

Per le lingue europee, Coleman-Liau e l'indice di leggibilità automatizzato dovrebbero essere utilizzati in quanto non usano il conteggio delle sillabe, quindi dovrebbero produrre un punteggio ragionevolmente accurato.

(2) Tabella delle parole chiave

Le parole chiave vengono generate escludendo un vasto elenco di parole di stop (parole comuni), ad esempio "the", "a", "of", "to", ecc. Ecc.

Dati di esempio

  • text_length, 3963
  • letter_count, 3052
  • word_count, 684
  • frase_conto, 33
  • word_per_sentence, 21
  • gunning_fog, 11.5
  • auto_read_index, 9.9
  • parola chiave 1, uccisa
  • parola chiave 2, ufficiali
  • parola chiave 3, polizia

Va notato che una volta che un articolo viene aggiornato, tutte le statistiche di cui sopra vengono rigenerate e potrebbero essere valori completamente diversi.

Come posso utilizzare le informazioni di cui sopra per rilevare se un articolo che viene pubblicato per la prima volta, è già esistente nel database?


Sono consapevole che tutto ciò che progetterò non sarà perfetto, il rischio maggiore è (1) Il contenuto che non è un duplicato verrà contrassegnato come duplicato (2) Il sistema consente il passaggio del contenuto duplicato.

Quindi l'algoritmo dovrebbe generare un numero di valutazione del rischio compreso tra 0 e nessun duplicato, il rischio 5 è possibile duplicato e 10 duplicato. Qualunque cosa sopra 5, allora c'è una buona possibilità che il contenuto sia duplicato. In questo caso il contenuto potrebbe essere contrassegnato e collegato agli articoli che sono possibili duplicati e un essere umano potrebbe decidere se eliminare o consentire.

Come ho detto prima sto memorizzando parole chiave per l'intero articolo, tuttavia mi chiedo se potrei fare lo stesso su base di paragrafo; questo significherebbe anche separare ulteriormente i miei dati nel DB, ma renderebbe anche più facile il rilevamento (2) nel mio post iniziale.

Sto pensando a una media ponderata tra le statistiche, ma in quale ordine e quali sarebbero le conseguenze ...


Se si tratta di una corrispondenza esatta, puoi semplicemente impostare un campo su unico. In caso contrario, dovresti decidere in quale momento un testo può essere considerato una copia o un'opera strettamente derivata.
James P.

2
Ci sono molte direzioni in cui questo tipo di analisi può andare. Le persone scrivono interi libri su questo tipo di argomento. Se il tuo obiettivo è determinare la "vicinanza relativa", hai davvero poca scelta se non quella di scavare nella cosiddetta Natural Language Processing e Machine Learning . È così che lo chiamano gli informatici, ma in realtà è solo un'analisi statistica avanzata. Un buon punto di partenza potrebbe essere guardare alle distanze di Levenshtein, ma le statistiche "stupide" come il conteggio di parole / frasi probabilmente faranno molto poco per te.
rdlowrey,

1
Inoltre, prima che fosse migrato da SO questo era taggato [php], quindi potevi dare un'occhiata alla funzione levenshtein nativa di php
rdlowrey

Ottima idea di avere un controllo umano probabilmente duplicati! Potresti essere in grado di decidere automaticamente che> 7 è un duplicato e <6 è diverso e solo gli umani controllano i punteggi di 6 o 7. So che con l'identificazione dello spam esiste una macchina-non-sa-E-umano- nessuna delle due categorie; un'area grigia tra un duplicato quasi e un'opera originale in cui il meglio che puoi fare è effettuare un giudizio in qualche modo arbitrario.
GlenPeterson

@rdlowrey - Gli algoritmi di Levenshtein sono quelli che ho usato in un progetto simile che ho fatto in C #. Sono d'accordo, è un buon punto di partenza e potrebbe essere sufficiente.
jfrankcarr,

Risposte:


4

Esistono molti algoritmi che si occupano della somiglianza dei documenti nella PNL. Ecco un documento fondamentale che descrive vari algoritmi. Anche Wikipedia ha una collezione più ampia. Prediligo la misura Jaro Winkler e l'ho utilizzata per progetti scolastici di laurea in metodi di raggruppamento aglomerativo.


6

Dai un'occhiata all'algboritmo di Rabin-Karp . Usa un hash rolling un po 'come usa rsync per minimizzare i byte trasmessi durante una sincronizzazione. Regolando la dimensione della finestra che usi per l'hash puoi renderla più o meno sensibile. RK è usato, tra le altre cose, per il rilevamento del plagio, che è fondamentalmente alla ricerca di una sorta di inganno.


4
Il problema descritto dall'OP sembra esattamente come il rilevamento del plagio , e lo suggerirei come primo posto in cui cercare aiuto. (Assicurati solo di identificare le tue fonti!)
Caleb

4

Un primo passo potrebbe essere quello di rilevare frasi (o qualche altro ragionevole blocco di dati. Prendi quei blocchi e togli tutti i dati mete, html di spazio bianco casuale, ritorni ecc. Prendi un MD5 di risultato e memorizzalo in una tabella. quindi abbina contro questi blocchi per cercare di trovare corrispondenze.

Se questo non funziona potresti provare n-grammi. Qui hai bisogno di una voce per ogni parola sulla pagina, ma dovrebbe essere in grado di darti corrispondenze piuttosto buone.

http://en.wikipedia.org/wiki/N-gram


Le misure basate su n-grammi sono molto meglio degli hash md5 specialmente per i dati semi-strutturati come html.
Candido

1

Per una matematica matematica esatta, memorizzerei un hash e poi lo confronterei.

Penso che i sistemi utilizzati per gli esami misurino gruppi di parole e quindi la frequenza di gruppi di ogni dimensione. Ad esempio, una catena di 30 parole copiate otterrebbe 5 punti di rischio e 5 occorrenze di 10 catene di parole guadagnerebbero 5 punti. Quindi avresti una trebbia di 30 punti per 500 parole.

In realtà hai bisogno di un algoritmo semantico in modo che parole come 'anche' e 'e' siano analizzate allo stesso modo.

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.