• No results found

Wijzigingen, continuiteit en lexicale veranderingen in 198 jaar troonredes

N/A
N/A
Protected

Academic year: 2021

Share "Wijzigingen, continuiteit en lexicale veranderingen in 198 jaar troonredes"

Copied!
27
0
0

Bezig met laden.... (Bekijk nu de volledige tekst)

Hele tekst

(1)

Wijzigingen, continu¨ıteit en

lexicale veranderingen in 198 jaar

troonredes

M.J.J. Meijerink

10560459

Bachelor thesis Credits: 12 EC

Bachelor Opleiding Informatiekunde University of Amsterdam Faculty of Science Science Park 904 1098 XH Amsterdam Supervisor Dr. M. J. Marx ILPS, IvI Faculty of Science University of Amsterdam Science Park 904 1098 XH Amsterdam 2016-06-20

(2)

Inhoudsopgave

1 Introductie 4

1.1 Waarom past dit onderzoek binnen de informatiekunde? . . . 4

1.2 Onderzoeksvraag en deelvragen . . . 5

1.3 Inhoud van de thesis . . . 5

2 Gerelateerd Werk 5 3 Methodologie 7 3.1 Beschrijving van de data . . . 7

3.2 Methodes . . . 7

3.2.1 Wat zijn relevante termen voor het onderzoek in het troon-rede corpus? . . . 7

3.2.2 Wat voor indeling moet worden gebruikt voor het tijds-bestek waarin de troonredes zijn geschreven? . . . 10

3.2.3 Hoe worden de semantische categorie¨en om deze termen in te delen bepaald? . . . 11 4 Evaluatie 15 4.1 Reproduceerbaarheid . . . 15 4.2 Relevante termen . . . 15 4.3 Periodisering . . . 17 4.4 Semantische categorie¨en . . . 17

4.5 Hoe worden deze categorie¨en geanalyseerd om lexicale continu¨ıteit of verandering te identificeren? . . . 18

5 Conclusies 18 5.1 Reflectie . . . 18

5.2 Dankbetuiging . . . 19

6 Appendices 21 A Het verwerken van de troonredes. . . 21

B Het selecteren van de 1000 termen. . . 22

C Regels voor het vinden van verkeerd gespelde woorden. . . 22

D Het vinden van de periodes in de troonrede corpus. . . 23

E Het maken van de co-occurrence matrices. . . 24

F Het berekenen van de proximity netwerken. . . 25

G Het berekenen van de similarity tussen categorie¨en in opeenvol-gende periodes. . . 26

(3)

Samenvatting

Dit artikel voert een onderzoek uit op de gedigitaliseerde troonrede corpus van 1818 tot 2015. Deze troonredes bieden een omvangrijke hoe-veelheid informaite. Het onderzoek dat wordt uitgevoerd is grotendeels gebaseerd op een soortgelijk onderzoek van Rule et al. uitgevoerd op de State of the Union corpus[1]. Het doel van het onderzoek is om bete-kenisvolle categorie¨en te identificeren in 191 jaar troonredes door middel van natural language processing methodes, co-occurrence van termen en community detection in co-occurrence netwerken. Ons onderzoek laat bij-voorbeeld zien dat na de tweede wereld oorlog het Nederlandse koloniale rijk uiteen viel. Dit soort bevindingen verifi¨eren dat de strategie ontwik-keld door Rule et al. daadwerkelijk werkt voor het analyseren van corpora die spannen over een lange tijdperiode, waarbij de betekenis van termen, concepten en taalgebruik veel veranderen.

(4)

1

Introductie

Rule et al.[1] doen een uitgebreid onderzoek naar de verandering in de Ame-rikaanse politiek op basis van alle (zo’n 200 jaar) State of the Unions. Het artikel geeft een unieke kijk op de Amerikaanse politieke geschiedenis. Rule et al. hebben een strategie ontwikkeld om belangrijke onderwerpen te destilleren uit veel tekst verspreid over een lange tijdsperiode. De strategie houdt rekening met het feit dat concepten en taalgebruik veranderen door de jaren heen. In essentie weerspiegelt de State of the Union de onderwerpen/problemen die het Amerikaanse publiek belangrijk vindt. Het doel van het onderzoek is om aan te tonen dat de State of the Union een unieke reflectie kan geven op het po-litieke landschap van Amerika en een uitgangspunt bied om argumenten over de origine van belangrijke veranderingen in de Amerikaanse politiek te herzien. Het artikel geeft een samenvattend beeld van Amerikaanse politiek gebaseerd op analyse van de State of the Unions. Hierbij wordt een strategie ontwikkeld die belangrijke onderwerpen kan identificeren in teksten die over een lange tijdsduur verspreid zijn. De verschillende onderwerpen worden daarna verder bestudeerd en gevisualiseerd.

Om de State of the Unions te analyseren gebruiken Rule et al. verschillende technieken, waaronder natural language processing technieken om relevante ter-men uit de State of the Union corpus te destilleren. De corpus wordt opgedeeld in periodes en daarna wordt per periode een co-occurrence matrix gemaakt. Op deze matrix wordt een proximity score losgelaten die valt onder de categorie van difference weighted mutual information modellen. Dit levert een netwerk op dat gebruikt kan wordt om een louvain community detection algoritme op toe te pas-sen. Dit algoritme identificeert semantische categorie¨en. Aan de hand van deze categorie¨en maken worden zo river networks en een stacked area chart gemaakt die het verschil tussen categorie¨en in opeenvolgende periodes weergeven.

De State of the Union is de Amerikaanse equivalent van onze troonredes. In dit artikel worden gedigitaliseerde troonredes vanaf 1818 gebruikt. Voor de troonredes kan dezelfde analyse uitgevoerd worden als voor het voorgenoemde artikel doet met de State of the Unions. Dit wordt gedaan met dezelfde technie-ken als genoemd in de vorige paragraaf. Aan de hand van deze troonredes kun-nen een aantal interessante vragen worden gesteld. Hoe is de rol van de overheid veranderd door de tijd heen? Welke en wat voor fases kunnen ge¨ıdentificeerd worden voor de Nederlandse politieke geschiedenis? Welke onderwerpen kunnen ge¨ıdentificeerd worden in de troonredes? Wat is de beste manier om zo’n grote hoeveelheid tekst te verwerken en classificeren?

1.1

Waarom past dit onderzoek binnen de informatiekunde?

Dit soort onderzoek past goed in het kader van informatiekunde, het gaat hier om een grote hoeveelheid data waar men zonder informatieverwerkingstechnie-ken zoals natural language processing niet veel mee kan. Door methodes die we tijdens de studie geleerd hebben toe te passen op deze data kan er informatie uit gehaald worden en kan er over deze informatie geredeneerd worden.

(5)

1.2

Onderzoeksvraag en deelvragen

De onderzoeksvraag is als volgt:

Wat voor belangrijke veranderingen en continu¨ıteit kunnen gevonden worden in 198 jaar troonredes, rekening houdend met de lexicale veranderingen?

Mijn onderzoeksvraag is onderverdeeld in de volgende deelvragen:

DV1 Wat zijn relevante termen voor het onderzoek in het troonrede corpus? 1. Welke termen zijn relevant?

2. Wat is de invloed van de veranderingen in spelling?

DV2 Wat voor indeling moet worden gebruikt voor het tijdsbestek waarin de troonredes zijn geschreven?

DV3 Hoe worden de semantische categorie¨en bepaald om deze termen in te delen?

DV4 Hoe worden deze categorie¨en geanalyseerd om lexicale continu¨ıteit of ver-andering te identificeren?

1.3

Inhoud van de thesis

Begonnen wordt met het beschrijven van relevante literatuur over zowel de troonredes die worden geanalyseerd als de methodes die hiervoor gebruikt wor-den, zie sectie 2. In sectie 3 volgt een beschrijving van de verzamelde troonredes en eventuele bijzonderheden. Vervolgens wordt het analyse proces stap voor stap beschreven aan de hand van de deelvragen. Afsluitend volgt een evaluatie van het onderzoek in sectie 4 en een conclusie, sectie 5.

