que oficio impi fonetico fonetica documento busqueda archivo java c++ string search

java - oficio - La forma más eficiente de implementar una búsqueda fonética.



documento fonetico impi (2)

¿Cuál es la forma más eficiente de implementar una búsqueda fonética en C ++ y / o Java? Por búsqueda fonética me refiero a sustituir vocales o consonantes que suenen similares. Esto sería especialmente útil para los nombres porque a veces los nombres de las personas tienen una especie de ortografía extraña.

Estoy pensando que podría ser efectivo sustituir vocales y algunas consonantes. También puede ser bueno incluir algunos casos especiales como E silenciosas al final o F y PH. ¿Sería mejor usar cstrings o cadenas en C ++? ¿Sería mejor almacenar una copia en la memoria con los valores sustituidos o llamar a una función cada vez que buscamos algo?


Además de Soundex , también encontrará el algoritmo fonético Metaphone o Double Metaphone , que parece ser una mejora para la pronunciación en inglés y es un algoritmo bastante nuevo.

Para la pronunciación alemana utilizo el "Kölner Phonetik".

Apache Commons Codec le ofrece una implementación Java muy sencilla de esos algoritmos básicos (Soundex, Metaphone, ...) http://commons.apache.org/codec/ Por ejemplo, vea javadoc para soundex: http://commons.apache.org/codec/apidocs/org/apache/commons/codec/language/Soundex.html

Simplemente escribiendo el siguiente código, el valor fonético de su cadena:

Soundex soundex = new Soundex(); String phoneticValue = soundex.encode("YourString");

Y luego simplemente puede hacerlo por dos cadenas y comparar los valores fonéticos. Eche un vistazo a la siguiente publicación si está comparando dos cadenas, ya que los métodos equals () son solo en blanco y negro, y tal vez le gustaría saber a qué porcentaje corresponde.

¿Cómo comparar cadenas casi similares en Java? (Medida de la distancia de la cadena)


Soundex junto con sus variantes es el algoritmo estándar para esto. Utiliza reglas fonéticas para transformar el nombre en un código alfanumérico. Los nombres con el mismo código se agrupan juntos.

En cuanto a la implementación de la búsqueda, usaría una estructura de datos que asigna cada código soundex a la lista de nombres que tienen ese código. Dependiendo de la estructura de datos utilizada (una tabla hash o un árbol), la búsqueda podría realizarse en un tiempo que sea constante en logarítmico en el número de códigos de soundex distintos.

No estoy seguro de a qué se cstring exactamente con cstring (¿ CString de Microsoft?), Pero la clase estándar std::string será perfectamente adecuada para este problema y sería mi opción preferida.