2010-02-24 13 views
13

Ho due file di sottotitoli. Ho bisogno di una funzione che indica se rappresentano lo stesso testo o il testo simileAlgoritmo di similarità del testo

A volte ci sono commenti come "Il vento soffia ... la musica è in riproduzione" in un solo file. Ma l'80% percento dei contenuti sarà lo stesso. La funzione deve restituire VERO (i file rappresentano lo stesso testo). E a volte ci sono errori di ortografia come 1 invece di l (uno - L) come qui: Lei lascia il bagaglio. Ovviamente, significa che la funzione deve restituire VERO.

I miei commenti:
La funzione deve restituire la percentuale della somiglianza dei testi - concordare

"tutte le persone erano felici" e "tutte le persone non erano contenti" - qui che sarebbe considerato come un errore di ortografia, quindi sarebbe considerato lo stesso testo. Per essere precisi, la percentuale restituita dalla funzione sarà inferiore, ma abbastanza alta da dire che le frasi sono simili

Considerare se si desidera applicare Levenshtein su un intero file o solo una stringa di ricerca - non sono sicuro di Levenshtein, ma l'algoritmo deve essere applicato al file nel suo complesso. Sarà una stringa molto lunga, però.

+2

La funzione deve restituire la percentuale della somiglianza dei testi e decidi la soglia per VERO o FALSO. – YOU

+0

Dovrai essere molto attento ai tuoi criteri di somiglianza e penso che questa possa essere la parte più difficile di quello che stai cercando di fare.Ad esempio "tutta la gente era felice" e "tutto il popolo non era felice" sono simili testualmente, ma del tutto opposti in termini di significato. Alcuni esempi di testo simile e dissimile potrebbero essere utili. – glenatron

+1

Dai un'occhiata a Soundex (http://en.wikipedia.org/wiki/Soundex) e vedi se è qualcosa che stai cercando. –

risposta

11

Levenshtein algoritmo: http://en.wikipedia.org/wiki/Levenshtein_distance

altro che un risultato zero: il testo non sono "identici". "Simile" è una misura di quanto lontano/vicino siano. Il risultato è un numero intero.

+2

+1: il risultato intero dovrebbe essere normalizzato per determinare la somiglianza dell'intero file. Per esempio. Similarity = Levenshtein Distance/Num. Personaggi. Vorrei anche suggerire la pre-elaborazione del file per correggere gli errori di ortografia prima di applicare questo algoritmo. – Adamski

+0

Esiste un'implementazione della distanza di Levenshtein in "StringUtils" di Apache Commons: http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/StringUtils.html#getLevenshteinDistance(java.lang. String, java.lang.String) –

+2

@Fabian: È una funzione incorporata in PHP: http://php.net/manual/en/function.levenshtein.php – soulmerge

2

Dai un'occhiata allo approximate grep. Potrebbe darti dei suggerimenti, anche se è quasi certo che esegui abissalmente su grossi pezzi di testo come stai parlando.

EDIT: La versione originale di agrep non è open source, quindi si potrebbe ottenere i link alle versioni OSS da http://en.wikipedia.org/wiki/Agrep

2

vi aspettate troppo qui, sembra che si dovrà scrivere una funzione per le tue esigenze specifiche. Ti consiglio di iniziare con un'applicazione di confronto file esistente (forse lo diff ha già tutto ciò che ti serve) e migliorarlo per fornire buoni risultati per il tuo contributo.

+0

, il rendering del testo con una dimensione di carattere noto (e la faccia), e poi confrontare pixel. in questo modo, i simboli con una forma di aspetto simile possono essere fatti per sembrare simili, ed è più facile rilevarli. – Chii

+0

@Chii ma su un simbolo più grande spostando il resto della pagina getterebbe tutto. –

+0

Non penso che la domanda abbia qualcosa a che fare con l'OCR, ma semplicemente il testo – stillstanding

5

Per il problema descritto (ad esempio, il compering di stringhe grandi), è possibile utilizzare Cosine Similarity, che restituiscono un numero compreso tra 0 (completamente diverso) su 1 (identico), basato sui vettori term frequency.

Si potrebbe desiderare di guardare a diversi implementazioni che sono descritti qui: Cosine Similarity