2

Gerelateerd Werk

Mijn onderzoek wordt op ruwweg dezelfde manier uitgevoerd als het onder-zoek van Rule et al., waar ze de lexicale veranderingen en continu¨ıteit van de State of the Union corpus hebben geanalyseerd. Dit is niet de eerste keer dat er onderzoek gedaan is naar de troonrede corpus. De oprichters van https: //www.localfocus.nl/ hebben voor de gehele corpus een aantal categorie¨en ge¨ıdentificeerd. Deze categorie¨en zijn gevisualiseerd zodat per categorie te zien is hoe groot de impact van de categorie is per jaar[2]. Verder is er weinig onder-zoek gedaan naar onderwerpen in de troonrede corpus. Wel is er een master the-sis onderzoek gedaan waarbij metaforen in crithe-sisperiodes worden geanalyseerd om te kijken wat de functie van deze metaforen is[3]. E´en van de oprichters van http://www.troonredes.nl/, P. Lagas, heeft een dissertatie geschreven: ’Besturen op de rand van chaos’[4]. In deze dissertatie gebruikt hij troonredes om te weten te komen wat erin gezegd wordt op het terrein van veiligheid, zijn conclusie daarbij is dat troonredes compacte dia’s van de ’tijd’ representeren.

Een belangrijk onderdeel van dit onderzoek is het vinden van co-occurrence frequenties van zelfstandige naamwoorden in paragrafen. Er zijn verschillende manieren om dit te doen, Matsuo et al.[5] bijvoorbeeld geven een algoritme

(6)

voor het vinden van sleutelwoorden in een document door co-occurrence van termen te vergelijken met de meest voorkomende termen. Deze co-occurrence scores worden gebruikt om de belangrijkheid van een term te identificeren. De methode heeft succes met betrekking tot het identificeren van het belang van woorden vergelijkbaar met de tf-idf methode zonder dat er een corpus bij komt kijken. Aan de hand van tf-idf scores wordt duidelijk hoe belangrijk termen in een tekst zijn[6]. In een artikel van M. Callon, J.P. Courtial, F. Laville[7] worden een aantal co-occurrence technieken ontwikkeld die het netwerk van interacties tussen academisch en technologisch onderzoek beschrijven. In het artikel worden publicaties van de twee onderzoeksvelden geanalyseerd over een periode van vijf jaar.

Het grootste probleem voor het onderzoek dat in zowel dit paper als het artikel van Rule et al. wordt uitgevoerd is de lange tijdsbestek die het corpus behelst. Rule et al. zijn een van de eersten die een goede Natural Language Processing (NLP) strategie ontwikkeld hebben die rekening houdt met tijd. En zoals Grimmer et al.[8] zeggen is het gevaarlijk om geautomatiseerde methodes toe te passen in dit soort onderzoek. In het artikel van Grimmer et al. wordt uitgelegd hoe het proces van het analyseren van politieke teksten aangepakt zou kunnen worden, daarnaast wordt gesteld dat onderzoekers hun nieuwe methodes en validatiemethodes moeten bijdragen om toekomstig onderzoek te kunnen automatiseren. Grimmer et al. houden in hun onderzoek nog geen rekening met tijd.

Er wordt ook veel gebruik gemaakt van populaire topic modelling methodes zoals Laten Dirichlet Allocation[9] (LDA). Hierbij wordt vertrouwd op waar-schijnlijkheidsmodellen modellen gebaseerd op woorddistributie over het corpus om relevante categorie¨en in de tekst te onderscheiden. Hierbij zijn categorie¨en ongestructureerd en bestaan ze uit termen die gewogen zijn aan de hand van de kans dat ze voorkomen als een categorie aangehaald wordt. Een belangrijk kritiekpunt op deze populaire methode is dat de ge¨ıdentificeerde categorie¨en niet altijd even duidelijk zijn[10]. Bij LDA is het onduidelijk of categorie¨en wel altijd passen bij de data. Verder is het moeilijk te beslissen hoeveel categorie¨en ge¨ıdentificeerd moeten worden[11]. Nieuwere topic modelling methodes kijken ook naar hoe categorie¨en van elkaar afhankelijk zijn[12] en hoe externe variabe-len, waaronder tijd, van invloed zijn op de categorie¨en[13, 14]. Veel van deze me-thodes borduren voort op LDA en andere traditionele topic modelling meme-thodes. Een voorbeeld van een algoritme dat rekening houdt met de tijd is het topics-over-time (ToT) algoritme. Dit algoritme detecteert categorie¨en die verschillen van tijdsprofiel in gedateerde corpora, hierdoor is het ToT-algoritme bruikbaar voor het detecteren van semantische reacties op historische gebeurtenissen[15]. Echter is het ToT algoritme niet bruikbaar om te identificeren hoe de woorden waaruit een categorie bestaat door de tijd heen veranderen.

In dit onderzoek wordt gebruik gemaakt van community detection om re-levante categorie¨en te identificeren aan de hand van co-occurrence netwerken per tijdperiode. Hoewel dit niet vaak wordt gebruikt in de context van seman-tische categorie¨en, wordt het wel steeds meer gebruikt. Palla et al.[16] maakt bijvoorbeeld gebruik van een algoritme dat clique percolation gebruikt om te onderzoeken hoe overlappende communities afhankelijk zijn van tijd om zo de verbanden te vinden om community evolutie te karakteriseren. Het gaat hierbij evanals in dit onderzoek om de analyse van teksten. Clique percolation is een manier om communities te detecteren[17]. In dit artikel wordt gebruik gemaakt

(7)

Tabel 1: Alle jaren waarin geen troonrede geschreven is.

1908 De zwangerschap van koningin Wilhelmina verhinderde het voorlezen van de troonrede. 1909 De geboorte van Juliana zorgde ervoor dat dit jaar ook geen troonrede werd voorgelezen.

1911 Omdat koningin Wilhelmina het niet eens was met het beleid van de regering sprak ze geen troonrede uit. 1940 - 1945 Tijdens de oorlog werden geen troonredes voorgelezen.

1947 Koningin Wilhelmina was ziek.

van het louvain algoritme op basis van modularity[18].

3

Methodologie

3.1

Beschrijving van de data

De gebruikte data is afkomstig van http://www.troonredes.nl/, deze website bevat troonredes vanaf 1818 tot en met 2015. Er is echter dubbele data. De website bevat bijvoorbeeld twee keer de troonrede van 1946 en 1976. Dit zou het jaar 1977 moeten zijn in het geval van de dubbele versie van 1976, deze troon-rede mist op de website. Om die troon-rede is de troontroon-rede van 1977 van de website http://www.parlement.com/ gehaald en in eenzelfde formaat gezet als de rest van de troonredes, zodat all data consistent is. Daarnaast moesten een aantal troonredes handmatig van http://www.troonredes.nl/ gedownload worden omdat de website zich niet goed leent voor het massaal downloaden van troon-redes. Verder zijn er een aantal jaren waarin geen troonrede is uitgesproken, zo was koningin Wilhelmina in 1908 en 1909 afwezig vanwege zwangerschap en de geboorte van Juliana. Ook in 1911 sprak zij geen troonrede uit, uit protest tegen de volgens haar zwakke regering. Tijdens de Tweede Wereldoorlog zijn er geen offici¨ele troonredes uitgesproken, omdat de koninklijke familie in Engeland verbleef. In 1947 zag koningin Juliana op het laatste moment af van de troon-rede vanwege ziekte. Zie tabel 1 voor een overzicht van de missende troontroon-redes. In totaal zijn er 191 troonredes van het internet afgehaald. De benodigde data is opgeslagen in de vorm van een HTML pagina per troonrede.

