2010-03-17 5 views
12

Vorrei sapere se esiste una classe in Java in grado di verificare, utilizzando i propri criteri, quanto una stringa sia uguale a un'altra. Esempio:Controlla quanto una stringa suona come un'altra in Java

  • William Shakespeare/William Shakespeare : might be 100%
  • William Shakespe**a**re/William Shakespe**e**re : might have above 90%
  • William Shakespeare/Shakespeare, William : might have above 70% (just examples)
+3

Dovresti sapere che Soundex e il Levenshtein sono due cose molto diverse! Levenshtein ti aiuta a cogliere errori di battitura. Per esempio. un utente che digita "Wrich" invece di "Erich", anche se quelle parole non sembrerebbero affatto simili quando pronunciate ad alta voce. Soundex ti consente di trovare parole che sembrano simili, indipendentemente dal numero di lettere che hanno in comune, ad es. potrebbe farti trovare "Erich" quando cerchi "Eryk". –

risposta

5

In generale, v'è la levenshtein algoritmo, che emette solo quanti/aggiornare/cancellare le operazioni di inserimento si dovrebbe svolgere (a caratteri) per trasformare una stringa in un'altra. La classe StringUtils di Apache ha un'implementazione.

+3

AFAIK levenshtein non tiene conto del "suono" di una parola. –

7

è necessario utilizzare una stringa "soft" metrica:

Ci sono molti altri, vedere String Metrics per una panoramica.

L'algoritmo migliore dipende molto dal campo del problema. Ad esempio, SoundEx si degrada per i nomi dell'Europa orientale e la distanza di Hamming non ti aiuta molto se vuoi confrontare la similitudine delle parole del "mondo reale".

2

Questo viene chiamato SoundEx, ricerca java soundex per diverse implementazioni.

uno di questi è apache soundex che sembra buono (anche se non l'ho usato da solo).

2

È possibile provare un algoritmo SoundEx.

14

vedo due candidati principali:

  • La codifica Soundex, attuate da Apache Commons. Tuttavia, si noti che è principalmente pensato per parole singole, relativamente brevi. Non troverà una somiglianza nel tuo terzo esempio. Inoltre, funziona davvero solo per le parole inglesi.
  • Levenshtein distance (Ancora implementato a Apache Commons). Questo è indipendente dal linguaggio, ma la somiglianza per le parti commutate come nel terzo esempio sarà relativamente bassa (più simile al 40%). Modifiche come lo Damerau–Levenshtein distance possono produrre risultati migliori.
+4

(+1) Gli algoritmi 'Metaphone' e' DoubleMetaphone' in Commons Codec danno risultati migliori che SOUNDEX, nella mia esperienza. – skaffman

0

stringa corrispondente è molto specifico problema-, perché la maggior parte del tempo si avrà le stesse caratteristiche di rumore nelle stringhe da abbinare, sia esso la punteggiatura in più, errori di battitura o errori di ortografia.Dovrai trovare un algoritmo appropriato per i problemi nei tuoi dati di input se lo stai facendo su larga scala.

Soundex offre una certa sicurezza che due stringhe suonino allo stesso modo, ma potrebbe essere necessario eseguire prima una pulizia iniziale (come la rimozione della punteggiatura e la tokenizzazione della stringa in parole separate).

La cosa migliore che puoi fare è eseguire un test, ci sono un'enorme quantità di algoritmi diversi che puoi usare, levenshtein è uno dei migliori, così come soundex (anche se il tuo chilometraggio varierà con l'area problematica). Ci sono anche variazioni su questi due algoritmi, BTW.

Suggerisco di dare un'occhiata alle librerie simmetrics e second string che hanno un sacco di implementazioni di corrispondenza delle stringhe (tra le due preferisco la seconda libreria di stringhe).

Sembra che tu abbia un problema interessante da risolvere, buona fortuna!

0

provare SimMetrics - libreria open source che include SoundEx e ChapmanMatchingSoundex che fornirebbe un punteggio molto migliore per gli esempi forniti. Ovvero Shake vs Shake, questo approccio utilizzerà un approccio di matching in cima a SoundEx. Un'altra metrica che si potrebbe voler provare, anche se non i punteggi fonetici molto bene a prescindere (se non meglio nei diversi compiti di corrispondenza dei nomi) è la metrica q-Grams nella stessa libreria.

Problemi correlati