Área de Tecnologías de la Información y las Comunicaciones Aplicadas
Área de Tecnologías de la Información y las Comunicaciones Aplicadas Universidad de Murcia
Área de Tecnologías de la Información y las Comunicaciones Aplicadas
ATICA arrow Consultoria arrow DBconnector arrow PLSQL - UTL_MATCH (Distancia y Similitud entre cadenas de caracteres)
24.05.2012
 
 
PLSQL - UTL_MATCH (Distancia y Similitud entre cadenas de caracteres) Imprimir E-mail

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:

Última modificación ( 26.08.2011 )
 
Área de Tecnologías de la Información y las Comunicaciones Aplicadas
Volver al incio del documento Volver al inicio del documento
Área de Tecnologías de la Información y las Comunicaciones Aplicadas