Corrispondenza file più vicina?

3

Sto cercando un modo per confrontare un insieme di file con un determinato file con ogni confronto dandomi una metrica di "vicinanza". Dovrei quindi essere in grado di ordinare in base alla metrica per trovare il file più vicino. Ho preso in considerazione l'utilizzo di diff, ma afaik questo fornisce solo un sì o un no sulla corrispondenza di una determinata riga, che è una scala troppo grande per i miei scopi e per i miei scopi un cambio di parola in una riga di testo è più vicino di una linea completamente diversa diff restituisce no-match per entrambi i casi.

Sarei in grado di utilizzare efficacemente un soundex su un 100 o più file di linea o c'è un algoritmo migliore? C'è anche una metrica che fornirebbe una corrispondenza positiva se le linee che erano simili fossero su numeri di linea drasticamente differenti?

Grazie

    
posta Gruffputs 18.01.2011 - 13:50
fonte

5 risposte

3

Ho usato distanza Levenshtein prima di ottenere buoni risultati. Puoi trovare esempi in diverse lingue qui: link .

Questo algoritmo ti dà un numero maggiore di 0 per mostrare quanto distano i due gruppi di dati, con 0 che indica che i set sono identici.

    
risposta data 18.01.2011 - 14:36
fonte
2

Potresti usare diff e contare il numero di linee che differiscono:

diff f1.txt f2.txt | wc -l

Questo ti fornirà un intervallo numerico

    
risposta data 18.01.2011 - 14:14
fonte
1

Modello di spazio vettoriale

Un metodo comune per confrontare interi documenti è un Modello di spazio vettoriale che rappresenta ogni parola come un vettore e quindi lo rende possibile confrontare questi vettori con un altro documento per misurare la somiglianza

Questo ti dà più documenti con contenuti simili e non necessariamente testi simili. Per questo in genere usi qualcosa chiamato distanza Levenshtein , non sono sicuro che sia comunque fattibile per interi documenti (è principalmente usato su stringhe)

Vedi anche this

    
risposta data 18.01.2011 - 14:08
fonte
1

Credo che potresti fare un lungo cammino con diff . Se dai un'occhiata agli algoritmi di Diff potrebbe essere estensibile essere più fine a grana che a livello di linea

link

    
risposta data 18.01.2011 - 14:18
fonte
1

Puoi ancora utilizzare diff se modifichi i suoi input in modo che ogni carattere appaia su una riga separata:

diff <(sed 's/\(.\)/\n/g' <file1) <(sed 's/\(.\)/\n/g' <file2) | wc -l

La sintassi <(...) richiede bash e concettualmente significa "esegui ... , indirizzando il suo output su un file temporaneo da qualche parte e sostituisci il costrutto <(...) con il nome di questo file temporaneo, cancellandolo in seguito" ( sebbene userà FIFOs se disponibile invece di file temporanei effettivi). È un buon modo per utilizzare l'output di un processo come file di input con nome per un programma, che è necessario quando il programma di consumo non può leggere da stdin o richiede 2 fonti di input separate (come nel caso di diff qui ).

    
risposta data 18.01.2011 - 15:49
fonte

Leggi altre domande sui tag