In totaal zijn er 191 troonredes verzameld die bestaan uit een totaal van 217.612 woorden. De lengte van de troonredes verschilt, zie figuur 1. Voor elke troonrede is in het figuur (van boven naar beneden) de woord-, zin- en paragraaf-frequentie te zien. Dit geeft goed weer dat de troonrede steeds wordt naarmate de tijd vordert. De lengte van de troonredes verschilt ook per staatshoofd, zie figuur 2, staatshoofden worden hier in chronologische volgorde weergeven. Deze data is opgeslagen in een pandas DataFrame zoals te zien in appendix A.

3.2

Methodes

3.2.1 Wat zijn relevante termen voor het onderzoek in het troonrede corpus?

Welke termen zijn relevant?

Voor het kiezen van de woorden wordt gebruik gemaakt van verschillende natural language processing methodes. Allereerst worden alle zelfstandige naamwoorden uit de teksten gehaald met hulp van een Part-Of-Speech tagger voor Nederlandse

(8)

Figuur 1: De frequentie van woorden, zinnen en paragrafen per troonrede. De verticale lijnen representeren de afwisseling van staatshoofden.

(9)

Figuur 2: Het gemiddelde aantal woorden in troonredes en het aantal troonredes per staatshoofd.

(10)

tekst, daarna worden al deze zelfstandige naamwoorden gelemmatiseerd1 Van

de woorden die hierna overblijven worden de 1000 meest voorkomende woorden gekozen. Deze woorden worden de ’termen’ genoemd. In appendix B is te zien hoe deze termen geselecteerd worden.

Wat is de invloed van de veranderingen in spelling?

Gezien er geen goede Part-Of-Speech tagger software beschikbaar is om oud Nederlands juist te lemmatiseren en taggen[19] zal de invloed van de veran-deringen in spelling redelijk groot zijn. Sommige woorden zullen niet correct ge¨ıdentificeerd worden als zelfstandige naamwoorden. En daarnaast zullen som-mige woorden niet goed gebruikt kunnen worden voor het maken van river net-works en het maken van de termen matrices. Om woorden toch deels te vertalen heb ik een methode ontwikkeld die op basis van een aantal regels de woorden vertaalt die in de 1.000 meest voorkomende termen horen voor te komen maar oude of verkeerde spelling gebruiken. Deze methode zorgt er tegelijkertijd voor dat spelfouten gecorrigeerd worden. Het woord ’regering’ wordt in eerdere ver-sies van de troonrede bijvoorbeeld vaak gespeld als ’regeering’, het vertalen van deze fout zorgt ervoor dat het woord ’regering’ in plaats van 1.216 keer, 1.294 keer voorkomt. De methode bevat een aantal regels om de kans dat de verkeerde woorden verbeterd worden zo klein mogelijk te maken. In de appendix C is te zien welke regels dat zijn en hoe de methode werkt. In sectie 4 wordt verder ingegaan op de beperkingen van het algoritme.

3.2.2 Wat voor indeling moet worden gebruikt voor het tijdsbestek waarin de troonredes zijn geschreven?

Met uitzondering van 1908, 1909, 1911 en 1940-1945 is er elk jaar een troonrede geschreven. Om de verandering van vocabulaire door de tijd heen te vinden wordt een dissimilarity matrix van de troonredes gemaakt, zie figuur 3. Voor de jaren waarin geen troonrede is geschreven is de troonrede van het jaar daarvoor gebruikt, en voor jaren met dubbele troonredes zijn de twee troonredes bij elkaar opgeteld. Om verandering in het vocabulaire van de troonredes door de tijd heen te berekenen, wordt eerste de tf-idf vector berekend voor elke troonrede in jaar t:

t(w) = ft(w) log(

191 fD(w)

),

waarbij ft de frequentie van het woord in de troonrede is, fD de frequentie

van het aantal beschikbare troonredes waarin het woord voorkomt en 191 het totaal aantal troonredes. De tf-idf staat voor term frequency–inverse document frequency, dit is een statistische waarde die gebruikt wordt om in een corpus zoals deze te reflecteren hoe belangrijk een woord voor een troonrede is. Na het berekenen van de tf-idf vectors worden deze vectors genormaliseerd:

t = t |t|.

Daarna wordt een dissimilarity matrix berekend door de cosine similarity van de tf-idf vectors van twee troonredes te berekenen. Aan de hand daarvan wordt een snijpunt gekozen, waarvoor de globale heterogeniteit zo klein mogelijk is,

(11)

zoals te zien in figuur 4. De heterogeniteit tussen troonredes wordt verkregen door de gemiddelde dissimilarity te berekenen tussen troonredes:

H(p) = P (t1,t2)∈p2,t16=t2 D(t1, t2) |p|(|p| − 1) , waarbij D(t1, t2) = 1 − t1· t2.

Voor elk jaar t in de gegeven periode p wordt periode p opgedeeld in twee verschillende periodes, dit resulteert in periodes p− = [1818 : t − 1] en p+= [t :

2015]. Voor beide periodes wordt vervolgens de som van D(t1, t2) per mogelijke

combinatie van de tf-idf vectors van twee troonredes berekend, dit wordt gedeeld door het aantal mogelijke permutaties van de periode. Voor elke van de twee subperiodes is nu een heterogeniteit score beschikbaar. Het gewogen gemiddelde van deze twee getallen wordt genomen, waarbij de getallen gewogen worden aan de hand van het aantal jaren in de periode. Voor elk jaar in periode p is nu een gewogen gemiddelde heterogeniteit berekend, het jaar waarin dit getal het kleinst is wordt gebruikt als het eerste snijpunt om de periodes in op te delen. Dit proces wordt herhaald om de volgende twee snijpunten te vinden, zie figuur 5. Uiteindelijke zijn de volgende periodes gevonden: [1818 : 1848], [1849 : 1933], [1934 : 1962] en [1963 : 2015]. Zoals ook gezegd wordt in het artikel van Rule et al. laat de lengte van de eerste periode zien dat er minder dissimilarity is tussen troonredes in deze periode dan in latere periodes, dit laat zien dat onderwerpen in de troonredes in vroegmoderne tijdperken veel minder snel veranderden dan in modernere tijdperken. Omdat er zo’n duidelijk verschil is tussen deze periodes wordt er verder niet gezocht naar nieuwe snijpunten. Onze bevindingen komen overeen met die van Rule et al., zij gaan ook niet verder dan drie snijpunten en hebben ook een opdeling met langere vroegere periodes dan latere periodes. Details over de manier waarop de methodes zijn gevonden zijn te vinden in appendix D.

3.2.3 Hoe worden de semantische categorie¨en om deze termen in te delen bepaald?

Om de semantische categorie¨en te bepalen per periode wordt begonnen met het maken van een methode om een occurrence matrix te berekenen door co-occurrence van termen te tellen per jaar. De co-co-occurrence van twee woorden is het totaal aantal keer dat de twee woorden samen voorkomen in een paragraaf. Om de co-occurrence matrix van een bepaalde periode te krijgen, worden sim-pelweg alle co-occurrence matrices per jaar in de periode bij elkaar opgeteld, zie appendix E. Daarna wordt een proximity score berekend om te kijken hoe sterk twee termen aan elkaar gerelateerd zijn, deze score wordt berekend door te kijken naar elke woord c in de context van de twee woorden. Hiervoor wordt de volgende formule gebruikt:

S(w1, w2) = P c∈W \w1,w2,I(w1,c)>0 min(I(w1, c), I(w2, c)) P c∈W \w1,w2,I(w1,c)>0 I(w1, c) .

(12)

Figuur 3: Veranderingen in troonredes worden veroorzaakt door belangrijke historische gebeurtenissen. Hierboven zijn de veranderingen in sleuteltermen te zien door de tijd heen. Elke cel in deze matrix representeert de similarity van twee troonredes op een schaal van 0 tot 1. Donkere kleuren betekent hogere similarity.

