Download Bijlage

De dataset die we voor deze blogpost gebruiken is er eentje met 27156 rijen en bevat de Engelstalige naamgevingen van enkele landen. In de dataset zijn er initieel 146 unieke waarden aanwezig, die we doorheen deze blogpost zullen trachten op te schonen. Het is dan ook opmerkelijk dat door onderstaande stappen te volgen, we onze data kunnen reduceren tot 122 unieke waarden.

Installatie en opstarten OpenRefine

Ga naar http://openrefine.org

afb1

Wanneer Java reeds geïnstalleerd is op uw computer: Kies 'Windows Kit'
Zo niet: Kies 'Windows kit with embedded Java'

afb2

Download het zip bestand en pak deze ergens uit. Open vervolgens de ‘openrefine’ en klik op openrefine.exe om deze op te starten.

afb3

Gebruik van OpenRefine

afb4

Geef een toepasselijke project naam en druk vervolgens op ‘create project’

afb5

<info>
Om meer rijen te zien kan je op het aantal rijen om weer te geven veranderen naar een grotere waarde: in de afbeelding hieronder staat deze bvb op 500.

Klik vervolgens op de kolom waarvan u de datakwaliteit van wilt verhogen. In ons geval is er maar 1 kolom aanwezig in de dataset, namelijk LAND. Ga in het dropdown menu naar ‘Edit Cells’ en kies vervolgens de optie ‘Cluster and edit…’

afb6

Er zijn verschillende vergelijkingsmethoden in OpenRefine aanwezig om tekstitems te vinden die op elkaar lijken maar niet identiek zijn. De twee strings "Cameroun” en "Cameroon" verwijzen bijvoorbeeld zeer waarschijnlijk naar hetzelfde land maar hebben enkel een net iets wat andere schrijfwijze.

Het groeperen van deze tekstitems wordt ook wel eens ‘clustering’ genoemd, en is een term waar ook OpenRefine gebruik van maakt in zijn software. In OpenRefine wordt er van uit gegaan dat elke bewerking op een clustering, altijd moet goedgekeurd worden door de gebruiker. Om de gebruiker te helpen, geeft OpenRefine ook steeds een voorstel waarvan hij denkt dat dit de data opschoont. De gebruiker kan vervolgens selecteren welke versie te behouden en toe te passen op alle overeenkomende cellen (of  de gebruiker typt zijn eigen versie in).

Daarnaast zal OpenRefine achter de schermen een aantal ‘data cleaning’-operaties uitvoeren om zijn analyse te kunnen doen. Inzicht in die verschillende opruimingen achter de schermen kunnen de gebruiker helpen te kiezen welke clustermethode nauwkeuriger en effectiever zal zijn. Daarvoor kan u terecht binnen enkele andere van onze blogposts.

Echter, de gebruiker hoeft de details achter elke clustermethode niet te begrijpen om ze met succes op uw gegevens toe te passen. De volgorde waarin deze methoden in de interface en op deze pagina worden gepresenteerd is de volgorde die door OpenRefine wordt aanbevolen - beginnend met methoden met zeer strikte regels, tot methoden die wat lakser zijn en die dus wel meer menselijke supervisie vereisen om correct toe te passen.

OpenRefine biedt een verscheidenheid aan clustering methoden:

  • Key Collision
    • fingerprint
    • ngram-fingerprint
    • metaphone3
    • cologne-phonetic
    • Daitch-Mokotoff
    • Beider-Morse
  • Nearest Neighbor
    • levenshtein
    • ppm

Key collision : fingerprint:

Deze methode heeft  de minste kans om ‘false positives’ terug te geven en vormt zodus een goede methode om van start mee te gaan. We spreken van een ‘false positive’ wanneer OpenRefine aangeeft dat twee strings waarschijnlijk hetzelfde zijn, terwijl dat in werkelijkheid niet zo is.

Achter de schermen worden de gegevens opgeschoond door volgende acties toe te passen:

  • witruimte omzetten in enkele spaties
  • zet alle hoofdletters in kleine letters
  • interpunctie verwijderen
  • diakritische tekens (bv. accenten) uit karakters verwijderen
  • splits alle reeksen (woorden) op en sorteer ze alfabetisch (dus "Zhenyi, Wang" wordt "wang zhenyi").

In onderstaande afbeelding is zo te zien dat het tekstitem ‘POLAND’ en ‘¿POLAND’ met deze methode gevonden wordt door het verwijderen van diakritische tekens.

Om het record met ‘¿POLAND’ te vervangen met ‘POLAND’, hoeft de gebruiker enkel de ‘Merge?’ checkbox aan te vinken en OpenRefine heeft reeds op basis van de dataset het voorstel gedaan om ‘POLAND’ te kiezen als vervangwaarde.

Om de wijziging toe te passen, klikt de gebruiker tot slot op de ‘Merge Selected & Re-Cluster’

afb7

NGram-Fingerprint:

N-gram fingerprinting laat de gebruiker toe de ‘Ngram-size’ in te stellen en afhankelijk van welk getal de gebruiker kiest, zal deze verschillend gedrag tot gevolg hebben:

