Quali sono alcuni modi efficaci per trovare le differenze tra due grandi corpus di testo che hanno contenuti simili, ma ordinati diversamente?


8

Ho due file di grandi dimensioni contenenti paragrafi di testo inglese:

  1. Il primo testo è lungo circa 200 pagine e contiene circa 10 paragrafi per pagina (ogni paragrafo è lungo 5 frasi).
  2. Il secondo testo contiene quasi esattamente gli stessi paragrafi e testo del primo. È inoltre lungo 200 pagine con 10 paragrafi per pagina. Tuttavia, i paragrafi sono randomizzati e in un ordine diverso rispetto al primo testo. Inoltre, una grande percentuale dei paragrafi presenta piccole modifiche nella formulazione rispetto a paragrafi simili. Ad esempio, un paragrafo nel primo testo potrebbe contenere una frase simile Like Jimmy, I wanted to go to the palacealla lettura della frase corrispondente nel paragrafo del secondo testo Like Jimmy, I really wanted to go to the castle.

Voglio essere in grado di catturare le modifiche qui come l'aggiunta reallye la cancellazione di palacecon la sostituzione di castle. Se i paragrafi fossero approssimativamente allineati, questo sarebbe piuttosto banale in quanto ci sono molti modi per diffondere il testo. Tuttavia, poiché i paragrafi non sono allineati, non è così.

Se i file fossero piccoli (una manciata di paragrafi), Levenshtein Distance probabilmente funzionerebbe bene, ma poiché i file sono enormi, sarebbe inefficiente confrontare ogni paragrafo del testo 1 con ciascun paragrafo del testo 2 per scoprire quali paragrafi corrispondono.

Quali sarebbero alcuni altri approcci a questo problema per gestirlo in modo efficiente?


I paragrafi sono almeno vicini l'uno all'altro, diciamo entro un "raggio" di circa 10? Un'idea generale sarebbe quella di preelaborare in qualche modo. Ad esempio, scopri le parole che cambiano raramente (nomi?) E confronta solo quelle che condividono almeno queste.
Raffaello

Potresti provare uno strumento di rilevamento dei cloni. Sono pensati per essere utilizzati per i linguaggi di programmazione, ma a parte questo, progettati per questo problema. CCFinder probabilmente funzionerebbe.
reinierpost,

3
Ecco un problema simile con alcune risposte: cs.stackexchange.com/questions/47794/…
wvxvw

1
Hai provato l'utilità della riga di comando "diff"?
usul

@Raphael Puoi approfondire cosa intendi per preelaborazione qui? Inoltre, i paragrafi si presentano in "sezioni" del documento, una sezione può essere piuttosto lunga (come 50-60 paragrafi) e non ordinata.
vikram7,

Risposte:


1

Il confronto tra 2000 paragrafi e 2000 paragrafi è solo quattro milioni di confronti.

La chiave del problema non è usare una funzione che calcola la distanza di Levenshtein ma usarne una che calcola la distanza di Levenshtein se la distanza è inferiore a una certa soglia e fallisce (o, piuttosto, restituisce + ∞) se la distanza è maggiore della soglia.

Questo perché sei interessato solo a paragrafi molto simili. Non hai alcun interesse per la distanza precisa tra i paragrafi che sono abbastanza diversi da non essere correlati. Quindi non appena una distanza è diventata abbastanza elevata da non essere interessante, la funzione può uscire immediatamente; e ciò accadrà per lo più molto presto durante l'esecuzione della funzione.

Maggiore è la soglia, più lungo è il tempo di funzionamento ma minore è la percentuale di falsi negativi.

Se conosci qualcosa di più sui documenti (come ad esempio se ogni paragrafo corrisponde al massimo a un paragrafo nell'altro documento), puoi fare un passaggio con una soglia bassa, escludere i paragrafi corrispondenti da ulteriore considerazione, fare un passaggio sul tuo ora ridotto corpus con una soglia più elevata, escludere quei paragrafi ridotti e così via.

Dettagli di implementazione: presumibilmente calcoleresti una distanza di Levenshtein sulle parole piuttosto che sui caratteri. In tal caso, è necessario innanzitutto assegnare un numero a ciascuna parola, ad esempio ordinando l'intero corpus, chiamando la prima parola "1", la seconda parola "2" e così via. In questo modo i confronti dei paragrafi verrebbero effettuati confrontando i numeri anziché le parole, il che è più veloce.


-1

Potrebbe essere possibile utilizzare un approccio composto. Forse qualcuno può costruire su questo ...

Hash il contenuto del paragrafo in modo tale che i paragrafi con lievi differenze abbiano hash simili, quindi ordina agli hash di determinare quali paragrafi confrontare attraverso un metodo più esatto (diff o qualcosa di simile).

Ad esempio, come algoritmo hash rudimentale, cosa succede se sommi i valori ascii dei caratteri e poi moduli la somma con un numero elevato come 2.000.000.000? Ciò farebbe sì che 2 paragrafi con solo poche parole aggiunte o sottratte abbiano valori di hash che sono probabilmente più vicini tra loro rispetto ai paragrafi con parole molto diverse, e quindi, saranno molto più vicini tra loro nell'elenco rispetto ai paragrafi molto diversi (si potrebbe dire gli hash vicini in questo caso sono necessari ma non sufficienti per paragrafi simili). Ovviamente devi tenere conto dell'involucro causato dal modulo e considerare un paragrafo con il valore di hash 1.999.999.999 come solo una distanza di 1 da uno con un valore di 0, ecc.

Di conseguenza, potresti ridurre il numero di confronti tra i paragrafi che devi eseguire di un importo sostanziale (non dovresti confrontare ogni paragrafo in un testo con ogni paragrafo nell'altro testo) - potresti confrontare un paragrafo con paragrafi nel testo 2 in ordine di quanto sono vicini i loro hash (esegui prima i valori con hash più vicini) e invocano qui un algoritmo più costoso per determinare se sono "abbastanza simili" per essere considerati uguali.


2
Se stai parlando di paragrafi di testo, la somma dei valori ASCII mod due miliardi è la somma dei valori ASCII. A meno che il tuo paragrafo non contenga più di otto milioni di caratteri, cioè ... Quindi questa risposta sembra piuttosto compromessa, in base a ciò che ti è capitato di pensare in quel momento. Hai qualche prova che l'approccio che suggerisci sia efficace? È supportato da esperimenti o ricerche pubblicate?
David Richerby,
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.