Figuur 4: Hierboven is de heterogeniteit te zien voor elke mogelijke manier om de gehele troonrede corpus op te delen in twee periodes. De corpus word opgedeeld in twee periodes bij de laagste heterogeniteit score, het punt waar de troonredes dus het meest van elkaar verschillen.

(13)

Figuur 5: Hier zijn de tweede en derde snijpunten ge¨ıdentificeerd voor de twee periodes die in figuur 4 zijn ge¨ıdentificeerd. Deze snijpunten zijn op dezelfde manier verkregen als het eerste snijpunt. Er zijn nu in totaal vier periodes.

(14)

Waarbij I(w, c) = log(P (c)P (w)P (c,w) , dit wordt de Pointwise Mutual Information (PMI) score van twee woorden genoemd. In dit geval bestaat de context van een woord w uit elke woord c in de 1.000 termen. Deze proximity scores resul-teren in een matrix die gewogen en gericht is, dus niet symmetrisch. Omdat voor elke S(w1, w2) voor zowel w1als w2 de som van I(w, c) genomen wordt, is

er voor bijna elk woordpaar een score. Alleen wanneer een woord w1of w2 met

geen enkel woord c voorkomt krijgt een woordpaar geen score. Hierdoor bestaat het uiteindelijke netwerk uit erg veel edges. Dat is bijvoorbeeld ook te zien aan de dichtheid van 0.75 bij het netwerk voor de vierde periode. Om alleen de belangrijke edges te bewaren worden de edges met een te lage proximity score gefilterd, zie listing 1. Dit wordt gedaan door de drempel steeds met 0,01 te ver-hogen en edges met scores onder die drempel weg te gooien, tot er uiteindelijk een component van groter dan twee nodes loskomt van het principal connected component. Voor de vierde periode ([1963 : 2015]) komt het algoritme uit op een drempel van 0,38. Ten slotte wordt gebruik gemaakt van een community detection algoritme om de semantische categorie¨en te identificeren. De uitein-delijke netwerken geven een goed beeld van de verbindingen tussen onderwerpen en woorden. Zie figuur 6. Zie appendix F voor de manier waarop de proximity matrix is berekend.

Listing 1: Pseudocode voor het vinden van de drempel voor edge gewichten. t r e s h o l d = 0 . 1

w h i l e True :

f o r a l l e d g e s i n graph :

i f e d g e w e i g h t < t r e s h o l d : remove e d g e from graph

f o r component i n weakly c o n n e c t e d components o f graph : i f component i s n o t p r i n c i p a l c o n n e c t e d component :

i f component s i z e > 2 : b r e a k w h i l e l o o p t r e s h o l d += 0 . 1

Om te zien hoe de onderwerpen in de troonredes veranderen door de tijd heen is er voor zowel elke periode als voor de gehele corpus een stacked area chart gemaakt, zie figuur 7. Opvallend aan de grafiek per periode is dat niet elke categorie voorkomt in elke periode, hierdoor worden sommige categorie¨en abrupt afgesneden. Dit gebeurt niet bij de grafiek voor de gehele corpus, wel is hierbij te zien dat de categorie ’koloni¨en’ een grote aanwezigheid heeft tussen 1800 en 1930. Dit komt doordat deze troonredes nog veel oude woorden bevatten die allemaal onder diezelfde categorie worden geschaard. In tabel 2 is te zien hoeveel de categorie¨en in opeenvolgende periodes op elkaar lijken. Hieraan kan gezein worden hoe categorie¨en meer of minder op elkaar gaan lijken door de tijd heen. Deze similarity tussen categorie¨en c1 en c2is berekend met de cosine

similarity:

S(c1, c2) =

c1· c2

||c1|| · ||c2||

.

Categorie¨en c1 en c2 zijn vectoren die bestaan uit de degrees per w ∈ W in het

(15)

Figuur 6: Het semantische netwerk ge¨ıdentificeerd door de community detection voor de vierde periode: [1963 : 2015].

niet alle 1000 termen voorkomen in een categorie. Berekening van tabel 2 is te zien in appendix G.

4

Evaluatie

4.1

Reproduceerbaarheid

Over het algemeen was het artikel van Rule et al. goed te reproduceren, gegeven dat de troonrede corpus vergelijkbaar is met de State of the Union corpus. Rule et al. zijn onduidelijk in het beschrijven van de methodes die ze gebruiken, na enig uitzoeken waren de meeste van deze methodes echter goed te reproduceren. Zoals de tf-idf vectors van de troonredes, het berekenen van de cosine dissimi-larity, het bepalen van de semantische categorie¨en door middel van de proximity matrix, enzovoorts. Het reproduceren van de river networks zoals beschreven in Rule et al. was moeilijker. De uitleg hierbij was onduidelijk en moeilijk te reproduceren. Verder zijn de resultaten van Rule et al. vergelijkbaar met de resultaten van dit onderzoek.

4.2

Relevante termen

Voor het vinden van de relevante termen is gebruik gemaakt van POS-tagging en lemmatisering om zelfstandige naamwoorden te vinden, een probleem is dat POS-tagging en lemmatisering voor oud-Nederlandse woorden niet goed werkt.

(16)

Figuur 7: Boven: De categorie¨en zoals ge¨ıdentificeerd per periode. Onder: De categorie¨en ge¨ıdentificeerd voor de gehele corpus.

(17)

Tabel 2: Categorie similarity voor opeenvolgende periodes, hogere getallen be-tekenen een grotere overeenkomst tussen categorie¨en in opeenvolgende periodes.

Periode 1 / Periode 2 defensie welvaart koloni¨en politiek buitenl. beleid economie infrastr. en milieu maatschappij justitie 0.985 0.944 0.929 0.845 0.915 0.960 0.969 0.962 defensie 0.994 0.988 0.961 0.917 0.971 0.884 0.922 0.951 koloni¨en 0.865 0.837 0.994 0.877 0.936 0.950 0.955 0.965 buitenlands beleid 0.976 0.963 0.917 0.961 0.942 0.881 0.779 0.940 binnenlands beleid 0.986 0.942 0.974 0.931 1.000 0.964 0.970 0.768 economie 0.910 0.889 0.973 0.902 1.000 0.976 0.992 0.918 infrastructuur en milieu 0.934 0.843 0.939 0.958 0.983 0.873 0.990 0.968

Periode 2 / Periode 3 defensie welvaart maatschappij zorg binnenl. beleid buitenl. beleid economie infrastr. en milieu koloni¨en defensie 1.000 0.995 1.000 0.997 0.928 0.889 0.994 1.000 0.941 welvaart 0.910 0.963 0.978 0.879 0.931 0.897 0.983 0.984 0.962 koloni¨en 0.952 0.902 0.959 0.994 0.990 0.910 0.913 0.967 0.942 politiek 0.955 0.952 0.954 0.877 0.967 0.932 0.974 0.979 0.931 buitenlands beleid 0.923 0.987 1.000 0.975 0.944 0.972 0.962 0.989 0.977 economie 0.959 0.969 0.971 0.938 0.959 0.835 0.959 0.967 0.887 infrastructuur en milieu 0.858 0.984 1.000 0.979 0.990 0.983 0.989 0.990 0.950 maatschappij 0.971 0.900 0.980 0.891 0.918 0.956 0.835 0.746 0.929

Periode 3 / Periode 4 defensie welvaart bezuiniging justitie onderwijs maatschappij economie infrastr. en milieu defensie 0.859 0.942 0.987 0.975 0.997 0.969 0.919 0.924 welvaart 0.946 0.967 0.949 0.927 0.986 0.927 0.945 0.810 maatschappij 0.997 0.962 0.937 0.978 0.718 0.994 0.938 0.979 zorg 0.967 0.935 0.810 0.978 0.948 0.973 0.990 0.919 binnenlands beleid 0.904 0.993 0.949 0.906 0.992 0.982 0.975 0.989 buitenlands beleid 0.860 0.931 0.941 0.960 0.991 0.962 0.869 0.954 economie 0.962 0.896 0.762 0.989 0.977 0.884 0.977 0.810 infrastructuur en milieu 0.959 0.931 0.872 0.994 1.000 0.959 1.000 0.991 koloni¨en 0.880 0.914 0.993 0.969 0.996 0.988 0.938 0.989

Hierdoor ontstaat er een aantal foute woorden, waaronder woorden van twee of zelfs maar ´e´en letter. Om dit te voorkomen moet het algoritme in toekomstig onderzoek een minimale lengte van twee of drie letters voor een term eisen. Daarnaast hebben de POS-tagging en lemmatiseringsmethodes veel last van ge-dateerde woorden en spelfouten. Een aantal van deze spelfouten zijn opgelost door het algoritme beschreven in appendix C. Bij een simpele steekproef op 200 willekeurige unieke woorden waarbij het algoritme wordt getest op accuraatheid maakt het algoritme twee fouten. Echter een belangrijker probleem van het algoritme is dat het alleen bepaalde spelfouten oppikt. Het vertaalt geen ge-dateerde woorden zoals ’vereischte’, dit komt doordat het algoritme pas wordt uitgevoerd nadat de 1000 termen zijn gekozen.

4.3

Periodisering

Er is tevreden geobserveerd dat de snijpunten voor de periodisering van de troonrede corpus ruwweg overeenkomt met bepaalde historische gebeurtenissen. Het eerste snijpunt valt op 1848, toen de grondwet in Nederland herzien werd. De latere twee snijpunten vallen rond de Tweede Wereldoorlog. Voor toekomstig onderzoek zou het interessant zijn om nog extra snijpunten te vinden, bijvoor-beeld tussen het eerste en tweede snijpunt, die periode spant over meer dan 90 jaar.

4.4

Semantische categorie¨

en

Bij het identificeren van de semantische categorie¨en kon gekozen worden uit meerdere methodes die communities kunnen vinden in semantische netwerken. E´en daarvan was k-clique percolation, deze methode zoekt naar overlappende

(18)

communities. De methode zorgde echter voor zeer kleine communities en gooide veel knopen in de netwerken weg. De tweede methode van NetworkX maakt ge-bruik van louvain community detection aan de hand van optimale modularity. Deze methode mist de mogelijkheid om communities kleiner of groter te maken, bovendien is het visualiseren bij deze methode erg lastig. Uiteindelijk is louvain wel gebruikt, maar dan via het programma Gephi, dit programma biedt de mo-gelijkheid om meer of minder communities te identificeren, door de modularity score te verhogen of verlagen, en is erg goed bruikbaar voor het maken van vi-sualisaties. Uiteindelijk zijn er voor elke periode categorie¨en gevonden die niet te klein en niet te groot waren.

4.5

Hoe worden deze categorie¨

en geanalyseerd om lexicale

continu¨ıteit of verandering te identificeren?

Om de categorie¨en te analyseren en is gebruik gemaakt van een stacked area chart (figuur 7). Hiervoor moesten de categorie¨en eerst een naam krijgen, aange-zien de community detection goed gewerkt heeft worden er duidelijke verschillen in de categorie¨en ontdekt. Maar de moeilijkheid was dat verschillende periodes niet altijd duidelijk dezelfde categorie¨en hadden. Hoewel tabellen zoals tabel 2 hierbij helpen blijft het lastig dat hier geen automatische methode voor is. Het probleem van deze handmatige benoeming is ook dat een willekeurig andere onderzoeker heel andere namen zou kunnen geven aan de categorie¨en. Ondanks dit probleem valt er uit figuur 7 toch op te maken welke categorie¨en vroeger be-langrijker waren dan tegenwoordig. Om lexicale continu¨ıteit en verandering nog beter te analyseren zou in toekomstig onderzoek nog river networks gemaakt kunnen worden, zoals Rule et al. ook doet.

5

Conclusies

Wat voor belangrijke veranderingen en continu¨ıteit kunnen worden gevonden in 198 jaar troonredes, rekening houdend met de lexicale veranderingen?

Aan de hand van natural language processing, co-occurrence structuren en louvain community detection zijn de de troonredes op zo’n manier geanalyseerd dat er verschillende categorie¨en zijn ge¨ıdentificeerd. Het antwoord op de hoofd-vraag is te vinden in figuur 7 en tabel 2, zo is bijvoorbeeld te zien dat er sinds 1963 vrijwel niet meer over de koloni¨en van vroeger wordt gepraat, in plaats daarvan wordt er het nu meer over welvaart en de regering gesproken. Daar-naast is te zien dat onderwerpen zoals defensie van alle tijden zijn. Aan figuur 7 is ook te zien hoe het identificeren van categorie¨en per periode verschilt van het identificeren van categorie¨en voor de gehele corpus.

5.1

Reflectie

Over het algemeen ben ik tevreden over de uitkomst van het onderzoek, er zijn een aantal onderdelen van het onderzoek die beter hadden gekund. E´en ervan is het verschil in spelling in de troonredes. De grote hoeveelheid woorden met oude spelling zorgt ervoor dat de community detection ertoe neigt om veel oude woorden in ´e´en categorie te stoppen. Daarnaast waren er onderdelen in het

(19)

artikel van Rule et al. die niet goed uitgelegd werden en daardoor moeilijk te reproduceren waren, zoals het maken van de river networks. Wel ben ik erg tevreden over de periodisering van de troonrede corpus en het maken van de proximity netwerken. Er zijn duidelijke categorie¨en te identificeren die per periode duidelijk verschillen. Het onderzoek in dit artikel versterkt de claim van Rule et al. dat ze een goede strategie hebben ontwikkeld voor het analyseren van corpora die betrekking hebben op lange tijdperiodes.

5.2

Dankbetuiging

Bedankt Pieter Lagas voor het verzamelen en inscannen van de troonredes en het publiceren daarvan op http://www.troonredes.nl/. Bedankt Maarten Marx voor de goede begeleiding tijdens het maken van de scriptie. En ik wil mijn familie bedanken voor de steun tijdens het schrijven van de scriptie.

Referenties

[1] Alix Rule, Jean-Philippe Cointet, and Peter S Bearman. Lexical shifts, substantive changes, and continuity in state of the union discourse, 1790– 2014. Proceedings of the National Academy of Sciences, 112(35):10837– 10844, 2015.

[2] Marije Willems. 200 jaar troonredes in drie interactieve infographics. wat valt (het meest) op? http://www.nrc.nl/nieuws/2014/09/16/ 200-jaar-troonrede-in-drie-infographics-inhoud-lengte-en-koningin, 2014.

[3] Hendrika Manon Voituron et al. Van economische ontreddering naar zelf-redzaamheid. crisisframes en -metaforen in de troonredes uit de 20ste en 21ste eeuw. 2014.

[4] Pieter C. Lagas. Besturen op de rand van chaos. Eburon, 2601 CW Delft, 1999.

[5] Yutaka Matsuo and Mitsuru Ishizuka. Keyword extraction from a single document using word co-occurrence statistical information. International Journal on Artificial Intelligence Tools, 13(01):157–169, 2004.

[6] Gerard Salton and Michael J McGill. Introduction to modern information retrieval. 1986.

[7] Michel Callon, Jean Pierre Courtial, and Fran¸coise Laville. Co-word ana-lysis as a tool for describing the network of interactions between basic and technological research: The case of polymer chemsitry. Scientometrics, 22(1):155–205, 1991.

[8] Justin Grimmer and Brandon M Stewart. Text as data: The promise and pitfalls of automatic content analysis methods for political texts. Political Analysis, 21(3):267–297, 2013.

[9] David M Blei, Andrew Y Ng, and Michael I Jordan. Latent dirichlet allo-cation. the Journal of machine Learning research, 3:993–1022, 2003.

(20)

[10] David Newman, Youn Noh, Edmund Talley, Sarvnaz Karimi, and Timothy Baldwin. Evaluating topic models for digital libraries. In Proceedings of the 10th annual joint conference on Digital libraries, pages 215–224. ACM, 2010.

[11] Benjamin M Schmidt. Words alone: Dismantling topic models in the hu-manities. Journal of Digital Humanities, 2(1):49–65, 2012.

[12] David Inouye, Pradeep Ravikumar, and Inderjit Dhillon. Admixture of poisson mrfs: A topic model with word dependencies. In Proceedings of the 31st International Conference on Machine Learning, pages 683–691, 2014. [13] Michal Rosen-Zvi, Thomas Griffiths, Mark Steyvers, and Padhraic Smyth. The author-topic model for authors and documents. In Proceedings of the 20th conference on Uncertainty in artificial intelligence, pages 487–494. AUAI Press, 2004.

[14] Chong Wang, David Blei, and David Heckerman. Continuous time dynamic topic models. arXiv preprint arXiv:1206.3298, 2012.

[15] Xuerui Wang and Andrew McCallum. Topics over time: a non-markov continuous-time model of topical trends. In Proceedings of the 12th ACM SIGKDD international conference on Knowledge discovery and data mi-ning, pages 424–433. ACM, 2006.

[16] Gergely Palla, Albert-L´aszl´o Barab´asi, and Tam´as Vicsek. Quantifying social group evolution. Nature, 446(7136):664–667, 2007.

[17] Imre Der´enyi, Gergely Palla, and Tam´as Vicsek. Clique percolation in random networks. Physical review letters, 94(16):160202, 2005.

[18] Vincent D Blondel, Jean-Loup Guillaume, Renaud Lambiotte, and Etienne Lefebvre. Fast unfolding of communities in large networks. Journal of statistical mechanics: theory and experiment, 2008(10):P10008, 2008. [19] Wijckmans Tessa. Op weg naar moderne analyse van historische teksten.

een onderzoek naar automatische taalverwerking van zeventiende-eeuwse nederlandse prozateksten. Nederlab, 2015.

(21)

6

Appendices

De code die hier te zien is, is niet volledig en werkt niet zonder aanvullende code. Om de appendix enigszins overzichtelijk te houden en omdat de aanvullende code niet relevant is staat de aanvullende code hier niet bij.

A

Het verwerken van de troonredes.

Troonredes zijn in HTML formaat opgeslagen en worden verwerkt en opgeslagen in een pandas DataFrame. Zoals te zien in listing A.

import n l t k import pandas a s pd from n l t k import t o k e n i z e from b s 4 import B e a u t i f u l S o u p import o s t o k e n i z e r = n l t k . W h i t e s p a c e T o k e n i z e r ( ) a l l D a t a = {} f o r f n in o s . l i s t d i r ( ’ t r o o n r e d e s ’ ) : w i t h open ( ’ t r o o n r e d e s / ’ + f n ) a s t r o o n r e d e : soup = B e a u t i f u l S o u p ( t r o o n r e d e , ’ l x m l ’ ) t e x t = soup . f i n d ( ” d i v ” , { ” i d ” : ” p o s t −c o n t e n t ” } ) . t e x t t o k e n i z e d = t o k e n i z e r . t o k e n i z e ( t e x t . l o w e r ( ) ) h e a d O f S t a t e = soup . f i n d ( ” a ” , { ” r e l ” : ” c a t e g o r y t a g ” } ) . t e x t t i t l e = soup . t i t l e . t e x t . s t r i p ( ) [ : − 1 6 ] . l o w e r ( ) y e a r = i n t ( soup . f i n d ( ” h1 ” , { ” c l a s s ” : ” p o s t − t i t l e ” } ) . t e x t [ − 4 : ] ) p a r a g r a p h s = t e x t . l o w e r ( ) . s t r i p ( ) . s p l i t ( ’ \n ’ ) s e n t e n c e s = [ t o k e n i z e r . t o k e n i z e ( s e n t ) f o r s e n t in \ n l t k . s e n t t o k e n i z e ( t e x t . l o w e r ( ) ) ] i f h e a d O f S t a t e not in a l l D a t a . k e y s ( ) : a l l D a t a [ h e a d O f S t a t e ] = {} documentData = {} documentData [ ’ f u l l t e x t ’ ] = t e x t documentData [ ’ t o k e n i z e d t e x t ’ ] = t o k e n i z e d documentData [ ’ p a r a g r a p h s ’ ] = p a r a g r a p h s documentData [ ’ s e n t e n c e s ’ ] = s e n t e n c e s

documentData [ ’ t o t a l words ’ ] = len ( t o k e n i z e d )

documentData [ ’ t o t a l u n i q u e words ’ ] = len ( s e t ( t o k e n i z e d ) ) documentData [ ’ t o t a l p a r a g r a p h s ’ ] = len ( p a r a g r a p h s ) documentData [ ’ t o t a l s e n t e n c e s ’ ] = len ( s e n t e n c e s ) documentData [ ’ y e a r ’ ] = y e a r a l l D a t a [ h e a d O f S t a t e ] [ t i t l e ] = documentData d a t a L i s t = [ ] f o r s t a a t s h o o f d , t r o o n r e d e in a l l D a t a . i t e r i t e m s ( ) : f o r key , v a l u e in t r o o n r e d e . i t e r i t e m s ( ) : l = v a l u e . v a l u e s ( ) l . append ( key ) l . append ( s t a a t s h o o f d ) d a t a L i s t . append ( l )

(22)

d f = pd . DataFrame ( d a t a L i s t ) d f . columns = [ ’ f u l l t e x t ’ , ’ t o t a l words ’ , ’ u n i q u e words ’ , ’ p a r a g r a p h s ’ , ’ y e a r ’ , ’ t o t a l s e n t e n c e s ’ , ’ s e n t e n c e s ’ , ’ t o k e n i z e d t e x t ’ , ’ t o t a l p a r a g r a p h s ’ , ’ t i t l e ’ , ’ head o f s t a t e ’ ] d f = d f . s o r t v a l u e s ( ’ y e a r ’ ) . r e s e t i n d e x ( drop=True )

B

Het selecteren van de 1000 termen.

from p a t t e r n . n l import p a r s e t r e e from c o l l e c t i o n s import Counter

w i t h open ( ’ s t o p w o o r d e n . t x t ’ ) a s stopw : s t o p w o o r d e n = stopw . r e a d ( ) . s p l i t ( ’ \n ’ ) p a r a g r a p h s = d f [ ’ p a r a g r a p h s ’ ] . t o l i s t ( ) nouns = [ ] c o u n t = 0 f l a t = [ ] f o r a r t i c l e in p a r a g r a p h s : c o u n t += 1 i f c o u n t % 20 == 0 : print c o u n t a = [ ] f o r p a r a g r a p h in a r t i c l e : p = [ ] f o r s in p a r s e t r e e ( p a r a g r a p h . e n c o d e ( ’ a s c i i ’ , ’ i g n o r e ’ ) , \ lemmata=True ) : f o r word in s . words : i f word . p o s == ’NN ’ or word . p o s== ’NNS ’ or \ word . p o s== ’NNP ’ or word . p o s== ’NNPS ’ :

i f word . lemma not in s t o p w o o r d e n : f l a t . append ( word . lemma ) p . append ( word . lemma ) a . append ( p )

nouns . append ( a )

c = Counter ( f l a t )

most common = [ word [ 0 ] f o r word in c . most common ( 1 0 0 0 ) ]

C

Regels voor het vinden van verkeerd gespelde woorden.

Het algoritme zoekt voor elke term uit de 1000 termen welk woord het meest lijkt op de term. Hiervoor gebruikt het een aantal regels:

Het gevonden woord mag niet gelijk zijn aan de term waarvoor het gevonden is.

Het gevonden woord mag niet meer dan twee letter langer of korter zijn dan de term.

(23)

Het algoritme kijkt specifiek naar termen die eindigen op ’s’ en ’sch’.

Ingescande document zien de letter ’I’ vaak als een ’l’, hier wordt ook op gelet. Het algoritme kijkt specifiek naar termen met ’ch’ erin, omdat woorden vroeger een ’g’ gebruikten. In deze gevallen moet de letter ’c’ op dezelfde plek in de term staan als de letter ’g’ in het gevonden woord.

Het algoritme kijkt specifiek naar termen met ’ee’ erin, hierbij mag het gevon-den woord niet langer zijn dan de lengte van de term + 1.

D

Het vinden van de periodes in de troonrede corpus.

import m a t p l o t l i b . p y p l o t a s p l t import pandas a s pd import numpy a s np from i t e r t o o l s import p e r m u t a t i o n s d i s M a t r i x = pd . r e a d p i c k l e ( ’ d i s s i m i l a r i t y M a t r i x . p i c k l e ’ ) #d i s s i m i l a r i t y m a t r i x gemaakt d o o r m i d d e l van t f −d i f v e c t o r s v e c t o r s = pd . r e a d p i c k l e ( ’ v e c t o r s . p i c k l e ’ ) #t f −i d f v e c t o r s van de t r o o n r e d e s def p e r i o d i z a t i o n ( y e a r s ) : H L i s t = [ ] f o r y e a r in y e a r s : x L i s t = [ ] y L i s t = [ ] h1 = l i s t ( p e r m u t a t i o n s ( y e a r s [ : y e a r ] , 2 ) ) h2 = l i s t ( p e r m u t a t i o n s ( y e a r s [ y e a r : ] , 2 ) )

i f not len ( h1 ) > 1 or not len ( h2 ) > 1 : continue f o r x in h1 : x L i s t . append (1−np . d o t ( v e c t o r s . i l o c [ x [ 0 ] ] , v e c t o r s . i l o c [ x [ 1 ] ] ) ) f o r y in h2 : y L i s t . append (1−np . d o t ( v e c t o r s . i l o c [ y [ 0 ] ] , v e c t o r s . i l o c [ y [ 1 ] ] ) ) p1 = sum( x L i s t ) / len ( h1 ) p2 = sum( y L i s t ) / len ( h2 )

H L i s t . append ( ( ( p1 ∗ len ( y e a r s [ : y e a r ] ) ) + ( p2 ∗ len ( y e a r s [ y e a r : ] ) ) ) / 2 ) return H L i s t t o t a l Y e a r s = range ( 1 9 8 ) f i r s t p e r i o d i z a t i o n = p e r i o d i z a t i o n ( t o t a l Y e a r s ) s e c o n d p e r i o d = p e r i o d i z a t i o n ( t o t a l Y e a r s \ [ : f i r s t p e r i o d i z a t i o n . \ i n d e x (min( f i r s t p e r i o d i z a t i o n ) ) ] ) l = [ y e a r − f i r s t p e r i o d i z a t i o n . i n d e x (min( f i r s t p e r i o d i z a t i o n ) ) f o r \ y e a r in t o t a l Y e a r s [ f i r s t p e r i o d i z a t i o n . i n d e x (min( f i r s t p e r i o d i z a t i o n ) ) : ] ] t h i r d p e r i o d = p e r i o d i z a t i o n ( l ) f p= f i r s t p e r i o d i z a t i o n . i n d e x (min( f i r s t p e r i o d i z a t i o n ) ) + 1818 + 2 sp= 1818 + s e c o n d p e r i o d . i n d e x (min( s e c o n d p e r i o d ) ) + 2 tp= t h i r d p e r i o d . i n d e x (min( t h i r d p e r i o d ) ) + f p

(24)

p e r i o d 1 = range ( 1 8 1 8 , sp ) p e r i o d 2 = range ( sp , f p ) p e r i o d 3 = range ( fp , tp ) p e r i o d 4 = range ( tp , 2 0 1 6 ) p e r i o d D f = pd . S e r i e s ( [ p e r i o d 1 , p e r i o d 2 , p e r i o d 3 , p e r i o d 4 ] ) p e r i o d D f . t o p i c k l e ( ’ p e r i o d s . p i c k l e ’ )

E

Het maken van de co-occurrence matrices.

def c o O c c u r r e n c e ( y e a r ) : g l o b a l nounsDf a l l N o u n s = s e t ( nounsDf [ ’ noun ’ ] . t o l i s t ( ) ) d f = nounsDf . groupby ( ’ y e a r ’ ) . g e t g r o u p ( y e a r ) l = d f [ ’ noun ’ ] . t o l i s t ( ) m a t r i x = [ ] f o r noun in a l l N o u n s : matrixRow = [ ] f o r noun2 in a l l N o u n s : coOcc = 0

i f noun in l and noun2 in l :

nounPID = s e t ( [ d f . l o c [ i d x ] . pID f o r \ i d x in d f [ d f [ ’ noun ’ ] == noun ] . i n d e x . t o l i s t ( ) ] ) noun2PID = s e t ( [ d f . l o c [ i d x ] . pID f o r \ i d x in d f [ d f [ ’ noun ’ ] == noun2 ] . i n d e x . t o l i s t ( ) ] ) f o r PID in nounPID : i f PID in noun2PID : coOcc += 1 matrixRow . append ( coOcc ) m a t r i x . append ( matrixRow ) return m a t r i x d f M a t r i c e s = [ ] f o r p e r i o d in p e r i o d s : m a t r i x = [ [ 0 ] ∗ 1000 f o r i in range ( 1 0 0 0 ) ] f o r y e a r in p e r i o d : try : X = c o O c c u r r e n c e ( y e a r ) except KeyError : continue Y = m a t r i x m a t r i x = [ [ X[ i ] [ j ] + Y [ i ] [ j ] f o r j in \

range ( len (X [ 0 ] ) ) ] f o r i in range ( len (Y ) ) ] m = pd . DataFrame ( m a t r i x )

m. columns = s e t ( nounsDf [ ’ noun ’ ] . t o l i s t ( ) )

m. s e t i n d e x ( pd . S e r i e s ( l i s t ( s e t ( nounsDf [ ’ noun ’ ] . t o l i s t ( ) ) ) ) , \ i n p l a c e=True )

(25)

F

Het berekenen van de proximity netwerken.

def I M a t r i x ( nounsDf , matrix , p , pInde x ) : g l o b a l t o t a l P a r s

a l l N o u n s = sorted ( m a t r i x . columns ) m = [ ]

i f pIndex != None :

p e r i o d = nounsDf . groupby ( ’ p e r i o d ’ ) . g e t g r o u p ( pIndex ) e l s e :

p e r i o d = nounsDf tp = t o t a l P a r s ( p ) f o r noun in a l l N o u n s :

print noun

Pw = p e r i o d . l o c [ nounsDf [ ’ noun ’ ] == noun ] . pID . t o l i s t ( ) mRow = [ ]

f o r noun2 in a l l N o u n s : i f noun == noun2 :

mRow. append ( 0 ) continue

Pc = p e r i o d . l o c [ nounsDf [ ’ noun ’ ] == noun2 ] . pID . t o l i s t ( ) Pcw = m a t r i x . l o c [ noun ] [ noun2 ]

i f Pcw != 0 :

mRow. append ( math . l o g ( ( f l o a t ( Pcw ) / tp )

/ ( ( f l o a t ( len ( Pc ) ) / tp ) ∗ ( f l o a t ( len (Pw) ) / tp ) ) ) ) e l s e :

mRow. append ( 0 ) m. append (mRow)

return m

def p r o x i m i t y ( nounsDf , matrix , p , pIndex = None ) : g l o b a l t o t a l P a r s

IM = pd . DataFrame ( I M a t r i x ( nounsDf , matrix , p , pIndex ) ) a l l N o u n s = sorted ( s e t ( nounsDf [ ’ noun ’ ] . t o l i s t ( ) ) ) IM . columns = sorted ( s e t ( nounsDf [ ’ noun ’ ] . t o l i s t ( ) ) ) IM . s e t i n d e x ( pd . S e r i e s ( sorted ( l i s t ( s e t ( nounsDf [ ’ noun ’ ] \

. t o l i s t ( ) ) ) ) ) , i n p l a c e=True ) m = [ ] f o r noun in a l l N o u n s : print noun mRow = [ ] f o r noun2 in a l l N o u n s :

s = sum ( [ min(IM [ noun ] [ c ] , IM [ noun2 ] [ c ] ) \ f o r c in a l l N o u n s i f c != noun \ and c != noun2 and IM [ noun ] [ c ] \ > 0 and IM [ noun2 ] [ c ] > 0 ] )

s 2 = sum ( [ IM [ noun ] [ c ] f o r c in a l l N o u n s \ i f c != noun and c != noun2 and \ IM [ noun ] [ c ] > 0 ] ) i f s 2 != 0 : mRow. append ( s / s 2 ) e l s e : mRow. append ( 0 ) m. append (mRow) return m

(26)

G

Het berekenen van de similarity tussen categorie¨

en in

opeenvolgende periodes.

import networkx a s nx import pandas a s pd import numpy a s np import math from s c i p y import s p a t i a l nouns = pd . r e a d p i c k l e ( ’ nouns . p i c k l e ’ ) c a t e g o r i e s = [ [ ’ b u i t e n l a n d b e l e i d ’ , ’ k o l o n i e n ’ , ’ d e f e n s i e ’ , ’ i n f r a s t r u c t u u r en m i l i e u ’ , ’ b i n n e n l a n d s b e l e i d ’ , ’ j u s t i t i e ’ , ’ e c o n o m i e ’ ] , \ [ ’ d e f e n s i e ’ , ’ m a a t s c h a p p i j ’ , ’ k o l o n i e n ’ , ’ b u i t e n l a n d s b e l e i d ’ , ’ i n f r a s t r u c t u u r en m i l i e u ’ , ’ e c o n o m i e ’ , ’ w e l v a a r t ’ , ’ b u i t e n l a n d s b e l e i d ’ , ’ p o l i t i e k ’ ] , \ [ ’ w e l v a a r t ’ , ’ d e f e n s i e ’ , ’ i n f r a s t r u c t u u r en m i l i e u ’ , ’ z o r g ’ , ’ b i n n e n l a n d s b e l e i d ’ , ’ e c o n o m i e ’ , ’ m a a t s c h a p p i j ’ , ’ k o l o n i e n ’ , ’ b u i t e n l a n d s b e l e i d ’ ] , \ [ ’ j u s t i t i e ’ , ’ e c o n o m i e ’ , ’ i n f r a s t r u c t u u r en m i l i e u ’ , ’ m a a t s c h a p p i j ’ , ’ o n d e r w i j s ’ , ’ d e f e n s i e ’ , ’ w e l v a a r t ’ , ’ b e z u i n i g i n g ’ ] ] c a t e g o r y W o r d s = {} f o r x in range ( 4 ) : c a t e g o r y W o r d s [ x ] = {} w i t h open ( ’ e d g e s ’ + s t r ( x+1) + ’ . t x t ’ , ’ r ’ ) a s f : e d g e s = [ ] f o r l i n e in f . r e a d l i n e s ( ) : L = l i n e . s t r i p ( ’ \n ’ ) . s p l i t ( ) e d g e s . append ( ( L [ 0 ] , L [ 1 ] ) ) f . c l o s e ( ) G = nx . Graph ( ) G. a d d e d g e s f r o m ( e d g e s ) c s v = pd . r e a d c s v ( ’ nodesNetwork ’ + s t r ( x+1) + ’ . c s v ’ ) \ [ [ ’ i d ’ , ’ m o d u l a r i t y c l a s s ’ ] ] c s v [ ’ d e g r e e ’ ] = c s v [ ’ i d ’ ] . apply ( lambda x : G. d e g r e e ( ) [ x ] , 1 ) c o u n t = 0 f o r y in range ( len ( s e t ( l i s t ( c s v [ ’ m o d u l a r i t y c l a s s ’ ] ) ) ) ) : l = l i s t ( c s v . groupby ( ’ m o d u l a r i t y c l a s s ’ ) . g e t g r o u p ( y ) \ . s o r t v a l u e s ( ’ d e g r e e ’ , a s c e n d i n g=F a l s e ) [ ’ i d ’ ] ) i f len ( l ) > 9 : i f c a t e g o r i e s [ x ] [ c o u n t ] not in c a t e g o r y W o r d s . k e y s ( ) : c a t e g o r y W o r d s [ x ] [ c a t e g o r i e s [ x ] [ c o u n t ] ] = [ ] f o r word in s e t ( nouns [ ’ noun ’ ] ) :

i f word in l :

c a t e g o r y W o r d s [ x ] [ c a t e g o r i e s [ x ] [ c o u n t ] ] += [G. d e g r e e ( word ) ] e l s e :

c a t e g o r y W o r d s [ x ] [ c a t e g o r i e s [ x ] [ c o u n t ] ] += [ 0 ] c o u n t += 1

(27)

def makeMatrix ( p e r i o d 1 , p e r i o d 2 ) : c o s i n e M a t r i x = [ ]

f o r key , c a t in p e r i o d 1 . i t e r i t e m s ( ) : row = [ ]

f o r key2 , c a t 2 in p e r i o d 2 . i t e r i t e m s ( ) :

row . append ( s p a t i a l . d i s t a n c e . c o s i n e ( c a t , c a t 2 ) . round ( 3 ) ) c o s i n e M a t r i x . append ( row )

m = pd . DataFrame ( c o s i n e M a t r i x )

m. columns = [ key f o r key in p e r i o d 2 . k e y s ( ) ]

m. s e t i n d e x ( pd . S e r i e s ( [ key f o r key in p e r i o d 1 . k e y s ( ) ] ) , i n p l a c e = True ) return m

m a t r i x 1 = makeMatrix ( c a t e g o r y W o r d s [ 0 ] , c a t e g o r y W o r d s [ 1 ] ) m a t r i x 2 = makeMatrix ( c a t e g o r y W o r d s [ 1 ] , c a t e g o r y W o r d s [ 2 ] ) m a t r i x 3 = makeMatrix ( c a t e g o r y W o r d s [ 2 ] , c a t e g o r y W o r d s [ 3 ] )

Referenties

GERELATEERDE DOCUMENTEN

This new market model, which among other things results in a new value for the equity risk premium, will then be used to generate a new scenario set for the economy in

As is the case with regard to empirical work in measuring the extent of a balanced approach (i.e. including both strengths and deficits), both from an organisational and

In this investigation, the effect of a pre-center drill hole and tool material comprising HSS-Mo, HSS-Co, and HSS-Ti-coated tools on the generated cutting force, surface roughness,

A typical resilience policy in flood management combines different complementary strategies for flooding, such as evacuation plans, spatial planning aimed at low potential damage

[25-27] In our study, however, the mechanism of activity enhancement is different from these approaches: as opposed to increasing the affinity between the binding partners

For women consuming the most added sugar (Q4), the mean intakes of thiamine, riboflavin, niacin, vitamin B 12 , folate, pantothenic acid, biotin, calcium, magnesium, phosphorus,

The focus of this paper was to review the cultural at micro and meso levels and psychological factors at micro level associated with women’s experiences towards leadership and

TACE en LITT als eerste/tweedelijns behandeling of als salvage therapie bij niet-resectable levermetastasen van colorectaal carcinoom, voldoen niet aan de stand van de wetenschap