Mi piacerebbe essere in grado di identificare battute duplicate pubblicate su un sito web. Posso creare un database ragionevolmente grande di battute postate in precedenza, e poi mi piacerebbe dare un'occhiata a ogni nuovo scherzo così com'è e scegliere le battute più "simili" dal database e sputarle, in ordine, se la mia certezza che il nuovo scherzo è un duplicato è superiore a qualche soglia.
Potrei cercare esatte corrispondenze carattere per carattere ma non è molto interessante, e non riuscirebbe a catturare "quasi duplicati". Ad esempio, mi piacerebbe che le seguenti due battute fossero considerate uguali:
Three men walk into a bar. The first one says "ouch!", the second one says "ouch!" The third one ducks.
Three men go to the bar. The first one says "ow!!!!", the second one says "OWW!!!!!", the third one ducks.
Immagino che molte battute duplicate coinvolgano nomi di personaggi scambiati (cioè una storia su "Little Suzy" piuttosto che "Little Johnny", o una battuta sul presidente con "Barack Obama" scambiato per "George Bush") e mi piacerebbe che anche quelli fossero contati come lo stesso scherzo.
Ho letto degli algoritmi di rilevamento dei plagi e nessuno di essi sembra adattarsi perfettamente, poiché sono orientati verso testi molto più grandi (lo scherzo medio è probabilmente solo poche decine di parole), oppure si basano su alcune proprietà speciali di lavoro accademico (cioè analisi delle citazioni).
Ho trovato un documento a un punto che non sono stato in grado di trovare di nuovo che pensavo fosse interessante che fosse qualcosa del genere: collassa ogni testo in un vettore v
tale che se la i
th word del tuo vocabolario appare n
volte, quindi il valore di v_i
è n
. Quindi quando ottieni una nuova battuta, calcola la distanza tra essa e tutti gli altri vettori che hai costruito; il vettore più vicino è il testo sorgente più probabile. Ha esplorato alcune diverse varianti sull'idea e ne ha confrontato l'efficacia.
Questa mi sembra un'idea sensata, ma mi chiedo se non sarà troppo sensibile a cose come scambiare i nomi, e non riesco a trovare di nuovo il foglio per verificare i dettagli esatti di come lo hanno gestito.
Non sono sicuro di come applicare altre tecniche di apprendimento automatico a questo, come un SVM o una rete neurale, poiché si tratta fondamentalmente di un problema di classificazione su poche migliaia di classi diverse con non più di una manciata di esempi per ogni classe. E non esiste un dataset ben etichettato là fuori di battute duplicate, per quanto ne so.
Qual è una strategia ragionevole per questo? Qualcuno mi può indirizzare verso la letteratura utile?
(Questo progetto è puramente per divertimento, e sto solo cercando un'approssimazione semi-ragionevole.So che la PNL in generale è molto difficile da fare e che una risposta reale e accurata a questo sarebbe praticamente impossibile.)
EDIT (in risposta al flag di dupe): come ho abbozzato in alcuni commenti, non penso che la distanza di modifica delle stringhe sia un ottimo approccio a questo perché:
- attribuisce un peso inappropriato allo scambio di elementi costituiti da più caratteri che non dovrebbero cambiare il significato (nomi, ad esempio)
- richiede che determini manualmente una buona soglia per una corrispondenza positiva; non ho set di dati per testarlo su
- si preoccupa per l'ordine: preferirei avere qualcosa come un approccio "bag of word" perché uno scherzo può essere sostanzialmente lo stesso mentre si sfogliano le frasi
- è potenzialmente costoso: ogni volta che vedo una nuova voce, ho bisogno di ricalcolare la sua distanza di modifica delle stringhe contro ogni singolo scherzo che ho visto
- non è molto interessante (lo sto facendo per divertirmi, dopo tutto) e non sono convinto che non ci sia un algoritmo che cattura meglio la nozione di "similarità di scherzo" rispetto al confronto diretto carattere per carattere ; se qualcuno ha la prova che la distanza di modifica delle stringhe è lo strumento migliore per questo lavoro, sono aperto a sentirlo - ma non è un argomento fornito dalla risposta collegata nella bandiera dupe