Coincidencia aproximada explicada
Dos cadenas son coincidencia exacta cuando son idénticas byte a byte. Dos cadenas son coincidencia aproximada cuando se parecen lo bastante para tratarlas como el mismo registro sin ser iguales. 'Acme Corp' y 'Acme Corporation' son coincidencia aproximada. 'Johnatan Smith' y 'Jonathan Smith' también. 'jose@acme.com' y 'JOSE@acme.com' no deberían serlo, eso es normalización.
El sentido de la coincidencia aproximada es cubrir el hueco entre igualdad exacta y diferencia clara cuando trabajas con datos sucios escritos por personas: nombres, empresas, direcciones, campos de texto libre. Bien usada te ahorra horas de conciliación manual. Mal usada te deja una pila de falsos positivos que cuesta más limpiar que el problema original.
Primero la normalización barata
El error más común es ir directo a coincidencia aproximada sin limpiar los datos. La mayoría de coincidencias 'aproximadas' en CSV reales no son aproximadas en absoluto. Son coincidencias exactas escondidas bajo ruido de formato: espacios al final, mayúsculas mixtas, acentos, comillas tipográficas copiadas de Word, caracteres de ancho cero pegados desde una web. Todo eso se quita con reglas de normalización deterministas y predecibles.
Pasa esas primero. Son gratis, auditables, siempre dan el mismo resultado y cubren la mayoría de las casi coincidencias en datos reales. Después de esa pasada, lo que queda son los casos verdaderamente aproximados, y son muchos menos, lo que hace la fase aproximada mucho más rápida y el resultado mucho más útil.
Qué mide Jaro-Winkler de verdad
MessyMatch usa similitud Jaro-Winkler como métrica aproximada. Puntúa cualquier par de cadenas entre 0.0 (nada en común) y 1.0 (idénticas). La base Jaro cuenta cuántos caracteres coinciden dentro de una ventana deslizante con la longitud de las cadenas, y cuántas de esas coincidencias están desordenadas (transposiciones). Winkler añade luego un bono por prefijos coincidentes, así los primeros caracteres iguales suben la puntuación.
Jaro-Winkler es el estándar para emparejar nombres porque los errores de tipeo humano se concentran. La gente transpone caracteres adyacentes, se salta una letra en mitad de la palabra o sustituye un carácter parecido visualmente. Casi nunca empieza a teclear un nombre con la letra equivocada. Jaro-Winkler captura exactamente esa conducta: tolera ruido en el medio de la cadena y premia que coincida el prefijo.
Elegir un umbral
Un umbral de 0.92 es un valor por defecto sensato. Pilla erratas de una letra, transposiciones y reordenaciones menores de palabras y descarta la mayoría de cadenas genuinamente distintas. Bájalo a 0.85 para coincidencias más laxas (más resultados, más falsos positivos). Súbelo a 0.96 si solo quieres ver coincidencias muy cercanas.
No hay un umbral universalmente correcto. Depende de cómo sean tus datos y de cuánto cuesta un falso positivo en tu flujo. La forma correcta de elegirlo: ejecutas con el valor por defecto, miras el resultado y ajustas si el ruido o la cobertura no encajan. La mayoría de usuarios acaban entre 0.88 y 0.94 tras una o dos iteraciones.
Por qué la coincidencia aproximada ingenua es lenta
Comparar cada fila del archivo A contra cada fila del archivo B es una operación O(n × m). Dos archivos de 10.000 filas cada uno son 100 millones de comparaciones. A pocos microsegundos por puntuación Jaro-Winkler, eso es uno o dos minutos de CPU pura. Con 50.000 filas cada uno son varios miles de millones de comparaciones. Demasiado lento para ser útil.
El arreglo estándar es el bloqueo (blocking). En vez de puntuar todos los pares, solo puntúas pares que comparten alguna característica barata: un prefijo común, una clave fonética común, una longitud dentro de ±N caracteres. Los pares fuera del bloque no pueden parecerse lo bastante para superar el umbral por construcción, así que saltárselos es seguro. El bloqueo es lo que hace que la coincidencia aproximada sea viable en archivos reales. MessyMatch usa bloqueo por prefijo combinado con un prefiltro de longitud, lo que mantiene las comparaciones útiles hasta aproximadamente 50.000 filas por lado en el navegador.
Cuándo la coincidencia aproximada es la herramienta equivocada
La coincidencia aproximada no es magia y hay casos donde no deberías recurrir a ella:
- Tu clave de unión es un identificador estable (UUID, número de pedido, SKU). La comparación exacta es más rápida y precisa, la aproximada inventará falsos positivos donde dos códigos inconexos se parezcan por casualidad.
- Las diferencias son semánticas, no léxicas. 'Gran Manzana' y 'Nueva York' son cero en Jaro-Winkler, necesitas una tabla de alias específica del dominio.
- Emparejas descripciones libres largas. Jaro-Winkler está pensado para cadenas cortas, para párrafos quieres métricas basadas en tokens o similitud vectorial.
- Los datos están estructurados (direcciones con componentes reordenados, teléfonos en distintos formatos). Un parser más comparación exacta sobre la forma normalizada es más fiable que aproximada sobre el texto en crudo.
Muestra siempre el motivo
Una coincidencia aproximada sin motivo es una suposición. El panel de resultados debería decirte qué caracteres coinciden, cuáles difieren y cuál es la puntuación, para que decidas si aceptarla como coincidencia real o rechazarla como casualidad. Es lo que enseña la pestaña Casi coincidencias en MessyMatch: los dos valores originales, la puntuación de similitud y un motivo legible para humanos (diferencia de acento, mayúsculas, errata de una letra, reordenación de palabras, token extra).
Sin eso, la coincidencia aproximada es opaca y tienes que fiarte del umbral. Con eso, auditas cada resultado en dos segundos y actúas con confianza.
Pruébalo con datos reales
La página Coincidencia aproximada en CSV es la forma más rápida de ver cómo queda esto sobre tus propios datos. Sueltas dos CSV, activas primero las reglas de limpieza, luego enciendes la coincidencia aproximada y eliges un umbral. El panel de resultados te mostrará coincidencias exactas, casi coincidencias con puntuaciones y todo lo que no encaja en ningún lado.