|
Desde Oracle 10g R2 el paquete UTL_MATCH incorpora funciones para comparar 2 cadenas, en base a la distancia y/o la similitud entre ellas. En la documentación oficial no aparece hasta la versión 11g, aunque en 10g R2 existe y funciona perfectamente.
Entendemos por distancia entre 2 cadenas como los cambios que hay que hacer sobre la primera para obtener la segunda.
La función UTL_MATCH.EDIT_DISTANCE_SIMILARITY devuelve un valor entre 0 y 100 (donde 100 indica que son idénticas), en base al concepto de distancia (concretamente la "Distancia de Levenshtein").
Sin embargo la función UTL_MATCH.JARO_WINKLER_SIMILARITY, además tiene en cuenta los errores que se pueden cometer al escribir (en base a la "Distancia de Jaro-Winkler", utilizada por la Oficina del Censo en USA), de modo que es muy útil, por ejemplo, para comparar nombres de personas, y encontrar errores en la introducción de los mismos.
Ejemplo:
En el siguiente ejemplo vamos a ver una consulta para listar los errores que se cometieron al introducir el nombre "FRANCISCO" (las líneas "not like" las hemos introducido a posteriori para eliminar falsos positivos).
La consulta se basa en la función "utl_match.jaro_winkler_similarity" que tiene en cuenta los errores de escritura, de modo que según la claúsula "where" que hemos puesto, listamos sólo los nombres que tienen al menos un 90% de similitud con "FRANCISCO".
select AFI_NOMBRE,
utl_match.edit_distance_similarity(AFI_NOMBRE,'FRANCISCO') DISTANCIA,
utl_match.jaro_winkler_similarity(AFI_NOMBRE,'FRANCISCO') SIMILTUD
from AFILIACIONES
where utl_match.jaro_winkler_similarity(AFI_NOMBRE,'FRANCISCO') > 89
and AFI_NOMBRE not like 'FRANCISC%'
and AFI_NOMBRE not like 'FRANCESC%'
and AFI_NOMBRE not like 'FRANCO%';
AFI_NOMBRE DISTANCIA SIMILITUD
--------------------- --------- ---------
FRANCISDO 89 95
FRANSCICO JOSE 50 90
FRANCIACA 78 91
FRANCISAC 78 95
FRANCIS 78 95
FRANCISCO 90 96
FRANC ISCO JAVIER 53 90
...
FRANCISO 89 97
...
FRANCIASCA 80 93
...
FRNCISCO 89 97
FRANCES 67 90
FRANCESOC 67 93
...
FRANCISCO 90 96
...
FRAMCISCO 89 94
FRNACISCO 78 97
FRASCISCO 89 91
FRRANCISCO 90 97
...
93 rows selected.
/
Referencias:
|