Saltar al contenido

¿Cómo hago una coincidencia aproximada de nombres de empresas en MYSQL con PHP para autocompletar?

Después de de esta extensa búsqueda de datos dimos con la solución este disgusto que tienen muchos de nuestros usuarios. Te regalamos la solución y nuestro objetivo es servirte de gran ayuda.

Solución:

Puedes empezar usando SOUNDEX(), esto probablemente servirá para lo que necesita (imagino un cuadro de sugerencias automáticas de alternativas ya existentes para lo que el usuario está escribiendo).

Los inconvenientes de SOUNDEX() son:

  • su incapacidad para diferenciar cadenas más largas. Solo se tienen en cuenta los primeros caracteres, las cadenas más largas que divergen al final generan el mismo valor de SOUNDEX
  • el hecho de que la primera letra debe ser la misma o no encontrará una coincidencia fácilmente. SQL Server tiene la función DIFFERENCE () para decirle cuánto están separados dos valores SOUNDEX, pero creo que MySQL no tiene nada de ese tipo integrado.
  • para MySQL, al menos de acuerdo con los documentos, SOUNDEX está roto para la entrada Unicode

Ejemplo:

SELECT SOUNDEX('Microsoft')
SELECT SOUNDEX('Microsift')
SELECT SOUNDEX('Microsift Corporation')
SELECT SOUNDEX('Microsift Subsidary')

/* all of these return 'M262' */

Para necesidades más avanzadas, creo que debe observar la distancia de Levenshtein (también llamada “distancia de edición”) de dos cadenas y trabajar con un umbral. Esta es la solución más compleja (= más lenta), pero permite una mayor flexibilidad.

El principal inconveniente es que necesita ambas cadenas para calcular la distancia entre ellas. Con SOUNDEX puede almacenar un SOUNDEX precalculado en su tabla y compararlo / ordenarlo / agruparlo / filtrarlo. Con la distancia de Levenshtein, es posible que descubra que la diferencia entre “Microsoft” y “Nzcrosoft” es solo 2, pero llevará mucho más tiempo llegar a ese resultado.

En cualquier caso, se puede encontrar un ejemplo de función de distancia de Levenshtein para MySQL en codejanitor.com: Distancia de Levenshtein como función almacenada de MySQL (10 de febrero de 2007).

SOUNDEX es un algoritmo correcto para esto, pero ha habido avances recientes en este tema. Se creó otro algoritmo llamado Metaphone, y luego se revisó a un algoritmo Double Metaphone. Personalmente he usado la implementación de java apache commons de doble metaphone y es personalizable y precisa.

También tienen implementaciones en muchos otros idiomas en la página de wikipedia. Esta pregunta ha sido respondida, pero si encuentra alguno de los problemas identificados con SOUNDEX apareciendo en su aplicación, es bueno saber que hay opciones. A veces puede generar el mismo código para dos palabras realmente diferentes. El doble metafono fue creado para ayudar a solucionar ese problema.

Robado de wikipedia: http://en.wikipedia.org/wiki/Soundex

Como respuesta a las deficiencias del algoritmo Soundex, Lawrence Philips desarrolló el algoritmo Metaphone con el mismo propósito. Más tarde, Philips desarrolló una mejora en Metaphone, al que llamó Double-Metaphone. Double-Metaphone incluye un conjunto de reglas de codificación mucho más grande que su predecesor, maneja un subconjunto de caracteres no latinos y devuelve una codificación primaria y secundaria para tener en cuenta las diferentes pronunciaciones de una sola palabra en inglés.

En la parte inferior de la página de doble metaphone, tienen las implementaciones del mismo para todo tipo de lenguajes de programación: http://en.wikipedia.org/wiki/Double-Metaphone

Implementación de Python y MySQL: https://github.com/AtomBoy/double-metaphone

En primer lugar, me gustaría agregar que debe tener mucho cuidado al usar cualquier forma de algoritmo de coincidencia fonético / difuso, ya que este tipo de lógica es exactamente eso, difuso o para decirlo de manera más simple; potencialmente inexacto. Especialmente true cuando se utiliza para hacer coincidir nombres de empresas.

Un buen enfoque es buscar la corroboración de otros datos, como información de dirección, códigos postales, números de teléfono, coordenadas geográficas, etc. Esto ayudará a confirmar la probabilidad de que sus datos coincidan con precisión.

Hay una gran variedad de problemas relacionados con la coincidencia de datos B2B, demasiados para abordarlos aquí, he escrito más sobre la coincidencia de nombres de la empresa en mi blog (también un artículo actualizado), pero en resumen el key los problemas son:

  • Mirando el todo string no es útil ya que la parte más importante del nombre de una empresa no está necesariamente al principio del nombre de la empresa. es decir, ‘The Proctor and Gamble Company’ o ‘Reserva Federal de los Estados Unidos’
  • Las abreviaturas son un lugar común en los nombres de empresas, es decir, HP, GM, GE, P&G, D&B, etc.
  • Algunas empresas escriben deliberadamente sus nombres incorrectamente como parte de su marca y para diferenciarse de otras empresas.

Hacer coincidir los datos exactos es fácil, pero hacer coincidir los datos no exactos puede llevar mucho más tiempo y le sugiero que considere cómo validará las coincidencias no exactas para asegurarse de que tengan una calidad aceptable.

Antes de construir Match2Lists.com, solíamos pasar una cantidad de tiempo poco saludable validando coincidencias difusas. En Match2Lists incorporamos una poderosa herramienta de visualización que nos permite revisar coincidencias no exactas, esto demostró ser un verdadero cambio de juego en términos de validación de coincidencias, reduciendo nuestros costos y permitiéndonos entregar resultados mucho más rápidamente.

¡¡La mejor de las suertes!!

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *