{"id":15419,"date":"2020-11-05T13:30:00","date_gmt":"2020-11-05T13:30:00","guid":{"rendered":"https:\/\/timi.eu\/?p=15419"},"modified":"2021-06-07T13:50:15","modified_gmt":"2021-06-07T13:50:15","slug":"fuzzy-matching-tableau-prep-builder-vs-anatella","status":"publish","type":"post","link":"https:\/\/timi.eu\/nl\/blog-nl\/fuzzy-matching-tableau-prep-builder-vs-anatella\/","title":{"rendered":"Fuzzy matching : Tableau Prep Builder vs 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-nl 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\/nl.png\"\n            alt=\"\"\n            width=18\n            height=12\n    \/><span class=\"wpml-ls-native\">Nederlands<\/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\">Engels<\/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\">Frans<\/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-es\">\n\t\t\t\t\t\t<a href=\"https:\/\/timi.eu\/es\/\" class=\"wpml-ls-link\">\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-display\">Spaans<\/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\">Russisch<\/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 tussen tabellen:<br \/>\nTableau Prep Builder vs Anatella<\/h1>\n<p>Als u gegevens bewerkt met het oog op analyse- en\/of visualisatie heeft u wellicht al met dit probleem te maken gehad. U moet een verbinding maken tussen 2 databases, maar de gegevens in het referentieveld zijn niet precies hetzelfde. Verschillen in spelling, verschillende benamingen, \u2026 er zijn tal van verschillende oorzaken. Tijdens een onderzoek dat ik uitvoer om migratiestromen te visualiseren, werd ik met dit probleem geconfronteerd. Ik zocht een oplossing in <strong>ETL (Extract \u2013 Transform \u2013 Load) voor fuzzy matching<\/strong>. Laat met het uitleggen.<br \/>\n<a name=\"para1\"><\/a><\/p>\n<h2>Samenvatting<\/h2>\n<ul>\n<li><a href=\"#para1\">Inleiding<\/a><\/li>\n<li><a href=\"#para2\">Het probleem<\/a><\/li>\n<li><a href=\"#para3\">Oplossing 1 met Table Prep Builder (spoiler: het werkt niet)<\/a><\/li>\n<li><a href=\"#para4\">Oplossing 2 met Anatella (spoiler: het werkt)<\/a><\/li>\n<li><a href=\"#para5\">Conclusie<\/a><\/li>\n<\/ul>\n<hr class=\"wp-block-separator\">\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" class=\"aligncenter size-large wp-image-13405\" 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\" \/><\/figure>\n<p><a name=\"para2\"><\/a><\/p>\n<h2>Introductie<\/h2>\n<p>In het kader van een persoonlijk project over de visualisering van migratiestromen in Europa, heb ik cijfers verkregen van de Europese Unie (de database telt 242500 lijnen). De databank geeft een gedetailleerd overzicht van het aantal migranten volgens hun land van herkomst en hun land van bestemming. Aan de ene kant heb je dus ongeveer 200 landen van herkomst, en aan de andere kant ongeveer 30 landen van bestemming. Het leek me dus aangewezen om deze stromen te visualiseren op een hoger niveau van granulariteit: de regio van herkomst.<\/p>\n<p>Ik had direct in Tableau groepen van landen kunnen maken, maar als je 200 items hebt, is dat omslachtig (en niet noodzakelijk foutloos). Ik ging liever op zoek naar een databank van de verschillende landen en de &#8220;offici\u00eble&#8221; regio waartoe ze behoren. Ik vond deze database op de website van de Wereldhandelsorganisatie.<\/p>\n<p><a name=\"para3\"><\/a><\/p>\n<h2>Het probleem<\/h2>\n<p>Het probleem is dat een landnaam lang geen constante is. Hier enkele voorbeelden:<\/p>\n<ul>\n<li>\u201cCabo Verde\u201d in de nationale taal van het land, \u201cCap Verde\u201d in het Engels.<\/li>\n<li>\u201cAntigua en Barbuda\u201d in het ene bestand, \u201cAntigua &amp; Brabuba\u201d in het andere.<\/li>\n<li>\u201cBahama\u2019s\u201d en \u201cThe Bahama\u2019s\u201d<\/li>\n<li>\u201cCentral-African Republic\u201d en \u201cCentral-African Rep.\u201d<\/li>\n<li>\u201cCook Islands (NZ)\u201d en \u201cCook Islands\u201d<\/li>\n<li>\u201cC\u00f4te d\u2019Ivoire\u201d en \u201cCote d\u2019Ivoire<\/li>\n<\/ul>\n<p>Alvorens de liefhebbers van \u201csearch and replace\u201d Excel me op die functie wijzen, moet ik eerst aangeven dat ik op zoek was naar een oplossing die minder vervangingen met zich mee zou brengen.<\/p>\n<p><a name=\"para3\"><\/a>U begrijpt dat ik een paar uur had kunnen besteden aan het opschonen van mijn database en het laten \u201cmatchen\u201d van gegevens, zodat de koppeling kon werken. Maar ik zocht dus een elegantere oplossing.<\/p>\n<hr class=\"wp-block-separator\">\n<figure class=\"aligncenter\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-13408\" src=\"https:\/\/timi.eu\/wp-content\/uploads\/2021\/04\/1-banner-470x157-1.jpg\" alt=\"\" width=\"470\" height=\"157\" srcset=\"https:\/\/timi.eu\/wp-content\/uploads\/2021\/04\/1-banner-470x157-1.jpg 470w, https:\/\/timi.eu\/wp-content\/uploads\/2021\/04\/1-banner-470x157-1-300x100.jpg 300w\" sizes=\"(max-width: 470px) 100vw, 470px\" \/><\/figure>\n<h2>Oplossing 1 (die niet werkt)<\/h2>\n<p>Aangezien ik als doel had mijn gegevens in Tableau te visualiseren, probeerde ik eerst Tableau Prep Builder. Het voordeel van Tableau Prep Builder is dat het ETL-proces grafisch verloopt en de problemen duidelijk worden weergegeven (Tableau Prep zet ze automatisch in het rood, zie hieronder). Ik heb problemen waar ik het hierboven over had in het geel gemarkeerd. Het is nog maar de vraag of het mogelijk is om de tabellen met elkaar te verbinden.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a class=\"single-popup-image\" href=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/tableau-prep-joint-similarities-fuzzy-join-1024x625-1.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-14563\" src=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/tableau-prep-joint-similarities-fuzzy-join-1024x625-1.jpg\" alt=\"\" width=\"1024\" height=\"625\" srcset=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/tableau-prep-joint-similarities-fuzzy-join-1024x625-1.jpg 1024w, https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/tableau-prep-joint-similarities-fuzzy-join-1024x625-1-600x366.jpg 600w, https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/tableau-prep-joint-similarities-fuzzy-join-1024x625-1-300x183.jpg 300w, https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/tableau-prep-joint-similarities-fuzzy-join-1024x625-1-768x469.jpg 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n<p>Later vond <a href=\"https:\/\/onenumber.biz\/blog-1\/2018\/9\/7\/can-tableau-prep-do-fuzzy-matching\" target=\"_blank\" rel=\"noopener noreferrer\">dit artikel<\/a> tegen, waarin een methode van groepering door middel van fonetiek wordt beschreven.  Deze optie is hier beschikbaar:<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a class=\"single-popup-image\" href=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/tableau-prep-group-pronunciation-470x277-1.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-14560\" src=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/tableau-prep-group-pronunciation-470x277-1.jpg\" alt=\"\" width=\"470\" height=\"277\" srcset=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/tableau-prep-group-pronunciation-470x277-1.jpg 470w, https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/tableau-prep-group-pronunciation-470x277-1-300x177.jpg 300w\" sizes=\"(max-width: 470px) 100vw, 470px\" \/><\/a><\/figure>\n<\/div>\n<p>Groepen zijn nuttig binnen dezelfde tabel om variaties op te sporen. Zie <a href=\"https:\/\/www.tableau.com\/engineering\/blog\/2019\/9\/automated-grouping-tableau-prep-builder\" target=\"_blank\" rel=\"noopener noreferrer\">hier<\/a> voor de technische toelichting. Het gebruikte algoritme heet Metaphore 3 (open source, zie <a href=\"https:\/\/stackoverflow.com\/questions\/10442633\/what-is-the-metaphone-3-algorithm\" target=\"_blank\" rel=\"noopener noreferrer\">hier<\/a>).<br \/>\n<a name=\"para4\"><\/a><br \/>\nHet probleem is dat groeperingen alleen mogelijk zijn op \u00e9\u00e9n enkele tabel. Ik had dus eerst moeten koppelen, vervolgens groeperen en ten slotte handmatig ontdubbelen. Dit is mogelijk als het om enkele gegevens gaat, maar de methode zou niet schaalbaar zijn geweest.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a class=\"single-popup-image\" href=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/grouping-pronunciation-tableau-prep-470x316-1.gif\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-14557\" src=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/grouping-pronunciation-tableau-prep-470x316-1.gif\" alt=\"\" width=\"470\" height=\"316\"><\/a><\/figure>\n<\/div>\n<p>Op naar de tweede oplossing.<\/p>\n<hr class=\"wp-block-separator\">\n<h2><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-13411\" src=\"https:\/\/timi.eu\/wp-content\/uploads\/2021\/04\/2-banner-470x157-1.jpg\" alt=\"\" width=\"470\" height=\"157\" srcset=\"https:\/\/timi.eu\/wp-content\/uploads\/2021\/04\/2-banner-470x157-1.jpg 470w, https:\/\/timi.eu\/wp-content\/uploads\/2021\/04\/2-banner-470x157-1-300x100.jpg 300w\" sizes=\"(max-width: 470px) 100vw, 470px\" \/><br \/>\nOplossing 2 (die werkt!)<\/h2>\n<p>Om mijn problemen van fuzzy matching op te lossen EN een oplossing te hebben die schaalbaar was, heb ik me vervolgens tot <a href=\"http:\/\/www.anatella.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Anatella<\/a> gewend..<\/p>\n<p>Het voordeel van deze oplossing (naast het feit dat het gratis is voor kleine installaties) is dat het een koppelingstool heeft in combinatie met fuzzy matching. Als u weet hoe u moet werken onder Tableau Prep (of een andere ETL-tool) zult u ook hierin uw weg vinden. De look&amp;feel is vrijwel hetzelfde (vensters, pijlen, parameters). Voor mij is het grote voordeel van Anatella de rijkdom van de voorgestelde functies (+\/-300). Zo ziet het process om het probleem op te lossen er uit (klik om te vergroten).<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a class=\"single-popup-image\" href=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/fuzzy-matching-process-anatella.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-large wp-image-14554\" src=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/fuzzy-matching-process-anatella-1024x219.jpg\" alt=\"\" width=\"1024\" height=\"219\" srcset=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/fuzzy-matching-process-anatella-1024x219.jpg 1024w, https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/fuzzy-matching-process-anatella-600x128.jpg 600w, https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/fuzzy-matching-process-anatella-300x64.jpg 300w, https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/fuzzy-matching-process-anatella-768x164.jpg 768w, https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/fuzzy-matching-process-anatella-1536x329.jpg 1536w, https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/fuzzy-matching-process-anatella.jpg 1873w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n<p>Ik ga niet het hele proces in detail bespreken, maar ik zal me richten op de belangrijkste onderdelen en natuurlijk de fuzzy matching.<\/p>\n<ul>\n<li>In stap 1 maak ik een scheiding tussen de entries waarvoor de koppeling goed ging (onderste tak) en de entries waarvoor geen match werd gevonden (bovenste tak).<\/li>\n<li>In stap 2 pas ik de beroemde fuzzy matching tool toe.<\/li>\n<\/ul>\n<p><a name=\"para5\"><\/a><br \/>\nDeze functie is interessant omdat u hiermee veel verder kunt gaan dan bijvoorbeeld Tableau Prep Builder, maar ook dan een ETL-tool zoals Talend. U kunt inderdaad het algoritme kiezen dat u moet toepassen om de overeenkomst tussen twee velden te berekenen. Aangezien Anatella de <a href=\"https:\/\/en.wikipedia.org\/wiki\/String_metric\" target=\"_blank\" rel=\"noopener noreferrer\">gelijkenisco\u00ebffici\u00ebnt<\/a>, teruggeeft, hoeft u alleen maar een drempel te kiezen en deze toe te passen. De verschillende beschikbare algoritmen zijn de <a href=\"https:\/\/en.wikipedia.org\/wiki\/S%C3%B8rensen%E2%80%93Dice_coefficient\" target=\"_blank\" rel=\"noopener noreferrer\">similariteitsco\u00ebffici\u00ebnt van Dice<\/a>, de vergelijkingsmethode van Damereau Levenshtein, die van <a href=\"https:\/\/en.wikipedia.org\/wiki\/Jaro%E2%80%93Winkler_distance\" target=\"_blank\" rel=\"noopener noreferrer\">Jareau Winkler<\/a> en de <a href=\"https:\/\/en.wikipedia.org\/wiki\/Damerau%E2%80%93Levenshtein_distance\" target=\"_blank\" rel=\"noopener noreferrer\">afstandsberekening van Damereau Levenshtein<\/a>. Ik zal een afzonderlijk artikel wijden aan de vergelijking van deze verschillende methoden.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a class=\"single-popup-image\" href=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/fuzzy-matching-joint-anatella.gif\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-14551\" src=\"https:\/\/timi.eu\/wp-content\/uploads\/2020\/11\/fuzzy-matching-joint-anatella.gif\" alt=\"\" width=\"580\" height=\"335\"><\/a><\/figure>\n<\/div>\n<p>Een ander voordeel van Anatella is de snelheid. Het hele proces verloopt in 14,84 seconden (inclusief de fuzzy matching). Het koppelingsdeel (tot en met stap 1) loopt in 1,58 seconden daar waar de Table Prep Builder er 10 seconden voor nodig heeft.<\/p>\n<hr class=\"wp-block-separator\">\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-14500\" 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\" \/><\/p>\n<h2>Conclusie<\/h2>\n<p>In het kort kunnen we stellen dat de vergelijking van de 2 ETL-tools bij mijn casestudy in het voordeel van Anatella uitviel (het samenvoegen van 2 tabellen met fuzzy matching). Helaas is de fonetische groepering die Table Prep Builder aanbiedt niet aangepast aan de creatie van een koppeling. Ze kan slechts op \u00e9\u00e9n tabel worden toegepast en vereist een handmatige filtering, die niet schaalbaar is.<\/p>\n<p style=\"margin-top: 30px;\">Source: <a href=\"https:\/\/www.intotheminds.com\/blog\/nl\/fuzzy-matching-tableu-prep-builder-en-anatella\/\" target=\"_blank\" rel=\"noopener\">IntoTheMind<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"Hoe maak je een join tussen 2 databases wanneer de entries in het referentieveld niet exact hetzelfde zijn.","protected":false},"author":1,"featured_media":15421,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[736,735],"tags":[750,746,749],"_links":{"self":[{"href":"https:\/\/timi.eu\/nl\/wp-json\/wp\/v2\/posts\/15419"}],"collection":[{"href":"https:\/\/timi.eu\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/timi.eu\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/timi.eu\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/timi.eu\/nl\/wp-json\/wp\/v2\/comments?post=15419"}],"version-history":[{"count":4,"href":"https:\/\/timi.eu\/nl\/wp-json\/wp\/v2\/posts\/15419\/revisions"}],"predecessor-version":[{"id":15434,"href":"https:\/\/timi.eu\/nl\/wp-json\/wp\/v2\/posts\/15419\/revisions\/15434"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/timi.eu\/nl\/wp-json\/wp\/v2\/media\/15421"}],"wp:attachment":[{"href":"https:\/\/timi.eu\/nl\/wp-json\/wp\/v2\/media?parent=15419"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/timi.eu\/nl\/wp-json\/wp\/v2\/categories?post=15419"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/timi.eu\/nl\/wp-json\/wp\/v2\/tags?post=15419"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}