2010-03-17 11 views
12

Me gustaría saber si hay alguna clase en Java capaz de comprobar, con sus propios criterios, la cantidad de una cadena es igual a otro. Ejemplo:comprobar cuánto suena una cadena como otro en 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

¡Debe tener en cuenta que Soundex y Levenshtein son dos cosas muy diferentes! Levenshtein te ayuda a detectar errores tipográficos. P.ej. un usuario que escribe "Wrich" en lugar de "Erich", aunque esas palabras no suenan de manera similar cuando se pronuncia en voz alta. Soundex te permite encontrar palabras que suenan similares, sin importar cuántas letras tengan realmente en común, p. Ej. podría permitirle encontrar "Erich" cuando busque "Eryk". –

Respuesta

5

lo general, no es el algoritmo levenshtein, que solo da salida a la cantidad de insertar/actualizar/borrar operaciones que tendrían que realizar (characterwise) para transformar una cadena en otra. La clase StringUtils de Apache tiene una implementación.

+3

AFAIK levenshtein no toma en cuenta el "sonido" de una palabra. –

7

usted tiene que utilizar una cadena "suave" métrica:

hay muchos otros, ver String Metrics para una visión general.

El mejor algoritmo depende en gran medida del campo del problema. Por ejemplo, SoundEx se degrada para los nombres de Europa del Este y la distancia de Hamming no le ayuda mucho si desea comparar la similitud de las palabras del "mundo real".

2

Esto se llama SoundEx, las operaciones de búsqueda java soundex por varias implementaciones.

uno de ellos es apache soundex la que se ve bien (aunque no he utilizado yo mismo).

2

Usted puede tratar de un algoritmo SoundEx.

14

veo dos candidatos principales:

  • El Soundex codificación, implementado por Apache Commons. Sin embargo, tenga en cuenta que está destinado principalmente a palabras únicas, relativamente cortas. No encontrará una similitud en su tercer ejemplo. Además, realmente solo funciona para palabras en inglés.
  • El Levenshtein distance (De nuevo implementado en Apache Commons). Esto es independiente del idioma, pero la similitud para las partes conmutadas como en su tercer ejemplo será relativamente baja (más como 40%). Las modificaciones como Damerau–Levenshtein distance pueden producir mejores resultados.
+4

(+1) Los algoritmos 'Metaphone' y' DoubleMetaphone' en Commons Codec dan mejores resultados que SOUNDEX, en mi experiencia. – skaffman

0

la coincidencia de cadenas es muy específica problema, porque la mayoría de las veces se tienen las mismas características de ruido en sus cadenas, que se ajustará, ya sea puntuacion adicional, errores tipográficos o errores de ortografía.Tendrá que encontrar un algoritmo que sea apropiado para los problemas en sus datos de entrada si lo está haciendo a gran escala.

Soundex le dará un grado de confianza de que dos cuerdas suenan igual, pero es posible que tenga que hacer una limpieza inicial primero (como eliminar la puntuación y convertir la cadena en palabras separadas).

Lo mejor que puedes hacer es hacer una prueba, hay una enorme cantidad de algoritmos diferentes que puedes usar, levenshtein siendo genial, como es soundex (aunque tu kilometraje variará con tu área problemática). También hay variaciones en esos dos algoritmos, por cierto.

Sugiero echar un vistazo a las bibliotecas simmetrics y second string que tienen un montón de implementaciones de coincidencia de cadenas (de las dos prefiero la segunda biblioteca de cadenas).

Parece que tiene un problema interesante que resolver, ¡buena suerte!

0

prueba SimMetrics - biblioteca de código abierto que incluye SoundEx y ChapmanMatchingSoundex que daría una puntuación mucho mejor para los ejemplos dados. es decir, Will Shake vs Shake, este enfoque utiliza un enfoque coincidente en la parte superior de SoundEx. Otra métrica es posible que desee probar, aunque sin puntuaciones fonéticas muy bien independientemente (si no es mejor en tareas de concordancia de nombres diferentes) es la métrica q-Grams en la misma biblioteca.

Cuestiones relacionadas