Bijvoorbeeld, een 1-gram vingerafdruk zal eenvoudig alle letters in de cel in alfabetische volgorde zetten - door segmenten te maken van één karakter lang. Een 2-grams vingerafdruk zal alle segmenten van twee karakters vinden, duplicaten verwijderen, ze alfabetiseren, en ze terug samenvoegen (bijvoorbeeld, "banaan" genereert "ba an na aa an," wat "aanbana" wordt).

Dit kan helpen bij het matchen van cellen met typefouten of onjuiste spaties (zoals het matchen van "Verenigde Staten" en "Verenigdestaten", wat fingerprinting zelf niet zal identificeren omdat het woorden scheidt). Hoe hoger de n-waarde, hoe minder clusters zullen worden geïdentificeerd. Let bij 1-grammen op verkeerd gematchte waarden die bijna-anagrammen van elkaar zijn (zoals "Wellington" en "Elgin Town").

Voor de dataset waar we in deze blogpost van gebruik maken, zijn de beste resultaten terug te vinden door de Ngram Size gelijk te stellen aan één.

Vervolgens passen we opnieuw de stappen toe we reeds eerder toepasten in de eerste fingerprint methode.

afb8

Fonetisch Clusteren

De volgende vier methoden zijn fonetische algoritmen: ze identificeren letters die hetzelfde klinken als ze hardop worden uitgesproken, en beoordelen op basis daarvan tekstwaarden (zoals weten dat een woord met een "K" een fout-type kan zijn van een woord met een "C"). Ze zijn zeer geschikt om fouten op te sporen die worden gemaakt doordat men de spelling van een woord of naam niet kent nadat men het hardop heeft horen uitspreken. Aangezien onze data betrekking heeft tot plaatsnamen, is het dan ook te verwachten dat deze methoden tot mooie resultaten kunnen leiden.

Methaphone 3:

Metaphone3 fingerprinting is een fonetisch algoritme specifiek voor de Engelse taal. Bijvoorbeeld, "Reuben Gevorkiantz" en "Ruben Gevorkyants" hebben dezelfde fonetische vingerafdruk in het Engels.

afb9

Cologne phonetic:

Cologne fingerprinting is een ander fonetisch algoritme, maar dan voor de Duitse/Nederlandse uitspraak.

Interessant om aan te kaarten in onderstaande afbeelding, is dat het belangrijk is om toch de suggestie die OpenRefine maakt te valideren. Oorspronkelijk werd ‘NETHERLAND’ voorgesteld, op basis van de manier waarop ‘Nederland’ is onze dataset werd voorgesteld, maar eigenlijk weten we dat de Engels vertaling ‘Netherlands’ is en passen we dit idealiter manueel aan.

afb10

Daitch-mokotoff:

Daitch-Mokotoff is een fonetisch algoritme voor Slavische en Jiddische woorden.

Aangezien onze dataset hoofdzakelijk uit Engelse woorden  bestaat, is het dan ook niet te verwonderen dat er weinig relevante clusters worden gevonden.

afb11

Beider-Morse:

Baider-Morse is een versie van Daitch-Mokotoff die zelfs nog net iets strengere regels hanteert. In de dataset van deze blogpost werd er dan ook geen enkele relevante cluster gevonden.

afb12

 

Nearest Neighbour algoritmen :

Over het algemeen zijn Neighbour-clusteringmethoden langzamer dan fingerprintmethoden.

Zij staan de gebruiker toe een radius in te stellen - een drempel voor overeenkomen of niet overeenkomen. OpenRefine gebruikt eerst een "blocking" methode, die waarden sorteert op basis van of ze een bepaalde mate van overeenkomst hebben (de standaardwaarde is "6" voor een tekenreeks van zes identieke tekens) en dan de nearest-neighbour operaties uitvoert op die gesorteerde groepen.

Er wordt aangeraden  om het bloknummer op minstens 3 in te stellen, en het dan te verhogen als het algoritme strenger moet zijn.

Het vergroten van de straal zal de overeenkomsten lakser maken, omdat grotere verschillen zullen worden geclusterd. Wanneer men Block Chars verhoogt bekomt men minder clusters.

Levenshtein: Radius 1 Block Chars 6: <Default>

afb13

Met aanpassingen -> Block Chars = 3

afb14

Met aanpassingen -> Block = 6 <default> en Radius = 3

afb16

 

Extra: Het behandelen van ongeldige records

Wanneer we alle clusteringsmethoden hebben toegepast op onze dataset, en we merken dat er ‘ongeldige’ records aanwezig zijn in de data, kan het interessant zijn om deze te vervangen door lege cellen. Op die manier kunnen andere tools in de toekomst hier ook verder op in spelen.

afb17

 

Vergelijking van initiële en opgeschoonde dataset.

afb18

We kunnen de historiek van onze acties terugvinden in de Undo/Redo. We kunnen constateren dat onze acties meer dan 7000 cellen heeft beïnvloed en dat onze data kwaliteit aanzienlijk is verbeterd.

We kunnen dit ook valideren door te kijken naar de unieke waarden die terug te vinden is de kolom:

afb19

afb20

Terwijl dit oorspronkelijk het volgende was:

afb21

Voorlopig zijn de aanpassingen enkel aangebracht binnen het hoofdgeheugen van OpenRefine kiezen we rechtsboven voor ‘Export’.
Om onze aanpassingen op te slaan:

afb22