View on GitHub

Data Scopes workshop materials

Data Scopes Workshop, 2-30 September 2019

Workshop Home | Algemeen | Dag 1 | Dag 2 | Dag 3 | Dag 4 | Dag 5 | Data Scopes Home |

TvG Opdracht deel 1: Greppen in TvG Data

Eerdere delen TvG opdracht:

Introductie

Met deze opdracht ontwikkel je de volgende vaardigheden:

De TvG Dataset is groot en beperkt gestructureerd. Er liggen talloze inzichten verborgen in de 121 jaargangen, maar de bestaande structuur geeft weinig handvatten om die inzichten naar voren te halen. Hoe kun je van deze brondata een data scope creeeren die verschillende perspectieven op het TvG corpus biedt waarmee je op een transparante manier tot nieuwe inzichten komt?

Open een document voor het bijhouden van data interacties om tot data scope te komen en overwegingen daarbij. Gebruik bij voorkeur het Jupyter notebook of een nieuw Google Doc in de workshop drive folder op Google Drive, zodat alle aantekeningen bij elkaar staan zodat we die aan het eind de dag makkelijk kunnen vergelijken.

Welke tool ga ik gebruiken?

Om de opdrachten uit te voeren dien je in te loggen op de Jupyter Hub omgeving van het Humanities Cluster. Het is handig om dit in een aparte browser tab te open. Als je ingelogd bent kun je kiezen om de opdrachten uit te voeren via:

Data downloaden

Research focus: wat ga ik onderzoeken?

Wat is mijn onderzoeksvraag of thema?

Probeer eerst vast te stellen wat je wilt onderzoeken. Wat voor mogelijk e.g. historiografische inzichten verwacht je in het TvG corpus te kunnen vinden? De ervaring leert dat je dit tijdens het onderzoeksproces nog regelmatig zal herzien. Initiele aannames en verwachtingen blijken vaak niet goed genoeg op het bestaande materiaal aan te sluiten, waardoor je een onderzoeksvraag wilt aanpassen of over wilt stappen naar een compleet andere vraag.

Het is vaak inzichtelijk en leerzaam om die momenten van bijsturen en compleet van richting veranderen vast te leggen. Niet alleen hoe je van richting verandert, maar ook waar, wanneer en waarom. Welke stap in het proces en welk aspect van de data leiden tot zo’n verandering?

Selectie

Welke informatie uit TvG is daarbij relevant? Zijn alle jaargangen relevant (voor e.g. temporeel onderzoek), of slechts een subset. Of kun je dat van te voren nog niet vaststellen?

Welke jaargangen, pagina’s zeggen iets over mijn onderzoeksvraag/thema? Tijdens het creeeren van een data scope wil je wellicht specifieke edities, individuele pagina’s of pagina-reeksen selecteren om op in te zoomen. Houd bij welke selecties je maakt.

Modelleren

Hoe vertaal ik onderzoeksvragen en methoden naar data interacties?

Dit is een cruciale vraag en vergt continue reflectie op het proces. Voortschreidend inzicht tijdens het proces van data bevragen, bewerken en analyseren leidt tot aanpassingen in eerdere stappen.

Hoe representeer ik relevante informatie in mijn brondata?

Bij het vertalen van je onderzoeksvraag naar data interacties om die vraag te adresseren, moet je keuzes maken over wat voor soort informatie je uit de data wilt halen, hoe je dat kunt doen en wat de consequenties van je keuzes is:

Grip met grep: zoeken in data met behulp van reguliere expressies

grep is een UNIX command line tool waarmee je kunt zoeken in data-bestanden naar regels die matchen met een reguliere expressie (Globally search a regular expression and print).

Eerst wat uitleg over de command line en hoe je navigeert naar verschillende mappen of directories op je harde schijf en andere aangesloten opslagmedia.

De volgende handige grep cheat sheet geeft een overzicht van alle opties, parameters en patronen je kunt gebruiken in grep. Dit is vooral handig als je eenmaal op weg met onderstaande oefeningen en verschillende opties en concepten hebt leren kennen.

