¿Por qué la coincidencia exacta no es suficiente?
Cuando verificas un nombre contra una lista de sanciones, tu primer instinto podría ser buscar una coincidencia exacta. Pero en la práctica, esto falla constantemente:
- Variaciones de nombre:“María García López” vs “GARCIA LOPEZ MARIA” vs “Ma. García L.”.
- Transliteraciones:Nombres en árabe, ruso o chino pueden tener múltiples transliteraciones al español.
- Errores tipográficos: Tanto en la lista original como en los datos de tu cliente.
- Acentos y caracteres especiales:“José” vs “Jose”, “Núñez” vs “Nunez”.
- Abreviaciones:“S.A. de C.V.” vs “SA DE CV” vs omitido por completo.
Una búsqueda exacta no encuentra ninguna de estas coincidencias. Y no encontrar una coincidencia real es peor que un falso positivo— significa que estás haciendo negocios con una entidad sancionada sin saberlo.
¿Qué es fuzzy matching?
El fuzzy matching(coincidencia difusa) es un conjunto de técnicas algorítmicas que permiten encontrar cadenas de texto que son similares pero no idénticas. En lugar de un resultado binario (match/no match), retorna un score de similitud entre 0 y 1.
AmigoApi utiliza 6 métricas de fuzzy matching simultáneamente y las combina en un composite scoreponderado. Un enfoque multi-métrica reduce tanto falsos positivos como falsos negativos porque cada algoritmo es fuerte en diferentes tipos de variaciones.
1. Token Sort Ratio (35% del peso)
Este algoritmo normaliza el orden de las palabras antes de comparar. Es la métrica con mayor peso porque en listas de sanciones los nombres suelen estar en diferente orden:
- “GARCÍA LÓPEZ JUAN CARLOS” → tokens: [CARLOS, GARCIA, JUAN, LOPEZ]
- “Juan Carlos García López” → tokens: [CARLOS, GARCIA, JUAN, LOPEZ]
- Resultado: 100% de similitud — mismas palabras, diferente orden.
Es especialmente útil para nombres hispanos, donde el orden nombre-apellido puede variar entre fuentes.
2. Token Set Ratio (20% del peso)
Similar al token sort, pero maneja subconjuntos y superconjuntos de palabras. Es crucial cuando un nombre tiene palabras adicionales:
- “OPERADORA AUTOPISTAS” vs “OPERADORA AUTOPISTAS DEL SURESTE SA DE CV”
- Resultado: score alto porque “OPERADORA AUTOPISTAS” es un subconjunto.
Esto es común con nombres de empresas mexicanas que incluyen razón social (SA de CV, S de RL, etc.) en algunas fuentes pero no en otras.
3. Similitud por Trigramas (20% del peso)
Los trigramas son secuencias de 3 caracteres consecutivos. Este método compara cuántos trigramas comparten dos cadenas. AmigoApi usa la extensión pg_trgm de PostgreSQLpara calcular esto directamente en la base de datos durante la fase de recuperación de candidatos, lo que hace el proceso extremadamente rápido.
4. Ratio Simple (10% del peso)
Similitud básica carácter a carácter usando el algoritmo de secuencia común más larga. Funciona como baseline para nombres muy similares con diferencias menores.
5. Jaro-Winkler (10% del peso)
El algoritmo Jaro-Winkler mide la similitud entre dos cadenas considerando:
- El número de caracteres coincidentes.
- El número de transposiciones necesarias.
- Un bonus por prefijo común (las personas tienden a escribir correctamente el inicio de los nombres).
Es particularmente efectivo para detectar errores tipográficos: “GONZALEZ” vs “GONZALES” obtiene un score de ~0.96, mientras que nombres completamente diferentes obtienen scores bajos.
6. Búsqueda Fonética con Double Metaphone (5% bonus)
Esta es una característica distintiva de AmigoApi. El matching fonético compara cómo suenan los nombres, no cómo se escriben. Utilizamos el algoritmo Double Metaphone, que genera dos códigos fonéticos posibles por palabra para manejar ambigüedades de pronunciación.
Funciona así:
- Cada palabra del nombre se convierte a un código fonético Double Metaphone.
- Los códigos se precalculan y almacenan para cada entidad en la base de datos.
- Al buscar, se comparan los códigos fonéticos del query con los de cada candidato.
- Si los códigos del query son un subconjunto de los códigos de la entidad, hay match fonético.
Esto detecta coincidencias como:
- “González” vs “Gonzales” — misma fonética, diferente ortografía.
- “Ximena” vs “Jimena” — variaciones regionales.
- “Muhammad” vs “Mohamed” vs “Mohammed” — transliteraciones.
- “Vázquez” vs “Basquez” — confusiones B/V comunes en español.
Composite Score
Ningún algoritmo individual es perfecto para todos los casos. Por eso AmigoApi combina las 6 métricas en un composite score ponderado:
"scores": {
"composite": 0.875,
"token_sort_ratio": 0.901, // 35%
"token_set_ratio": 0.856, // 20%
"trigram": 0.890, // 20%
"ratio": 0.723, // 10%
"jaro_winkler": 0.876, // 10%
"phonetic_match": true // 5% bonus
}Además, para entidades mexicanas, la coincidencia exacta de RFCse evalúa por separado y retorna un score de 1.0, eliminando ambigüedades cuando el identificador fiscal coincide.
Configurando el threshold
El thresholdes el score mínimo para que una coincidencia sea reportada. AmigoApi te permite configurarlo por request (rango 0.0 a 1.0):
- 0.60-0.70:Sensibilidad alta. Más resultados, más falsos positivos. Útil para due diligence profundo.
- 0.70-0.85:Balance óptimo para la mayoría de los casos de uso.
- 0.85+:Alta precisión. Menos resultados, pero casi todos son coincidencias reales. Útil para screening automatizado sin revisión manual.
¿Quieres ver el fuzzy matching en acción? Prueba nuestra demo en vivo— haz click en las métricas de scoring para ver cómo funciona cada una.