Búsqueda difusa de duplicados con SQL

Con SQL resulta fácil encontrar duplicados exactos. Y para buscar duplicados difusos, la mayoría de los servidores de bases de datos aplican un comando propio de SQL mediante el que se pueden encontrar palabras casi homófonas.

Con el comando de SOUNDEX, la mayor parte de los servidor de bases de datos aplican el que quizás sea el algoritmo más empleado para realizar búsquedas fonéticas. SOUNDEX representa las letras de una palabra conforme a su pronunciación en inglés en una cadena de cuatro caracteres. Mediante este sencillo procedimiento se pueden conseguir, en parte, resultados razonablemente buenos. Así pues, p. ej. "Smith" y "Smythe" se reconocen como idénticos. El algoritmo también ofrece resultados relativamente buenos en idiomas distintos al inglés. De este modo, p. ej. "Maier", "Mayer", "Mayr" y "Mair" se reconocen como idénticos.

No obstante, el procedimiento está concebido para comparar palabras individuales, por lo que al comparar "Ken Smith" con "Smith Ken" no se obtiene resultado alguno. Por otro lado, este procedimiento depende del idioma. Además, la representación de la palabra objeto de análisis en una cadena de cuatro caracteres es bastante aproximativa, por lo que se obtienen resultados, en parte, curiosos. Así pues, "Hilbert" y "Heilbronn" o "‚Knuth" y "Kant" se reconocen como idénticos.

Además, la diferencia entre las dos palabras que se comparan no siempre es la misma. Por lo tanto, estaría bien que la comparación devolviera un grado de concordancia, por ejemplo 80% o 90%. Sin embargo, los algoritmos fonéticos sólo devuelven el resultado de la comparación, tanto si las dos palabras son similares como si no.

Una consulta de SQL para determinar duplicados mediante el comando de SOUNDEX podría tener el siguiente aspecto:

SELECT tab1.id, tab1.name, tab2.id, tab2.name
FROM tablename tab1, tablename tab2
WHERE SOUNDEX(tab1.name)= SOUNDEX(tab2.name)
AND tab1.id<>tab2.id
AND tab1.id=(SELECT MAX(id) FROM tablename tab
WHERE SOUNDEX(tab.name)=SOUNDEX(tab1.name))

Dado que el resultado de esta consulta contiene coincidencias que, con toda probabilidad, no son en absoluto correctas y teniendo en cuenta que no se desea dejar al azar la cuestión relativa a qué registro de datos se debe eliminar de un grupo de duplicados y cuál se debe conservar, no se puede seguir procesando el resultado así sin más. A ello hay que añadir que, en consultas de este tipo, siempre se comparan todos los registros de datos con todos los demás, lo que incrementa el tiempo de ejecución de la consulta.

Consecuentemente, el comando de SOUNDEX en SQL no es, en casi ningún caso, un método viable para liberar de duplicados una base de datos. No obstante, este problema solo se puede solucionar de manera satisfactoria con herramientas especializadas que ofrecen una búsqueda de duplicados con tolerancia a fallos, p. ej. DataQualityTools: