{"id":14538,"date":"2021-05-25T08:58:46","date_gmt":"2021-05-25T08:58:46","guid":{"rendered":"https:\/\/timi.eu\/?p=14538"},"modified":"2021-05-25T11:47:11","modified_gmt":"2021-05-25T11:47:11","slug":"fuzzy-matching-4-metodos-para-realizar-una-combinacion-en-anatella","status":"publish","type":"post","link":"https:\/\/timi.eu\/es\/blog-es\/fuzzy-matching-4-metodos-para-realizar-una-combinacion-en-anatella\/","title":{"rendered":"Fuzzy matching: 4 m\u00e9todos para realizar una combinaci\u00f3n en Anatella"},"content":{"rendered":"\n<div\n\t class=\"wpml-ls-statics-shortcode_actions wpml-ls wpml-ls-legacy-dropdown js-wpml-ls-legacy-dropdown\">\n\t<ul>\n\n\t\t<li tabindex=\"0\" class=\"wpml-ls-slot-shortcode_actions wpml-ls-item wpml-ls-item-es wpml-ls-current-language wpml-ls-item-legacy-dropdown\">\n\t\t\t<a href=\"#\" class=\"js-wpml-ls-item-toggle wpml-ls-item-toggle\">\n                                                    <img\n            class=\"wpml-ls-flag\"\n            src=\"https:\/\/timi.eu\/wp-content\/plugins\/sitepress-multilingual-cms\/res\/flags\/es.png\"\n            alt=\"\"\n            width=18\n            height=12\n    \/><span class=\"wpml-ls-native\">Espa\u00f1ol<\/span><\/a>\n\n\t\t\t<ul class=\"wpml-ls-sub-menu\">\n\t\t\t\t\n\t\t\t\t\t<li class=\"wpml-ls-slot-shortcode_actions wpml-ls-item wpml-ls-item-en wpml-ls-first-item\">\n\t\t\t\t\t\t<a href=\"https:\/\/timi.eu\" class=\"wpml-ls-link\">\n                                                                <img\n            class=\"wpml-ls-flag\"\n            src=\"https:\/\/timi.eu\/wp-content\/plugins\/sitepress-multilingual-cms\/res\/flags\/en.png\"\n            alt=\"\"\n            width=18\n            height=12\n    \/><span class=\"wpml-ls-display\">Ingl\u00e9s<\/span><\/a>\n\t\t\t\t\t<\/li>\n\n\t\t\t\t\n\t\t\t\t\t<li class=\"wpml-ls-slot-shortcode_actions wpml-ls-item wpml-ls-item-fr\">\n\t\t\t\t\t\t<a href=\"https:\/\/timi.eu\/fr\/\" class=\"wpml-ls-link\">\n                                                                <img\n            class=\"wpml-ls-flag\"\n            src=\"https:\/\/timi.eu\/wp-content\/plugins\/sitepress-multilingual-cms\/res\/flags\/fr.png\"\n            alt=\"\"\n            width=18\n            height=12\n    \/><span class=\"wpml-ls-display\">Franc\u00e9s<\/span><\/a>\n\t\t\t\t\t<\/li>\n\n\t\t\t\t\n\t\t\t\t\t<li class=\"wpml-ls-slot-shortcode_actions wpml-ls-item wpml-ls-item-nl\">\n\t\t\t\t\t\t<a href=\"https:\/\/timi.eu\/nl\/\" class=\"wpml-ls-link\">\n                                                                <img\n            class=\"wpml-ls-flag\"\n            src=\"https:\/\/timi.eu\/wp-content\/plugins\/sitepress-multilingual-cms\/res\/flags\/nl.png\"\n            alt=\"\"\n            width=18\n            height=12\n    \/><span class=\"wpml-ls-display\">Holand\u00e9s<\/span><\/a>\n\t\t\t\t\t<\/li>\n\n\t\t\t\t\n\t\t\t\t\t<li class=\"wpml-ls-slot-shortcode_actions wpml-ls-item wpml-ls-item-ru wpml-ls-last-item\">\n\t\t\t\t\t\t<a href=\"https:\/\/timi.eu\/ru\/\" class=\"wpml-ls-link\">\n                                                                <img\n            class=\"wpml-ls-flag\"\n            src=\"https:\/\/timi.eu\/wp-content\/plugins\/sitepress-multilingual-cms\/res\/flags\/ru.png\"\n            alt=\"\"\n            width=18\n            height=12\n    \/><span class=\"wpml-ls-display\">Ruso<\/span><\/a>\n\t\t\t\t\t<\/li>\n\n\t\t\t\t\t\t\t<\/ul>\n\n\t\t<\/li>\n\n\t<\/ul>\n<\/div>\n\n<h1>Fuzzy matching: 4 m\u00e9todos para realizar una combinaci\u00f3n<\/h1>\n<p>En un art\u00edculo&nbsp;anterior, compart\u00ed con ustedes una soluci\u00f3n \u00fatil para realizar un fuzzy matching entre 2 tablas diferentes. Luego, compart\u00ed 2 soluciones ETL (Extract Transform Load). Tableau Prep Builder no logr\u00f3 el resultado deseado. As\u00ed que recurr\u00ed a Anatella. En el art\u00edculo de hoy, explorar\u00e9 los diferentes algoritmos de Fuzzy Matching disponibles en esta herramienta y sus efectos. Como ver\u00e1, tenemos un algoritmo ganador en esta comparaci\u00f3n.<\/p>\n<hr class=\"clearfix\">\n<h2><img decoding=\"async\" class=\"aligncenter size-large wp-image-13406\" src=\"https:\/\/timi.eu\/wp-content\/uploads\/2021\/04\/introduction-banner-1024x341.jpg\" alt=\"\" width=\"600\" srcset=\"https:\/\/timi.eu\/wp-content\/uploads\/2021\/04\/introduction-banner-1024x341.jpg 1024w, https:\/\/timi.eu\/wp-content\/uploads\/2021\/04\/introduction-banner-600x200.jpg 600w, https:\/\/timi.eu\/wp-content\/uploads\/2021\/04\/introduction-banner-300x100.jpg 300w, https:\/\/timi.eu\/wp-content\/uploads\/2021\/04\/introduction-banner-768x256.jpg 768w, https:\/\/timi.eu\/wp-content\/uploads\/2021\/04\/introduction-banner.jpg 1200w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/>Introducci\u00f3n<\/h2>\n<p>Para realizar una combinaci\u00f3n entre varias tablas, tenemos 2 soluciones. O bien la clave de uni\u00f3n sigue exactamente la misma nomenclatura en ambas tablas, o no. Si se encuentra bendito caso de la primera situaci\u00f3n, puede dejar aqu\u00ed su lectura, este art\u00edculo no le ense\u00f1ar\u00e1 nada. Si, por el contrario, se encuentra en el 2\u00ba caso (o simplemente tiene curiosidad), le deseo una feliz lectura..<\/p>\n<hr class=\"clearfix\">\n<h2><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-14499\" src=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/algorithme-banner-470x157-1.jpg\" alt=\"\" width=\"470\" height=\"157\" srcset=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/algorithme-banner-470x157-1.jpg 470w, https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/algorithme-banner-470x157-1-300x100.jpg 300w\" sizes=\"(max-width: 470px) 100vw, 470px\" \/>Algoritmos de fuzzy matching<\/h2>\n<p>En este caso, el fuzzy matching se realiza a partir de una clave de combinaci\u00f3n que contiene nombres de pa\u00edses. Existen muchos m\u00e9todos \u00fatiles para calcular la similitud entre 2 entidades. Lo que me gusta de Anatella es que, a diferencia de otros ETL, te ofrece la posibilidad de elegir entre 4 m\u00e9todos:<\/p>\n<ul>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Damerau%E2%80%93Levenshtein_distance\" target=\"_blank\" rel=\"noopener noreferrer\">Damereau Levenshtein distance<\/a><\/li>\n<li>Damereau Levenshtein similarity (igual que el primero incluso delimitado entre 0 y 1)<\/li>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Jaro%E2%80%93Winkler_distance\" target=\"_blank\" rel=\"noopener noreferrer\">Jaro Winkler similarity<\/a><\/li>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/S%C3%B8rensen%E2%80%93Dice_coefficient\" target=\"_blank\" rel=\"noopener noreferrer\">Dice similarity<\/a><\/li>\n<\/ul>\n<p>Existen, por supuesto, otros m\u00e9todos para calcular la similitud.&nbsp;<a href=\"https:\/\/www.joyofdata.de\/blog\/comparison-of-string-distance-algorithms\/\" target=\"_blank\" rel=\"noopener noreferrer\">Raffael Vogler<\/a>&nbsp;ofrece un buen resumen de las diferentes t\u00e9cnicas disponibles en el paquete \u201cstringdist\u201d para R.<\/p>\n<h3 style=\"padding-left: 40px;\">Similitud de Jaro-Winkler<\/h3>\n<p style=\"padding-left: 40px;\">Este m\u00e9todo, aplicado desde el 1999, es una evoluci\u00f3n del m\u00e9todo de Jaro (1989). La puntuaci\u00f3n obtenida var\u00eda entre 0 y 1 y se calcula comparando los caracteres correspondientes en una cadena y en la otra, teniendo en cuenta las transposiciones de los caracteres.<\/p>\n<h3 style=\"padding-left: 40px;\">Damereau Levenshtein distance<\/h3>\n<p style=\"padding-left: 40px;\">Se trata de un m\u00e9todo antiguo (1964) que permite calcular el n\u00famero de pasos necesarios para transformar una cadena (a) en una cadena (b). Las operaciones permitidas son la supresi\u00f3n, la inserci\u00f3n, la sustituci\u00f3n de un solo car\u00e1cter y la transposici\u00f3n de 2 caracteres adyacentes. La distancia calculada es, por tanto, un n\u00famero entero que corresponde al n\u00famero de pasos necesarios para la transformaci\u00f3n (0 cuando las cadenas a y b son id\u00e9nticas).<\/p>\n<h3 style=\"padding-left: 40px;\">Similitud DICE<\/h3>\n<p style=\"padding-left: 40px;\">Tambi\u00e9n este m\u00e9todo es bastante antiguo (1948) y consiste en una simple comparaci\u00f3n de diagramas. El coeficiente se aproxima al \u00edndice de Jaccard. Le remito a la p\u00e1gina de Wikipedia para ver algunos ejemplos importantes.<\/p>\n<hr class=\"clearfix\">\n<h2><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-14511\" src=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/results-banner-470x157-1.jpg\" alt=\"\" width=\"470\" height=\"157\" srcset=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/results-banner-470x157-1.jpg 470w, https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/results-banner-470x157-1-300x100.jpg 300w\" sizes=\"(max-width: 470px) 100vw, 470px\" \/><br \/>\nResultados<\/h2>\n<p>Aqu\u00ed est\u00e1n los resultados. Le recuerdo que no son transponibles a ning\u00fan caso concreto. Hay que estudiar previamente cada caso para encontrar el m\u00e9todo m\u00e1s adecuado. En este caso, se trata de un fuzzy matching entre nombres de pa\u00edses que corresponden a nomenclaturas diferentes. Le remito a mi art\u00edculo de la semana pasada para consultar la lista de casos.<\/p>\n<p>Para comparar los resultados producidos por los diferentes algoritmos, he modificado un poco el flujo en el ETL (Anatella) para poner en paralelo los 4 tipos de \u201cfuzzy joins\u201d propuestos. El proceso se muestra en azul en el diagrama de abajo (haga clic en \u00e9l para ampliarlo).<\/p>\n<p><a class=\"single-popup-image\" href=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/fuzzy-matching-comparison-anatella-1.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-large wp-image-14505\" src=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/fuzzy-matching-comparison-anatella-1-1024x382.jpg\" alt=\"\" width=\"1024\" height=\"382\" srcset=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/fuzzy-matching-comparison-anatella-1-1024x382.jpg 1024w, https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/fuzzy-matching-comparison-anatella-1-600x224.jpg 600w, https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/fuzzy-matching-comparison-anatella-1-300x112.jpg 300w, https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/fuzzy-matching-comparison-anatella-1-768x287.jpg 768w, https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/fuzzy-matching-comparison-anatella-1-1536x573.jpg 1536w, https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/fuzzy-matching-comparison-anatella-1.jpg 2041w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p>\n<p>Para facilitar la lectura he exportado los resultados a un archivo Excel (descargar&nbsp;<a href=\"https:\/\/www.intotheminds.com\/blog\/app\/uploads\/comparison-agorithms-fuzzy-matching.xlsx\" target=\"_blank\" rel=\"noopener noreferrer\">aqu\u00ed<\/a>).<\/p>\n<p>Los resultados a veces son sorprendentes.<\/p>\n<p><a class=\"single-popup-image\" href=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/fuzzy-matching-comparison-anatella-results.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-large wp-image-14508\" src=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/fuzzy-matching-comparison-anatella-results-1024x528.jpg\" alt=\"\" width=\"1024\" height=\"528\" srcset=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/fuzzy-matching-comparison-anatella-results-1024x528.jpg 1024w, https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/fuzzy-matching-comparison-anatella-results-600x310.jpg 600w, https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/fuzzy-matching-comparison-anatella-results-300x155.jpg 300w, https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/fuzzy-matching-comparison-anatella-results-768x396.jpg 768w, https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/fuzzy-matching-comparison-anatella-results.jpg 1180w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p>\n<p>El segundo m\u00e9todo parece ser el preferido en Zimbabue y difiere del m\u00e9todo 1 (que est\u00e1 m\u00e1s o menos cerca). Podemos ver que los errores de clasificaci\u00f3n a veces son bastante crudos (Sud\u00e1n del Sur \/ Corea del Sur).<\/p>\n<p>El m\u00e9todo 3 (Jaro Winkler) es ligeramente mejor, pero los errores de clasificaci\u00f3n siguen siendo demasiado frecuentes. Sin embargo, tiene una ventaja importante (v\u00e9ase el p\u00e1rrafo siguiente).<\/p>\n<p>El m\u00e9todo 4 (similitud de Dice) ofrece los mejores resultados. El error de clasificaci\u00f3n de Hong Kong puede atribuirse a razones obvias (v\u00e9ase la casilla en la tabla de referencia). El error sobre \u201cGambia\u201d se explica f\u00e1cilmente por el enfoque diagram\u00e1tico del m\u00e9todo Dice-Sorensen.<\/p>\n<hr class=\"clearfix\">\n<h2>Definici\u00f3n de un coeficiente umbral<\/h2>\n<p>Para evitar acabar con falsos positivos o falsos negativos, es \u00fatil definir un coeficiente de umbral para rechazar los resultados que requieren un tratamiento manual.<\/p>\n<p>Para el m\u00e9todo de Damereau Levenshtein (m\u00e9todos 1 y 2) vemos que este enfoque no es muy eficiente porque el algoritmo da falsos positivos con distancias calculadas bajas (ver Bahamas, Gambia, Macedonia del Norte, Sud\u00e1n del Sur).<\/p>\n<p>Para Dice, la definici\u00f3n de un umbral en torno a 0,5 no permitir\u00eda detectar los 2 falsos positivos y tambi\u00e9n dar\u00eda un falso negativo (Congo).<\/p>\n<p>Para el m\u00e9todo 3, la definici\u00f3n del umbral en torno a 0,8 habr\u00eda eliminado todas las coincidencias p\u00e9rdidas, pero tambi\u00e9n habr\u00eda generado un falso negativo (Trinidad y Tobago).<\/p>\n<hr class=\"clearfix\">\n<h2><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-14502\" src=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/conclusion-banner-470x116-1.jpg\" alt=\"\" width=\"470\" height=\"116\" srcset=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/conclusion-banner-470x116-1.jpg 470w, https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/conclusion-banner-470x116-1-300x74.jpg 300w\" sizes=\"(max-width: 470px) 100vw, 470px\" \/>Conclusi\u00f3n<\/h2>\n<p>El m\u00e9todo de Dice (tambi\u00e9n llamado m\u00e9todo de Sorensen) ofrece en este ejercicio los mejores resultados para realizar un fuzzy matching entre nombres de pa\u00edses. El m\u00e9todo de Jaro-Winkler, en cambio, permite definir un umbral en 0,8, que elimina los resultados incoherentes.<\/p>\n<p style=\"margin-top: 30px;\">Fuente: <a href=\"https:\/\/www.intotheminds.com\/blog\/es\/fuzzy-matching-comparacion-entre-4-metodos-para-realizar-una-combinacion\/\" target=\"_blank\" rel=\"noopener\">IntoTheMind<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"Explore los diferentes algoritmos de Fuzzy Matching disponibles en Anatella y su rendimiento.","protected":false},"author":1,"featured_media":13262,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[443,251],"tags":[441,439,440,445],"_links":{"self":[{"href":"https:\/\/timi.eu\/es\/wp-json\/wp\/v2\/posts\/14538"}],"collection":[{"href":"https:\/\/timi.eu\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/timi.eu\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/timi.eu\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/timi.eu\/es\/wp-json\/wp\/v2\/comments?post=14538"}],"version-history":[{"count":8,"href":"https:\/\/timi.eu\/es\/wp-json\/wp\/v2\/posts\/14538\/revisions"}],"predecessor-version":[{"id":14621,"href":"https:\/\/timi.eu\/es\/wp-json\/wp\/v2\/posts\/14538\/revisions\/14621"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/timi.eu\/es\/wp-json\/wp\/v2\/media\/13262"}],"wp:attachment":[{"href":"https:\/\/timi.eu\/es\/wp-json\/wp\/v2\/media?parent=14538"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/timi.eu\/es\/wp-json\/wp\/v2\/categories?post=14538"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/timi.eu\/es\/wp-json\/wp\/v2\/tags?post=14538"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}