Let op: de oefeningen worden al heel snel heel complex. Dit is puur om te laten zien wat mogelijk is, en waarom dit nuttig kan zijn. De syntax is cryptisch en exotisch en vergt veel oefening om het je eigen te maken. Als je het nuttig vindt kun je er dus meer tijd in steken en wordt de systematiek al snel duidelijk. Als je hier niet zelf mee aan de slag wil, is het in ieder geval nuttig om te zien hoe het werkt, wat er mogelijk is, en waar potentiele problemen in de data een rol spelen.

Command line: interactie via commando’s

De command line is een alternatieve manier om te interacteren met de computer. I.p.v. opdrachten geven met de muis, geef je via de command line opdrachten d.m.v. tekstuele commando’s. Alhoewel dit voor veel mensen wennen is aan ongebruikelijke notatie en de onverbiddelijke precisie die vereist is, heeft het ook een aantal voordelen:

Voor transparant werken met data is het belangrijk en waardevol om uitgevoerde opdrachten bij te houden en te kunnen delen (ook met jezelf op een later tijdstip).

Belangrijke tip: met de ↑ en ↓ toetsen kun je eerder uitgevoerde commando’s terughalen, zodat je makkelijk kunt herhalen en aanpassingen kunt doen.

Om onderstaande oefeningen te doen is het handig te navigeren naar de directory waar je de TvG data hebt opgeslagen. De directory-structuur is een zogenaamde boom structuur, met een enkele stam (root) en een of meer vertakingen. In UNIX omgevingen is / het symbool voor de root directory, /home is de home directory binnen de root directory. Directories binnen andere directories (sub-directories) zijn vertakingen binnen vertakingen. Zo is je persoonlijke directory die overkomt met je gebruikersnaam een subdirectory van /home. Je kunt o.a. navigeren tussen directories via de vertakingen.

Overzicht maken van varianten en contexten voor specifieke woorden en frases

Navigeer naar de directory waar je de TvG data hebt opgeslagen. Controleer dat je op de juiste plek bent door ls te typen. Als je de directories tvg_1 etc. ziet staan ben je in de juiste directory. Zo niet, type dan pwd en vergelijk je huidige working directory met waar de data staat.

Op de juiste plek aangekomen, kun je nu grep uitvoeren om naar patronen in de data te zoeken. Als eerste oefening, zoek voorkomens van het woord politiek in alle bestanden van de 111de editie:

grep "politiek" tvg_data/tvg_111/*.txt

Je krijgt een lijst te zien van alle regels (lines) van de verschillende bestanden waarin de tekststring politiek voorkomt. Aan het begin van elke regel toont grep de naam van het bestand waarbinnen de regel gevonden is (een match).

Dit is ietwat onoverzichtelijk. Je kunt grep opdracht geven om het deel van de regel dat matched met je patroon in kleur weer te geven, zodat je sneller ziet wat de match is. Dit kan met de parameter --color of --colour:

grep --color "politiek" tvg_data/tvg_111/*.txt

Je ziet nu dat grep ook regels vindt waarin politiek een onderdeel is van een woord, zoals politieke en bouwpolitiek. Je kunt de parameter -w gebruiken om aan te geven dat grep alleen moet matchen met hele woorden (e.g. alleen als politiek het hele woord is). Opmerking: het is gebruikelijk om alle parameters direct achter het grep commando te plaatsen, zodat je makkelijk kunt zien welke parameters gebruikt zijn. In de opdrachten hier beneden zul je zien dat er veel verschillende parameters zijn, en je vaak wil je er meerdere combineren. Dan is het handig om ze te groeperen, aan het begin of aan het eind van het commando.

grep --color -w "politiek" tvg_data/tvg_111/*.txt

Je vraagt je wellicht af hoe grep weet wat hele woorden zijn. Dat wordt duidelijk na een aantal opdrachten hier beneden.

Standaard maakt grep een onderscheid tussen hoofdletters en kleine letters. Als je wilt zoeken zonder hoofdlettergevoeligheid, kun je de -i parameter gebruiken:

grep --color -w -i "politiek" tvg_data/tvg_111/*.txt

Net als met CTRL-F kun je met grep ook naar frases van meerdere woorden zoeken:

grep --color -w -i "binnenlandse politiek" tvg_data/tvg_111/*.txt

Om reguliere expressies te gebruiken kun je de parameter -E toevoegen (voor extended regular expression). Hiermee interpreteert grep het opgegeven patroon als een reguliere expressie i.p.v. een letterlijke string. Eerst wordt het zoekpatroon uitgebreid naar alle woorden die beginnen met politiek, eventueel gevolgd worden door 1 of meer letters (aangegeven met \w*.) De \w staat voor alles wat alfanumerisch is (letters en cijfers), de * staat voor nul, een of meer keren herhaald:

grep -E --color -w -i "politiek\w*" tvg_data/tvg_111/*.txt

Dit is vergelijkbaar met zoeken a.d.h.v. een zgn. wildcard, e.g. politiek*. Het voordeel van reguliere expressies is dat je meer controle hebt over wat er op de plaats van het wildcard mag staan. Als je de * vervangt door een +, matched grep alleen met woorden die beginnen met politiek en gevolgd worden door tenminste een maar mogelijk meer alfanumerische karakters:

grep -E --color -w -i "politiek\w+" tvg_data/tvg_111/*.txt

De kracht van reguliere expressies wordt hieronder steeds duidelijker gemaakt. Je kunt bijvoorbeeld ook preciezer aangeven hoeveel extra karakters er moeten volgen, met behulp van accolades. E.g \w{2,15} betekent minimaal 2 en maximaal 15 extra alfanumerische karakters:

grep -E --color -w -i "politiek\w{2,15}" tvg_data/tvg_111/*.txt

Je kunt ook alleen een minimum aangeven (e.g. {2,}) of alleen een maximum (e.g. {,15}).

Wat met wildcards vaak niet mogelijk is, is ze plaatsen aan het begin van een woord. E.g. om te zoeken naar alle woorden die eindigen op politiek kun je de expressie \w+ ervoor plaatsen:

grep -E --color -w -i "\w*politiek" tvg_data/tvg_111/*.txt

Hiermee zie je voorkomens van verschillende vormen van politiek. Uiteraard kun je ook zoeken naar alle woorden die politiek bevatten aan het begin, midden of einde van een woord:

grep -E --color -w -i "\w*politiek\w*" tvg_data/tvg_111/*.txt

Je kunt nog veel complexere patronen definieren met reguliere expressies. Verderop staan oefeningen voor het zoeken naar namen, jaartallen en datums. Een andere mogelijkheid is het zoeken naar bijv. woorden die voorafgaan aan een woord dat matched met politiek. Door \w+ te plaatsen voor \w*politiek\w* krijg je nu ook het voorafgaande woord te zien:

grep -E --color -w -i "\w+ \w*politiek\w*" tvg_data/tvg_111/*.txt

Ook twee woorden vooraf is mogelijk:

grep -E --color -w -i "\w+ \w+ \w*politiek\w*" tvg_data/tvg_111/*.txt

Een generiekere manier is om meerdere herhalingen te definieren. Je kunt een subpatroon definieren door het te plaatsen binnen parentheses, e.g. (\w+ ). Voor dit subpatroon kun je aangeven of het bijvoorbeeld nul of een keer mag voorkomen ((\w+ )?), een of meer keer ((\w+ )+), nul, een of meer keer ((\w+ )*), precies vijf keer ((\w+ ){5}) of maximaal drie keer ((\w+ ){,3}):

grep -E --color -w -i "(\w+ ){,3}\w*politiek\w*" tvg_data/tvg_111/*.txt

Ketens van commando’s: pipelines, sorteren en tellen

Met flexibele patronen wordt de lijst matches al snel erg lang en gevarieerd. Om beter zicht te krijgen op de verschillende matchende patronen, kun je grep ook opdracht geven om niet de hele regels, maar alleen de matchende delen te tonen, met de parameter -o:

grep -E --color -o -w -i "\w*politiek\w*" tvg_data/tvg_111/*.txt

Voor exploratie van een grote dataset kan het handig zijn om de gevonden patronen te sorteren en tellen, zodat je een beeld krijgt welke patronen veel en welke weining voorkomen. Voordat je dat doet is het handig om de output van grep nog zo aan te passen dat de bestandsnamen niet meer getoond worden, zodat echt alleen de matchende patronen getoond worden. Daarna is sorteren en tellen simpel. Je kunt de bestandnamen laten verbergen met de -h parameter:

grep -E -h -o -w -i "\w*politiek\w*" tvg_data/tvg_111/*.txt

UNIX biedt een eenvouig maar zeer krachtig mechanisme om de output van het ene commando direct door te sturen als input voor het volgende commando, d.m.v. zogenaamde pipes. Als je het | symbool plaatst aan het eind van het grep commando, wordt de output van grep, e.g. alle matchende patronen, doorgestuurd naar een volgend commando. Dit wordt ook wel redirection genoemd.

Je kunt bijvoorbeeld het wc (word, line, character and bye count) commando gebruiken om te tellen hoeveel matches er zijn:

grep -E -h -o -w -i "\w*politiek\w*" tvg_data/tvg_111/*.txt | wc -l

De -l parameter telt het aantal regels (lines). Met -w telt wc het aantal woorden, met -m het aantal karakers.

Het sort commando sorteert input en toont de gesorteerde output weer op het scherm. Standaard sorteert sort alfabetisch in oplopende volgorde, maar je kunt ook numerisch sorteren en in aflopende volgorde. Dit ga net als met grep a.d.h.v. parameters. Voor nu volstaat dat standaard sortering:

grep -E -h -o -w -i "\w*politiek\w*" tvg_data/tvg_111/*.txt | sort

De meeste matches zijn voor de woorden politiek en politieke. Om een lijst van de unieke patronen te zien, kun je de output van sort doorsturen naar het commando uniq die bij opeenvolgende regels met exact dezelfde inhoud alleen de eerste laat zien:

grep -E -h -o -w -i "\w*politiek\w*" tvg_data/tvg_111/*.txt | sort | uniq

Met wederom een parameter kun je uniq laten tellen hoe vaak elk patroon voorkomt, e.g. -c voor count:

grep -E -h -o -w -i "\w*politiek\w*" tvg_data/tvg_111/*.txt | sort | uniq -c

Deze lijst kun je ook weer sorteren:

grep -E -h -o -w -i "\w*politiek\w*" tvg_data/tvg_111/*.txt | sort | uniq -c | sort

Nog een handige vorm van redirection is de output schrijven naar een bestand, zodat het niet slechts tijdelijk op je scherm getoond wordt, maar blijvend wordt opgeslagen. Zeker als er veel output gegenereerd wordt is een bestand handig. Redirection naar een bestand doe je a.d.h.v. het > symbool. Aan het eind van de keten van commando’s kun je > bestandsnaam typen om het naar een bestand te schrijven:

grep -E -h -o -w -i "\w*politiek\w*" tvg_data/tvg_111/*.txt | sort | uniq -c | sort > tvg_111-matches-politiek.txt

Uiteraard kun je bestanden met opgeslagen resultaten weer verder bewerken en analyseren met grep en andere commando’s, of in andere programma’s. TODO schrijven naar bestand

Zoeken naar woordensets

Reguliere expressies bieden ook een mogelijkheid om meerdere opties van patronen te definieren, met parentheses en het keuze symbool |. Zo betekent (januari|februari|maart): match met alle regels waarin het woord januari voorkomt, of het woord februari of maart. Zo kun je dus naar voorkomens van maanden zoeken, , of bijvoorbeeld sets van woorden die kwa onderwerp dicht bij elkaar liggen, zoals overheid, regering en kabinet:

grep -E -o -w -i "\w*(overheid|regering|kabinet)\w*" tvg_data/tvg_111/*.txt | sort | uniq -c

In oudere teksten kom je vaak dubbele klinkers tegen, zoals in regeering. Als je zoekt in TvG editie 49 (jaargang van 1934), kun je ook regeering toevoegen:

grep -E -o -w -i "\w*(overheid|regeering|regering|kabinet)\w*" tvg_data/tvg_49/*.txt | sort | uniq -c

De alternatieven regering en regeering kun je ook korter noteren door de variatie ee en e aan te geven:

grep -E -o -w -i "\w*(overheid|reg(ee|e)ring|kabinet)\w*" tvg_data/tvg_49/*.txt | sort | uniq -c

Afhankelijk van je onderzoeksfocus, kun je zelf woordenset en contexten definieren om het corpus te doorzoeken en analyseren. Hou bij welke woorden, sets en contexten je definieert, en sla eventuele resultatenlijsten op in aparte bestanden. Hou in een Google Document bij wat je bevindingen zijn, zodat we die in de discussie kunnen vergelijken.