| |
| |
| |
Taalverwantschap, taalherkenning en letters tellenGa naar eind1.
Geer Hoppenbrouwers
0. Inleiding
De meeste liefhebbers van een spelletje scrabble zullen zich wel eens afgevraagd hebben waarom de fabrikant van dit spel de puntenwaardering voor de verschillende letters niet omgekeerd evenredig heeft gemaakt met de frequentie van iedere letter in het Nederlands. Dit artikel gaat uit van de omgekeerde vraagstelling: Stel dat de fabrikant van scrabble zijn werk goed zou doen, kun je dan van een gegeven exemplaar van het spel bepalen voor wel taalgebied het bestemd is?
Als we voldoende geduld zouden hebben, zouden we van een groot aantal talen monsters kunnen nemen en op basis van ieder monster een schatting kunnen maken van de frequentie van iedere letter van het Latijnse alfabet in die taal. We zouden dan vinden dat ongeveer 27% van de letters in een tekst in het Hausa a's zijn. Voor het Iers ligt dat percentage rond de 17, voor het Welsh iets boven de 10 en voor het Nederlands rond de 8. Voor alle talen zouden we op die manier de relatieve frequentie kunnen bepalen van ieder van de 26 letters van het Latijnse alfabet. Vervolgens zouden we een tekst kunnen nemen in een van de talen waarvan we de relatieve letterfrequentie hadden berekend. Zouden we dan, door de frequentietabel voor de onbekende tekst te vergelijken met de tabellen voor de verschillende talen kunnen bepalen in welke taal de tekst gesteld was. Het zou een heidens karwei zijn. Ik heb het met de hand gedaan voor twee alinea's Engelse en Nederlandse tekst en dat kostte me een hele zondagmiddag.
Gelukkig zijn er computers voor dit soort werk. In deze bijdrage wil ik een programma bespreken dat ik heb geschreven teneinde klaarheid te brengen in deze kwestie. Zoals u in de bijlage kunt zien is het programma kinderlijk van eenvoud. Tot mijn stomme verbazing bleek het met dit programma evenwel mogelijk om zonder enige fout meer dan vijftig talen en dialecten te leren herkennen. Steeds bleek een aantal van 500-800 lettertekens (!) voldoende om de tekst exact te determineren binnen die vijftig talen. Aan uitbreiding van de talenkennis van het programma, dat ik aanvankelijk met enige ironie ‘polyglot’ heb genoemd, wordt driftig gewerkt.
| |
| |
In het onderstaande zal ik eerst globaal aangeven hoe het programma werkt. Vervolgens wil ik u deelgenoot maken van mijn ervaringen bij mijn pogingen de grenzen van de mogelijkheden van het programma te verkennen. Daarna lijkt een nadere toelichting bij de verschillende onderdelen van het programma op zijn plaats. Tot slot wil ik ingaan op toepassingsmogelijkheden van het programma voor filologisch, taalvergelijkend en taaltheoretisch onderzoek.
| |
1. Een sessie met Polyglot
Zodra het programma Polyglot wordt opgestart, verschijnt een menu op het scherm dat de gebruiker de keuze laat tussen twee mogelijkheden:
1. | De computer een taal leren, |
2. | De computer een tekst laten determineren. |
Kiest de gebruiker voor mogelijkheid 1, dan zal het programma vragen naar de naam van het bestand dat de in te lezen tekst bevat en naar de naam van de taal waarin de tekst is gesteld. De teksten die ik aanbood om een taal te leren, hadden een omvang van rond de 3000 lettertekens, ongeveer twee pagina's. ‘leren’ Betekent in dit geval niets meer dan dat de computer voor ieder van de 26 letters van het alfabet uitrekent wat het verschijningspercentage is en de gevonden waarden opslaat onder de naam van de taal. Het programma let daarbij alleen op de gewone letters: accenten en diacritische tekens worden genegeerdGa naar eind2.. Bij talen met afwijkende lettertekens wordt gekozen voor een consequente transcriptie, th voor theta in het Grieks en Etruskisch, en voor thorn in Gothisch, Oudengels en IJslands, d, b en k voor de corresponderende geglottaliseerde consonanten in het Hausa. Daarbij gaat natuurlijk veel informatie verloren: sommige talen vertonen veel ‘echte’ h's, het Grieks vooral ten gevolge van de transcriptie voor theta, chi en phi. Zoals we verderop zullen zien heeft dat voor het herkennen van stukken tekst weinig gevolgen.
Kiest men voor optie 2, (determineren van een tekst) dan vraagt het programma naar de naam van het bestand waarin de te determineren tekst is opgeslagen. Geeft de gebruiker de naam van het bestand dan wordt ook de frequentietabel voor de tekst in dat bestand uitgerekend en vervolgens kijkt het programma welk van de in zijn datebase opgeslagen tabellen het meest overeenkomt met de tabel voor de te determineren tekst.
| |
| |
Dit vergelijken gaat op twee manieren die voor het determineren van teksten in ‘bekende’ talen tot nu toe steeds gelijke resultaten hebben opgeleverd.Ga naar eind3. De eerste, eenvoudigste methode berekent de som van de absolute waarden van de verschillen tussen de percentages in de twee tabellen, door mij somafwijking genoemd, de tweede methode berekent de correlatiecoëfficiënt tussen beide tabellen. Beide vergelijkingsmethodes leveren een reeks numerieke waarden, voor ieder van de bekende talen een, die kunnen worden opgevat als een maat voor de overeenkomst tussen de frequentietabel voor de te determineren tekst en die voor ieder van de bekende talen. De talen met de laagste somafwijking en/of de hoogste correlatiecoëfficiënt worden gekozen als de meest waarschijnlijke kandidaten. Zoals gezegd, steeds wanneer ik het programma een stuk tekst voorlegde in een taal waarvan het al eerder iets onder ogen had gehad, leverden beide maten hetzelfde resultaat. In een nieuwere versie van het programma is ook gebruik gemaakt van de Chikwadraat-toets. Hoewel deze maat vergelijkbare resultaten lijkt te geven, heeft het gebruik van deze test het voordeel dat de gevonden waarden beter interpreteerbaar zijn.
| |
2. Polyglot, een wonderlijk programma
Het algoritme achter Polyglot is zo kinderlijk eenvoudig dat ik me niet kan voorstellen dat niet al iemand anders ooit op het idee gekomen is. Navraag onder taalkundigen leverde evenwel alleen maar verbaasde gezichten en vaak de suggestie eens mijn licht op te steken bij crypto-analytici. Contact met de heer Gelten, verbonden aan de school Militaire InlichtingenDienst te Harderwijk, leerde me dat men daar inderdaad over een grote expertise beschikt op het gebied van lettercounts, maar hij was verbaasd over de eenvoud en de prestaties van het algoritme en duidelijk geïnteresseerd. Hij was zo vriendelijk me een tweetal lijvige boekwerken over het onderwerp te doen toekomenGa naar eind4.. Uit de betreffende publikatie blijkt dat crypto-analytici gewoonlijk gebruik maken van de phi-test om de hypothese dat een bepaalde cryptotekst een substitutie is van een tekst in een bepaalde taal te toetsen tegen de hypothese dat de crypto-tekst een random karakter heeft. Dit is ook in overeenstemming met de opmerking van de heer Gelten dat ‘men meestal wel een idee heeft in welke taal de crypto-tekst gesteld is’. Maar zelfs al zou het algoritme bij crypto-analytici al bekend zijn, het is onder taalkundigen zeker niet algemeen bekend. Dat daar veran- | |
| |
dering in dient te komen, hoop ik u in het onderstaande duidelijk te maken.
Aanvankelijk had ik het schrijven van Polyglot opgevat als niet meer dan een programmeeroefening in Pascal. Nadat ik ‘met de hand’ had uitgerekend dat twee kleine stukjes Nederlandse en Engelse tekst al aardige verschillen te zien gaven, zette ik me aan de oefening. Toen ik eenmaal over een goeddraaiende versie van het programma beschikte, begon ik aanvankelijk bescheiden met een Nederlandse, Engelse, Duitse en Franse tekst, die ik overtypte uit romans. Ik legde steeds een tekst van ongeveer 3000 letters voor ‘ter lering’ en toen het programma vijf talen kende, vroeg ik het teksten van ongeveer 500 lettertekens te determineren die ik voor alle zekerheid uit andere romans koos. De score was 100% goed. Ik begon lichtelijk verbaasd te raken: ik wilde nou de grenzen wel eens leren kennen...
In de spelling van Middelnederlandse teksten komen nogal wat dialecteigenaardigheden tot uitdrukking: daar zou het programma zijn tanden wel op stuk bijten. IJverig zette ik me aan het intikken van een tweetal pagina's uit ‘Van den vos Reinaerde’Ga naar eind5. die ik aan het programma voorlegde als Middelnederlands (R). Vervolgens tikte ik de eerste acht strofen in van het lied ‘Vanden Ouden Hillebrant’Ga naar eind6. die ik aan het programma voorlegde als Middelnederlands (H). De laatste twee strofen van het lied werden feilloos herkend als Middelnederlands (H), terwijl een andere pagina uit ‘Van den vos Reinaerde’ als Middelnederlands (R) werd gedetermineerd. Ik was ronduit verbaasd. Was mijn verbazing wel terecht? De spelling die in het lied ‘Vanden ouden Hillebrant’ wordt gehanteerd, doet veel moderner aan dan die in ‘Van den vos Reinaerde’.
Ik zocht naar andere manieren om de grenzen van de mogelijkheden van het programma te verkennen. Het onderscheid tussen Ionisch en Attisch Grieks, waar de leraar Grieks indertijd zo op gehamerd had, zou het programma daar op stuklopen? Driftig tikte ik de eerste twee pagina's van de Ilias in (de transcriptie lag voor de hand), daarna twee pagina's uit Plato's Euthuphroon en voor alle zekerheid ook maar twee pagina's uit het boekje: ‘Teach yourself modern Greek’. Deze teksten legde ik aan het programma voor als ‘Ionisch Grieks’, ‘Attisch Grieks’ en ‘Modern Grieks’. Een willekekurige passage uit het ‘teach yourself’-boekje werd onmiddellijk als Modern Grieks gekwalificeerd, een pagina uit Plato's Kritoon als ‘Attisch Grieks’. De eerste vijftien versregels uit de Odysseia werden echter ook als Attisch Grieks
| |
| |
bestempeld. Een lichte teleurstelling maakte zich van me meester, totdat ik me realiseerde dat ik de regels van de kansrekening met voeten trad: als ik twee pagina's nodig achtte om een goede schatting te maken van de verdeling van de letterfrequentie in de twee Griekse dialecten, dan zouden er ook twee pagina's nodig zijn om een tekst goed te kunnen determineren; daarbij moest ik het spel wel eerlijk spelen en verdergaan waar ik in de Odysseia was opgehouden. Ik tikte de rest van de eerste pagina in en kon niet nalaten alvast even te kijken wat het programma er nu van dacht. Het bleef nog hardnekkig volhouden dat het om Attisch Grieks ging, maar de correlatiecoëfficiënten waren veel dichter bij elkaar gekomen. Dan maar het maximum: twee pagina's. Nu kwam Polyglot erachter: het ging om Ionisch Grieks. Het programma had Attisch Grieks geleerd door twee willekeurige pagina's uit Plato te lezen, O tempora, O mores! Ik raakte lichtelijk opgewonden.
De tekst waarmee ik het programma Nederlands had geleerd, was afkomstig uit ‘Het roer kan nog zesmaal om’ van Maarten 't Hart. Ik besloot het programma duidelijk te maken dat het hier ‘Nederlands van Maarten 't Hart’ betrof. Een verslag van een vergadering dat ik had gemaakt en dat op diskette beschikbaar was bood ik aan als ‘Nederlands van Geer Hoppenbrouwers’. Ik had nog geen gelegenheid gehad om het programma zeventiende-eeuws te leren. Toen een collega een gedicht van Huygens voorlegde antwoordde het programma dan ook prompt met de boodschap: ‘De tekst is gesteld in het Nederlands van Geer Hoppenbrouwers’. Ik was gevleid. Zo'n snelle leerling had ik nog nooit gehad en hij was aardig bovendien. Nu brak een enerverende tijd aan. Het is bekend dat je hoogbegaafde leerlingen veel te leren moet geven. In een week tijd leerde Polyglot de volgende talen herkennen: Afrikaans, Bahasa Indonesia, Baskisch, Bretons, Catalaans van rond 1350, Catalaans uit de negentiende eeuw, Mandarijn Chinees, Deens (uit een grammatica van 1924, d.w.z. van voor de spellingswijziging), Modern Deens, Modern Duits, Modern Engels, Etruskisch, FaroersGa naar eind7., Fins, Modern Frans, Gothisch, Ionisch Grieks, Attisch Grieks, Modern Grieks, Groenlands, Gronings, Hausa, Hongaars, Modern IJslands, Modern Iers, Modern Italiaans, Japans, Joegoslavisch, Juts, Klassiek Latijn, Manx, Middelengels, Middelnederlands (H), Middelnederlands (R), Modern Nederlands, Modern Noors, Occitaans, Oudengels, Oudfrans, Oudijslands, Modern Perzich, Plattdeutsch, Pools, Portugees (Braziliaans), Roemeens, Sanskriet, Samoa, Schots Gaelic, Setswana, Slowaaks, Spaans, Swahili,
| |
| |
Tsjechisch, Turks, Welsh, en Zweeds.
Steeds tikte ik een tekst in van ongeveer twee pagina's die ik eerst aan het programma voorlegde als te determineren tekst en vervolgens als tekst ‘ter lering’. Bij die determineeropdrachten bleek dat Polyglot ook enig gevoel had voor verwantschap tussen talen: meestal deed hij een goede gok. Als Polyglot de taal geleerd had, legde ik een andere tekst in die taal voor ter determinering. Afgezien van het hierboven besproken geval betreffende het onderscheid tussen Ionisch en Attisch Grieks, bleek een tekst van zo'n tien tot vijftien regels steeds voldoende om de tekst correct thuis te brengen.
Zoals gezegd heeft Polyglot enige aanleg voor vergelijkende taalwetenschap. Wanneer het programma eenmaal een aantal Romaanse talen kent, zal het een tekst in een Romaanse taal die het nog niet kent, steeds identificeren als een van de bekende Romaanse talen. Ook de Germaanse talen klusteren onderling, evenals de Slavische talen. Het Fins is problematisch. Als het programma geen Fins zou kennen, zou het een tekst in die taal determineren als Groenlands, maar van enige verwantschap tussen die twee talen is mij niets bekend.
Bij de Keltische talen zit een probleem. Het is bekend dat Bretonse vissers in Wales begrepen werden als ze hun eigen taal spraken. Toch correleert het Bretons niet met het Welsh en dat weer nauwelijks met de andere Keltische talen. Er spelen hier twee factoren een rol: het programma heeft Bretons geleerd uit een liedjesbundel; het betrof moderne liedjes waarin o.a. de naam van Pompidou veel voorkwam. Ik kan me niet aan de indruk onttrekken dat de daarin gehanteerde orthografie erg op het Frans is gericht. Het Welsh geeft bovendien de sjwa weer d.m.v. een ‘y’. Het is duidelijk: als we Polyglot echt goed willen maken in de vergelijkende taalwetenschap, dan zullen we hem samples in fonologische transcriptie voor moeten leggen. Elders hoop ik verslag te doen van de resultaten van dat onderzoek.
Dat ik reden heb om aan te nemen dat Polyglot voor zijn examen vergelijkende taalwetenschap zal slagen moge het volgende voorval verduidelijken. De Groot (1968: 385)Ga naar eind8. citeert een fabel in het (gereconstrueerde) Indo-Europees van de hand van Schleicher. Deze fabel werd door het programma herkend als Sanskriet (Zie tabel IV). Dit resultaat krijgt meer relief in het licht van de volgende opmerking van De Groot: ‘..als klinkers laat hij (= Schleicher, GH) alleen i, a en u toe, omdat hij meende dat het klinkersysteem van het IE overeenkwam met dat van het Sanskriet, terwijl wij tegenwoordig menen te
| |
| |
Afrikaans: |
som: |
0.51503 |
corr.: |
0.75895 |
Bahasa Indonesia: |
som: |
0.65137 |
corr.: |
0.61595 |
Baskisch: |
som: |
0.59236 |
corr.: |
0.72387 |
Bretons: |
som: |
0.59765 |
corr.: |
0.67335 |
Catalaans (1350): |
som: |
0.32478 |
corr.: |
0.84391 |
Catalaans (1850): |
som: |
0.31575 |
corr.: |
0.87877 |
Chinees (Mandarijn): |
som: |
0.69674 |
corr.: |
0.58305 |
Deens (1924): |
som: |
0.59629 |
corr.: |
0.67145 |
Deens (modern): |
som: |
0.59498 |
corr.: |
0.66425 |
Duits (modern): |
som: |
0.52346 |
corr.: |
0.75832 |
Engels (modern): |
som: |
0.45193 |
corr.: |
0.76295 |
Etruskisch: |
som: |
0.43845 |
corr.: |
0.82703 |
Faroers: |
som: |
0.50658 |
corr.: |
0.76675 |
Fins (1919): |
som: |
0.51823 |
corr.: |
0.79586 |
Frans (modern): |
som: |
0.29289 |
corr.: |
0.88498 |
Gothisch: |
som: |
0.66035 |
corr.: |
0.65298 |
Grieks (Homerus): |
som: |
0.45983 |
corr.: |
0.77853 |
Grieks (Plato): |
som: |
0.49162 |
corr.: |
0.72728 |
Grieks (modern): |
som: |
0.45199 |
corr.: |
0.78591 |
Groenlands: |
som: |
0.53914 |
corr.: |
0.75244 |
Gronings: |
som: |
0.53704 |
corr.: |
0.75788 |
Hausa: |
som: |
0.78903 |
corr.: |
0.49470 |
Hongaars: |
som: |
0.60301 |
corr.: |
0.61738 |
IJslands (modern): |
som: |
0.59605 |
corr.: |
0.65775 |
Iers (modern): |
som: |
0.55848 |
corr.: |
0.69161 |
Italiaans (modern): |
som: |
0.34377 |
corr.: |
0.86541 |
Japans: |
som: |
0.59439 |
corr.: |
0.71695 |
Joegoslavisch: |
som: |
0.43722 |
corr.: |
0.80738 |
Juts: |
som: |
0.69299 |
corr.: |
0.61526 |
Latijn (klassiek): |
som: |
0.00000 |
corr.: |
1.00000 |
Manx: |
som: |
0.63863 |
corr.: |
0.55056 |
Middelengels: |
som: |
0.53298 |
corr.: |
0.71542 |
Middelnederlands (H): |
som: |
0.61089 |
corr.: |
0.67758 |
Middelnederlands (R): |
som: |
0.63518 |
corr.: |
0.65363 |
Nederlands (modern): |
som: |
0.57585 |
corr.: |
0.70833 |
Noors: |
som: |
0.55040 |
corr.: |
0.68016 |
Occitaans: |
som: |
0.34574 |
corr.: |
0.84727 |
Oudengels: |
som: |
0.60159 |
corr.: |
0.64952 |
Oudfrans: |
som: |
0.43213 |
corr.: |
0.76692 |
Oudijslands: |
som: |
0.59143 |
corr.: |
0.61696 |
Perzisch: |
som: |
0.74105 |
corr.: |
0.53073 |
Plattdeutsch: |
som: |
0.57786 |
corr.: |
0.66451 |
Pools: |
som: |
0.56919 |
corr.: |
0.61771 |
Portugees (Brazil): |
som: |
0.40620 |
corr.: |
0.79214 |
Roemeens: |
som: |
0.23877 |
corr.: |
0.93819 |
Samoa: |
som: |
0.66300 |
corr.: |
0.65694 |
Sanskriet: |
som: |
0.72961 |
corr.: |
0.47922 |
Schots Gaelic: |
som: |
0.58113 |
corr.: |
0.59345 |
Setswana: |
som: |
0.66543 |
corr.: |
0.64278 |
Slowaaks: |
som: |
0.49571 |
corr.: |
0.76711 |
Spaans (Europees): |
som: |
0.38805 |
corr.: |
0.82857 |
Swahili: |
som: |
0.66243 |
corr.: |
0.59765 |
Tsjechisch: |
som: |
0.46339 |
corr.: |
0.78042 |
Turks: |
som: |
0.42620 |
corr.: |
0.83991 |
Welsh: |
som: |
0.73576 |
corr.: |
0.42727 |
Zweeds (1928): |
som: |
0.51649 |
corr.: |
0.70020 |
Tabel I Somafwijkingen en correlatiecoefficienten bij determinering Latijnse tekst |
| |
| |
Afrikaans: |
som: |
0.20332 |
corr.: |
0.96722 |
Bahasa Indonesia: |
som: |
0.48852 |
corr.: |
0.57928 |
Baskisch: |
som: |
0.43620 |
corr.: |
0.83791 |
Bretons: |
som: |
0.31324 |
corr.: |
0.88824 |
Catalaans (l350): |
som: |
0.49470 |
corr.: |
0.80347 |
Catalaans (1850): |
som: |
0.44581 |
corr.: |
0.81657 |
Chinees (Mandarijn): |
som: |
0.63574 |
corr.: |
0.58222 |
Deens (1924): |
som: |
0.25158 |
corr.: |
0.95254 |
Deens (modern): |
som: |
0.25672 |
corr.: |
0.95224 |
Duits (modern): |
som: |
0.32424 |
corr.: |
0.89909 |
Engels (modern): |
som: |
0.34900 |
corr.: |
0.85876 |
Etruskisch: |
som: |
0.73959 |
corr.: |
0.57903 |
Faroers: |
som: |
0.49390 |
corr.: |
0.62672 |
Fins (1919): |
som: |
0.58930 |
corr.: |
0.69481 |
Frans (modern): |
som: |
0.36107 |
corr.: |
0.87210 |
Gothisch: |
som: |
0.67374 |
corr.: |
0.47677 |
Grieks (Homerus): |
som: |
0.41955 |
corr.: |
0.85794 |
Grieks (Plato): |
som: |
0.53903 |
corr.: |
0.73766 |
Grieks (modern): |
som: |
0.51956 |
corr.: |
0.75441 |
Groenlands: |
som: |
0.71063 |
corr.: |
0.49718 |
Gronings: |
som: |
0.16665 |
corr.: |
0.97266 |
Hausa: |
som: |
0.76887 |
corr.: |
0.35111 |
Hongaars: |
som: |
0.41216 |
corr.: |
0.81464 |
IJslands (modern): |
som: |
0.47937 |
corr.: |
0.66962 |
Iers (modern): |
som: |
0.56021 |
corr.: |
0.67230 |
Italiaans (modern): |
som: |
0.48889 |
corr.: |
0.75650 |
Japans: |
som: |
0.66790 |
corr.: |
0.58829 |
Joegoslavisch: |
som: |
0.44671 |
corr.: |
0.80649 |
Juts: |
som: |
0.34659 |
corr.: |
0.85004 |
Latijn (klassiek): |
som: |
0.57585 |
corr.: |
0.70833 |
Manx: |
som: |
0.45300 |
corr.: |
0.78492 |
Middelengels: |
som: |
0.35543 |
corr.: |
0.86739 |
Middelnederlands (H): |
som: |
0.21979 |
corr.: |
0.96327 |
Middelnederlands (R): |
som: |
0.30936 |
corr.: |
0.95699 |
Nederlands (modern): |
som: |
0.00000 |
corr.: |
1.00000 |
Noors: |
som: |
0.25966 |
corr.: |
0.94561 |
Occitaans: |
som: |
0.45392 |
corr.: |
0.81736 |
Oudengels: |
som: |
0.37507 |
corr.: |
0.88817 |
Oudfrans: |
som: |
0.46691 |
corr.: |
0.78867 |
Oudijslands: |
som: |
0.44485 |
corr.: |
0.67341 |
Perzisch: |
som: |
0.59744 |
corr.: |
0.53699 |
Plattdeutsch: |
som: |
0.27882 |
corr.: |
0.93822 |
Pools: |
som: |
0.56846 |
corr.: |
0.62676 |
Portugees (Brazil): |
som: |
0.53418 |
corr.: |
0.76863 |
Roemeens: |
som: |
0.49138 |
corr.: |
0.79102 |
Samoa: |
som: |
0.85245 |
corr.: |
0.51741 |
Sanskriet: |
som: |
0.73174 |
corr.: |
0.36471 |
Schots Gaelic: |
som: |
0.66789 |
corr.: |
0.47482 |
Setswana: |
som: |
0.48674 |
corr.: |
0.80170 |
Slowaaks: |
som: |
0.42774 |
corr.: |
0.76284 |
Spaans (Europees): |
som: |
0.46329 |
corr.: |
0.82109 |
Swahili: |
som: |
0.65766 |
corr.: |
0.48576 |
Tsjechisch: |
som: |
0.42107 |
corr.: |
0.81999 |
Turks: |
som: |
0.50420 |
corr.: |
0.70984 |
Welsh: |
som: |
0.55277 |
corr.: |
0.61290 |
Zweeds (1928): |
som: |
0.34685 |
corr.: |
0.81558 |
Tabel II Somafwijkingen en correlatiecoefficienten bij determinering Nederlandse tekst |
| |
| |
Afrikaans: |
som: |
0.51669 |
corr.: |
0.74498 |
Bahasa Indonesia: |
som: |
0.47494 |
corr.: |
0.82794 |
Baskisch: |
som: |
0.50987 |
corr.: |
0.78715 |
Bretons: |
som: |
0.60976 |
corr.: |
0.71151 |
Catalaans (1350): |
som: |
0.51743 |
corr.: |
0.78823 |
Catalaans (1850): |
som: |
0.41248 |
corr.: |
0.86231 |
Chinees (Mandarijn): |
som: |
0.73456 |
corr.: |
0.64537 |
Deens (1924): |
som: |
0.57517 |
corr.: |
0.67920 |
Deens (modern): |
som: |
0.62736 |
corr.: |
0.64704 |
Duits (modern): |
som: |
0.65775 |
corr.: |
0.67635 |
Engels (modern): |
som: |
0.57276 |
corr.: |
0.78160 |
Etruskisch: |
som: |
0.40329 |
corr.: |
0.85282 |
Faroers: |
som: |
0.44351 |
corr.: |
0.84085 |
Fins (1919): |
som: |
0.00000 |
corr.: |
1.00000 |
Frans (modern): |
som: |
0.54119 |
corr.: |
0.75094 |
Gothisch: |
som: |
0.51281 |
corr.: |
0.83477 |
Grieks (Homerus): |
som: |
0.51797 |
corr.: |
0.78642 |
Grieks (Plato): |
som: |
0.48559 |
corr.: |
0.74778 |
Grieks (modern): |
som: |
0.40123 |
corr.: |
0.86712 |
Groenlands: |
som: |
0.35826 |
corr.: |
0.89460 |
Gronings: |
som: |
0.54157 |
corr.: |
0.72966 |
Hausa: |
som: |
0.61073 |
corr.: |
0.77052 |
Hongaars: |
som: |
0.48746 |
corr.: |
0.82192 |
IJslands (modern): |
som: |
0.51577 |
corr.: |
0.75795 |
Iers (modern): |
som: |
0.53938 |
corr.: |
0.79870 |
Italiaans (modern): |
som: |
0.50956 |
corr.: |
0.80850 |
Japans: |
som: |
0.42475 |
corr.: |
0.84964 |
Joegoslavisch: |
som: |
0.56879 |
corr.: |
0.78904 |
Juts: |
som: |
0.53465 |
corr.: |
0.78060 |
Latijn (klassiek): |
som: |
0.51823 |
corr.: |
0.79586 |
Manx: |
som: |
0.75567 |
corr.: |
0.58185 |
Middelengels: |
som: |
0.64983 |
corr.: |
0.68248 |
Middelnederlands (H): |
som: |
0.67381 |
corr.: |
0.62856 |
Middelnederlands (R): |
som: |
0.74744 |
corr.: |
0.57784 |
Nederlands (modern): |
som: |
0.58930 |
corr.: |
0.69481 |
Noors: |
som: |
0.53591 |
corr.: |
0.70208 |
Occitaans: |
som: |
0.50520 |
corr.: |
0.82929 |
Oudengels: |
som: |
0.71036 |
corr.: |
0.64094 |
Oudfrans: |
som: |
0.54918 |
corr.: |
0.78439 |
Oudijslands: |
som: |
0.48676 |
corr.: |
0.77654 |
Perzisch: |
som: |
0.66174 |
corr.: |
0.72385 |
Plattdeutsch: |
som: |
0.55596 |
corr.: |
0.68798 |
Pools: |
som: |
0.64901 |
corr.: |
0.68908 |
Portugees (Brazil): |
som: |
0.61623 |
corr.: |
0.72170 |
Roemeens: |
som: |
0.45966 |
corr.: |
0.85150 |
Samoa: |
som: |
0.56078 |
corr.: |
0.82936 |
Sanskriet: |
som: |
0.66723 |
corr.: |
0.71592 |
Schots Gaelic: |
som: |
0.65378 |
corr.: |
0.66653 |
Setswana: |
som: |
0.51088 |
corr.: |
0.80177 |
Slowaaks: |
som: |
0.48073 |
corr.: |
0.85945 |
Spaans (Europees): |
som: |
0.54693 |
corr.: |
0.77745 |
Swahili: |
som: |
0.51479 |
corr.: |
0.80945 |
Tsjechisch: |
som: |
0.50337 |
corr.: |
0.82177 |
Turks: |
som: |
0.45202 |
corr.: |
0.85957 |
Welsh: |
som: |
0.79794 |
corr.: |
0.49766 |
Zweeds (1928): |
som: |
0.41390 |
corr.: |
0.82643 |
Tabel III Somafwijkingen en correlatiecoefficienten bij determinering Finse tekst |
| |
| |
Afrikaans: |
som: |
0.91644 |
corr.: |
0.24983 |
Bahasa Indonesia: |
som: |
0.58989 |
corr.: |
0.83315 |
Baskisch: |
som: |
0.85671 |
corr.: |
0.53525 |
Bretons: |
som: |
0.88480 |
corr.: |
0.45666 |
Catalaans (1350): |
som: |
0.92630 |
corr.: |
0.46371 |
Catalaans (1850): |
som: |
0.94400 |
corr.: |
0.44947 |
Chinees (Mandarijn): |
som: |
1.09609 |
corr.: |
0.32138 |
Deens (1924): |
som: |
0.82172 |
corr.: |
0.35329 |
Deens (modern): |
som: |
0.86659 |
corr.: |
0.30143 |
Duits (modern): |
som: |
0.97933 |
corr.: |
0.20653 |
Engels (modern): |
som: |
0.88908 |
corr.: |
0.40604 |
Etruskisch: |
som: |
0.93157 |
corr.: |
0.53746 |
Faroers: |
som: |
0.74075 |
corr.: |
0.62855 |
Fins (1919): |
som: |
0.85738 |
corr.: |
0.61128 |
Frans (modern): |
som: |
1.02914 |
corr.: |
0.23848 |
Gothisch: |
som: |
0.70262 |
corr.: |
0.74703 |
Grieks (Homerus): |
som: |
0.91863 |
corr.: |
0.30054 |
Grieks (Plato): |
som: |
0.94914 |
corr.: |
0.29358 |
Grieks (modern): |
som: |
0.82755 |
corr.: |
0.51157 |
Groenlands: |
som: |
0.79126 |
corr.: |
0.66586 |
Gronings: |
som: |
0.93028 |
corr.: |
0.27279 |
Hausa: |
som: |
0.58307 |
corr.: |
0.86469 |
Hongaars: |
som: |
0.78309 |
corr.: |
0.54416 |
IJslands (modern): |
som: |
0.81409 |
corr.: |
0.57081 |
Iers (modern): |
som: |
0.82514 |
corr.: |
0.66224 |
Italiaans (modern): |
som: |
1.03059 |
corr.: |
0.34627 |
Japans: |
som: |
0.77391 |
corr.: |
0.67375 |
Joegoslavisch: |
som: |
0.88305 |
corr.: |
0.42466 |
Juts: |
som: |
0.78687 |
corr.: |
0.59999 |
Latijn (klassiek): |
som: |
1.00436 |
corr.: |
0.36445 |
Manx: |
som: |
0.99114 |
corr.: |
0.28935 |
Middelengels: |
som: |
1.00431 |
corr.: |
0.26043 |
Middelnederlands (H): |
som: |
0.97414 |
corr.: |
0.16228 |
Middelnederlands (R): |
som: |
1.03955 |
corr.: |
0.11911 |
Nederlands (modern): |
som: |
0.89745 |
corr.: |
0.24955 |
Noors: |
som: |
0.84877 |
corr.: |
0.31606 |
Occitaans: |
som: |
0.90798 |
corr.: |
0.51919 |
Oudengels: |
som: |
0.92278 |
corr.: |
0.34587 |
Oudfrans: |
som: |
1.01985 |
corr.: |
0.39889 |
Oudijslands: |
som: |
0.75290 |
corr.: |
0.60085 |
Perzisch: |
som: |
0.56877 |
corr.: |
0.88136 |
Plattdeutsch: |
som: |
0.94023 |
corr.: |
0.24376 |
Pools: |
som: |
1.04130 |
corr.: |
0.32916 |
Portugees (Brazil): |
som: |
0.98205 |
corr.: |
0.46528 |
Roemeens: |
som: |
0.97507 |
corr.: |
0.46439 |
Samoa: |
som: |
0.89086 |
corr.: |
0.72342 |
Sanskriet: |
som: |
0.46503 |
corr.: |
0.90923 |
Schots Gaelic: |
som: |
0.83442 |
corr.: |
0.62302 |
Setswana: |
som: |
0.75844 |
corr.: |
0.58808 |
Slowaaks: |
som: |
0.83630 |
corr.: |
0.53006 |
Spaans (Europees): |
som: |
0.97700 |
corr.: |
0.43182 |
Swahili: |
som: |
0.70790 |
corr.: |
0.82662 |
Tsjechisch: |
som: |
0.89968 |
corr.: |
0.36712 |
Turks: |
som: |
0.92976 |
corr.: |
0.43427 |
Welsh: |
som: |
1.00482 |
corr.: |
0.38364 |
Zweeds(1928): |
som: |
0.74973 |
corr.: |
0.65052 |
Tabel IV Somafwijkingen en correlatiecoefficienten bij determinering IE-tekst van Schleicher |
| |
| |
Afrikaans: |
som: |
0.57525 |
corr.: |
0.61660 |
Bahasa Indonesia: |
som: |
0.62890 |
corr.: |
0.58448 |
Baskisch: |
som: |
0.60736 |
corr.: |
0.72452 |
Bretons: |
som: |
0.59207 |
corr.: |
0.63449 |
Catalaans (1350): |
som: |
0.59021 |
corr.: |
0.63431 |
Catalaans (1850): |
som: |
0.56266 |
corr.: |
0.68051 |
Chinees (Mandarijn): |
som: |
0.63589 |
corr.: |
0.58198 |
Deens (1924): |
som: |
0.68814 |
corr.: |
0.51207 |
Deens (modern): |
som: |
0.71668 |
corr.: |
0.50401 |
Duits (modern): |
som: |
0.69054 |
corr.: |
0.54002 |
Engels (modern): |
som: |
0.51981 |
corr.: |
0.61099 |
Etruskisch: |
som: |
0.70179 |
corr.: |
0.56377 |
Faroers: |
som: |
0.60509 |
corr.: |
0.52150 |
Fins (1919): |
som: |
0.64901 |
corr.: |
0.68908 |
Frans (modern): |
som: |
0.61394 |
corr.: |
0.60157 |
Gothisch: |
som: |
0.75692 |
corr.: |
0.55791 |
Grieks (Homerus): |
som: |
0.48575 |
corr.: |
0.71017 |
Grieks (Plato): |
som: |
0.56875 |
corr.: |
0.66119 |
Grieks (modern): |
som: |
0.48779 |
corr.: |
0.73554 |
Groenlands: |
som: |
0.75777 |
corr.: |
0.57005 |
Gronings: |
som: |
0.54987 |
corr.: |
0.65846 |
Hausa: |
som: |
0.68001 |
corr.: |
0.58124 |
Hongaars: |
som: |
0.46656 |
corr.: |
0.73071 |
IJslands (modern): |
som: |
0.65304 |
corr.: |
0.45526 |
Iers (modern): |
som: |
0.66278 |
corr.: |
0.60041 |
Italiaans (modern): |
som: |
0.48235 |
corr.: |
0.75186 |
Japans: |
som: |
0.61061 |
corr.: |
0.71572 |
Joegoslavisch: |
som: |
0.42742 |
corr.: |
0.75320 |
Juts: |
som: |
0.62195 |
corr.: |
0.62732 |
Latijn (klassiek): |
som: |
0.56919 |
corr.: |
0.61771 |
Manx: |
som: |
0.62824 |
corr.: |
0.55717 |
Middelengels: |
som: |
0.65182 |
corr.: |
0.51364 |
Middelnederlands (H): |
som: |
0.66490 |
corr.: |
0.53956 |
Middelnederlands (R): |
som: |
0.73093 |
corr.: |
0.52897 |
Nederlands (modern): |
som: |
0.56846 |
corr.: |
0.62676 |
Noors: |
som: |
0.67125 |
corr.: |
0.51227 |
Occitaans: |
som: |
0.57492 |
corr.: |
0.67511 |
Oudengels: |
som: |
0.60824 |
corr.: |
0.54932 |
Oudfrans: |
som: |
0.51346 |
corr.: |
0.72063 |
Oudijslands: |
som: |
0.64797 |
corr.: |
0.46798 |
Perzisch: |
som: |
0.69822 |
corr.: |
0.55288 |
Plattdeutsch: |
som: |
0.61630 |
corr.: |
0.55049 |
Pools: |
som: |
0.00000 |
corr.: |
1.00000 |
Portugees (Brazil): |
som: |
0.58768 |
corr.: |
0.69372 |
Roemeens: |
som: |
0.54812 |
corr.: |
0.71492 |
Samoa: |
som: |
0.86298 |
corr.: |
0.61744 |
Sanskriet: |
som: |
0.72909 |
corr.: |
0.50569 |
Schots Gaelic: |
som: |
0.69010 |
corr.: |
0.49882 |
Setswana: |
som: |
0.65788 |
corr.: |
0.66512 |
Slowaaks: |
som: |
0.37037 |
corr.: |
0.78853 |
Spaans (Europees): |
som: |
0.51859 |
corr.: |
0.70970 |
Swahili: |
som: |
0.56141 |
corr.: |
0.66457 |
Tsjechisch: |
som: |
0.38188 |
corr.: |
0.73638 |
Turks: |
som: |
0.48528 |
corr.: |
0.69061 |
Welsh: |
som: |
0.62115 |
corr.: |
0.48775 |
Zweeds (1928): |
som: |
0.62121 |
corr.: |
0.58874 |
Tabel V Somafwijkingen en correlatiecoefficiienten bij determinering Poolse tekst |
| |
| |
Afrikaans: |
som: |
0.53369 |
corr.: |
0.68278 |
Bahasa Indonesia: |
som: |
0.46114 |
corr.: |
0.83438 |
Baskisch: |
som: |
0.50064 |
corr.: |
0.79486 |
Bretons: |
som: |
0.50238 |
corr.: |
0.77485 |
Catalaans (1350): |
som: |
0.60792 |
corr.: |
0.69685 |
Catalaans (1850): |
som: |
0.54129 |
corr.: |
0.76090 |
Chinees (Mandarijn): |
som: |
0.56589 |
corr.: |
0.75800 |
Deens (1924): |
som: |
0.57181 |
corr.: |
0.67352 |
Deens (modern): |
som: |
0.56874 |
corr.: |
0.65012 |
Duits (modern): |
som: |
0.51701 |
corr.: |
0.69631 |
Engels (modern): |
som: |
0.43415 |
corr.: |
0.80547 |
Etruskisch: |
som: |
0.55650 |
corr.: |
0.77156 |
Faroers: |
som: |
0.54423 |
corr.: |
0.76795 |
Fins (1919): |
som: |
0.53938 |
corr.: |
0.79870 |
Frans (modern): |
som: |
0.67632 |
corr.: |
0.62013 |
Gothisch: |
som: |
0.42586 |
corr.: |
0.88769 |
Grieks (Homerus): |
som: |
0.54036 |
corr.: |
0.73436 |
Grieks (Plato): |
som: |
0.57738 |
corr.: |
0.66879 |
Grieks (modern): |
som: |
0.51253 |
corr.: |
0.78779 |
Groenlands: |
som: |
0.57591 |
corr.: |
0.73809 |
Gronings: |
som: |
0.56417 |
corr.: |
0.68428 |
Hausa: |
som: |
0.58010 |
corr.: |
0.78771 |
Hongaars: |
som: |
0.62910 |
corr.: |
0.66061 |
IJslands (modern): |
som: |
0.35893 |
corr.: |
0.89944 |
Iers (modern): |
som: |
0.00000 |
corr.: |
1.00000 |
Italiaans (modern): |
som: |
0.51302 |
corr.: |
0.77284 |
Japans: |
som: |
0.56506 |
corr.: |
0.76900 |
Joegoslavisch: |
som: |
0.60691 |
corr.: |
0.67722 |
Juts: |
som: |
0.47761 |
corr.: |
0.78011 |
Latijn (klassiek): |
som: |
0.55848 |
corr.: |
0.69161 |
Manx: |
som: |
0.59823 |
corr.: |
0.64244 |
Middelengels: |
som: |
0.44760 |
corr.: |
0.72532 |
Middelnederlands (H): |
som: |
0.49765 |
corr.: |
0.66903 |
Middelnederlands (R): |
som: |
0.56281 |
corr.: |
0.62828 |
Nederlands (modern): |
som: |
0.56021 |
corr.: |
0.67230 |
Noors: |
som: |
0.59600 |
corr.: |
0.64219 |
Occitaans: |
som: |
0.48858 |
corr.: |
0.77862 |
Oudengels: |
som: |
0.38062 |
corr.: |
0.78728 |
Oudfrans: |
som: |
0.52794 |
corr.: |
0.71694 |
Oudijslands: |
som: |
0.42875 |
corr.: |
0.81899 |
Perzisch: |
som: |
0.45066 |
corr.: |
0.86581 |
Plattdeutsch: |
som: |
0.58373 |
corr.: |
0.61170 |
Pools: |
som: |
0.66278 |
corr.: |
0.60041 |
Portugees (Brazil): |
som: |
0.53735 |
corr.: |
0.73633 |
Roemeens: |
som: |
0.46467 |
corr.: |
0.80104 |
Samoa: |
som: |
0.63774 |
corr.: |
0.78296 |
Sanskriet: |
som: |
0.64328 |
corr.: |
0.75528 |
Schots Gaelic: |
som: |
0.23641 |
corr.: |
0.93521 |
Setswana: |
som: |
0.59189 |
corr.: |
0.72945 |
Slowaaks: |
som: |
0.55966 |
corr.: |
0.74943 |
Spaans (Europees): |
som: |
0.51316 |
corr.: |
0.77450 |
Swahili: |
som: |
0.56620 |
corr.: |
0.79463 |
Tsjechisch: |
som: |
0.66011 |
corr.: |
0.63812 |
Turks: |
som: |
0.44390 |
corr.: |
0.79139 |
Welsh: |
som: |
0.44584 |
corr.: |
0.71270 |
Zweeds (1928): |
som: |
0.44498 |
corr.: |
0.80662 |
Tabel VI Somafwijkingen en correlatiecoefficienten bij determineren Ierse tekst |
| |
| |
weten dat het Sanskriet de e en o van het IE verloren heeft.’
Om de lezer een indruk te geven van de mate waarin Polyglot taalverwantschappen kan detecteren op basis van de letterfrequenties en om geen hogere verwachtingen te wekken dan gerechtvaardigd is, hebben we een zestal correlatietabellen afgedrukt.
Tabel I geeft de correlaties met de Latijnse tekst. Omdat het dezelfde tekst is als die op basis waarvan het programma Latijn heeft leren herkennen is de somafwijking 0 en de correlatiecoëfficiënt 1. Roemeens heeft de op een na hoogste waarde, gevolgd door een aantal andere Romaanse talen. Merk op dat Turks een hogere correlatie vertoont dan Spaans, maar dat de somafwijking groter is. Hetzelfde geldt voor het Portugees en het Oudfrans. We zien vaker dat de somafwijking een betere indicatie lijkt te zijn voor de verwantschap dan de correlatiecoëfficiënt. Vergelijk ook de waarden voor Modern Grieks en Tsjechisch in tabel V. Tabel II laat zien dat het programma Nederlands het meest verwant acht met het Gronings. Afrikaans en de twee versies van het Middelnederlands volgen.
De tabellen III - VI bevatten de gegevens voor een Finse tekst, de IE-tekst en Schleicher, een Poolse tekst en een Ierse tekst. Een ding zal na bestudering van de tabellen duidelijk zijn: hoge correlatie betekent niet zonder meer hoge verwantschap!
| |
3. Het programma Polyglot nader bekeken
Het mooie van het algoritme achter Polyglot is zijn eenvoud. Iedereen met een beetje programmeerervaring kan het programmeren. Deze paragraaf is bedoeld voor die lezers die uitgaande van het programma zoals het in de bijlage is af gedrukt, een eigen versie willen maken met eventuele verbeteringenGa naar eind9.. Dit programma is geschreven in Turbo-Pascal. Omdat de in- en uitvoerprocedures in standaard ISO-PascalGa naar eind10. niet goed zijn vastgelegd, lossen de verschillende Pascal-versies de problemen die zich hierbij voordoen op verschillende manieren op.
Hieronder zal ik eerst in grote lijnen de opbouw van het programma bespreken. Tot slot geef ik een overzicht van de relevante verschillen met de ISO-standaard. Lezers die vertrouwd zijn met Pascal, kunnen paragraaf 3.1. overslaan.
| |
| |
| |
3.1. De globale opbouw van het programma
Op de eerste pagina van de listing van het programma worden labels (voor goto-verwijzingen), constanten, types en variabelen gedeclareerd. Door de constante MaxAantalTalen op 100 te zetten wordt een bovengrens gegeven aan het maximum aantal talen dat Polyglot kan herkennen. Als een gebruiker wil dat het programma meer verschillende talen aankan, kan hij de waarde voor de constante verhogen, voorzover de geheugenruimte van zijn machine dat toelaat. In het type-declaratie-deel worden een viertal zogenaamde ‘user defined datatypes’ gedefinieerd; een datatype is een manier om informatie op een voor de gebruiker zo handig mogelijke manier op te slaan.
KarakterTabel is zo'n datatype: het is een array dat geïndiceerd wordt met kleine letters van het alfabet en waarvan de velden de waarde van een reëel getal bevatten. Zij Opslag een variabele van het type KarakterTabel, dan kunnen we in Opslag [‘q’] een reëel getal opslaan, bijvoorbeeld 0.002, met in dit programma de betekenis ‘0.2% van de letters in de tekst onder beschouwing zijn q's’.
Reeks is een array-type dat van KarakterTabel alleen hierin verschilt dat dit array enkel gehele getallen als index kan krijgen. Zij Koloml een variabele van het type Reeks en heeft Koloml[1] de waarde 0.15 dan betekent dat in dit programma: ‘De eerste letter van het alfabet maakt 15% van het totaal aantal lettertekens in de onderhavige tekst uit’.
Specificatie is een zogenaamd record-type. Het bestaat uit een naamveld (gedefinieerd als een letterstreng van 20 letters) en een RelatieveLetterFrequentie-veld (gedefinieerd als een KarakterTabel; zie hierboven).
Languages is gedefinieerd als een array met numerieke indices waarvan ieder veld van het type Specificatie is.
Zij Taal een variabele van het type Languages, Taal[i] staat in dit programma dan voor ‘De specificatie voor de i-de taal’; Taal[i]. Naam staat voor de naam van de i-de taal, zeg ‘Spaans’, en Taal[i]. RelatieveLetterFrequentie staat voor het array waarin de numerieke waardes voor de frequentie van de verschillende letterfrequenties in het Spaans worden opgeslagen.
Als Taal[i]. RelatieveLetterFrequentie [‘r’] de waarde 0.05 bevat en Taal[i]. Naam de waarde ‘Spaans’, dan betekent dat ‘5% van de letters in een Spaanse tekst is een r.’ Van de variabelen in het variabelendeclaratiedeel behoeven alleen som en cor enige toelichting:
| |
| |
het zijn arrays waarin de waarde van somafwijking en correlatiecoëfficiënt worden opgeslagen. Als de variabelen Taal[i]. Naam de waarde ‘Spaans’ bevat, dan staat som [i] voor de sommering van de absolute waarden van de verschillen tussen de relatieve letterfrequenties in het Spaans en de te determineren tekst. Cor[i] bevat de correlatiecoëfficiënt voor die twee tabellen.
In het procedure- en functiedeclaratiedeel wordt een aantal functies en procedures gedeclareerd die in het hoofdprogramma i latere procedures worden aangeroepen. Het commentaar in de listing (tussen accolades) zal in de meeste gevallen voldoende duidelijk zijn. ZetOpNul is een procedure waarin allerlei variabelen worden geïnitialiseerd.
Bepaal is een procedure die het aantal al ingelezen talen bepaalt; de procedure kijkt hoeveel Naam-velden van het array Taal niet de nulstreng bevatten en kent de numerieke waarde toe aan de variabele index.
VulOpslag is de belangrijkste procedure in het programma. Hij verwerkt letter voor letter de teksten die ter lering of ter determinering worden aangeboden. Ieder teken (van het type char) wordt ingelezen en toegekend aan de char-variabele c; als het teken in de verzameling letter zit (aan het begin van het hoofdprogramma geïnitialiseerd op alle letters klein en groot van het Latijns alfabet) kijkt de procedure of het om een hoofdletter gaat. Als dat zo is, wordt de waarde van c veranderd in de corresponderende kleine letter. De waarde van het veld opslag[c] wordt vervolgens met 1 verhoogd, evenals de waarde voor de variabele totaal (lees: ‘totaal aantal ingelezen letters’). Als de hele tekst is doorlopen bevat het array opslag voor ieder van de letters van het alfabet een veld waarin is opgeslagen hoe vaak die letter vookomt in de onderhavige tekst. Aan het einde van de procedure wordt dan de relatieve waarde berekend door de gevonden absolute waarde te delen door de waarde voor totaal.
Leertaal is opgebouwd rond de hierboven besproken procedure VulOpslag. Eerst bepaalt het programma hoeveel talen al bekend zijn om bij te kunnen houden in welk veld van Taal[i] de nieuwe gegevens moeten worden opgeslagen. Dan vraagt het naar de naam van de taal die in Taal[i]. Naam wordt opgeslagen en vervolgens wordt de procedure VulOpslag aangeroepen. De in deze procedure bepaalde waardes voor Opslag worden gekopieerd naar Taal[i]. RelatieveLetterFrequentie.
De procedure BepaalSomVerschillen wordt aangeroepen nadat de procedure
| |
| |
VulOpslag een te determineren tekst heeft verwerkt. De gevonden waarden voor het array Opslag worden vergeleken met die voor Taal[i]. RelatieveLetterFrequentie waar i waarden aanneemt van 1 tot het aantal ingelezen talen. Voor iedere taal i wordt de som van de absolute waarden van de verschillen opgeslagen in de array variabele som[i].
De procedure Alfabetiseer is niet wezenlijk maar zorgt ervoor de gegevens voor de verschillende talen alfabetisch worden opgeslagen. De procedure KopieerTabel kopieert een variabele van het type KarakterTabel naar een variabele van het type Reeks.
De functie CorrelatieCoëfficiënt neemt twee variabelen van het type Reeks als argument en komt terug met een real-waarde, namelijk de correlatiecoëfficiënt voor twee tabellen met relatieve letterfrequenties; de eerder gedeclareerde functie StandaardDeviatie is een hulpfunctie die bij de berekening van de correlatiecoëfficiënt wordt gebruikt.
In de procedure BepaalCorrelaties wordt voor iedere taal i de correlatiecoëfficiënt uitgerekend tussen de tabellen Taal[i]. RelatieveLetterFrequentie en Opslag, de gevonden waarden worden voor iedere taal i opgeslagen in Cor[i].
De procedures BepaalKleinsteVerschil en BepaalGrootsteCor zoeken in de array's Som en Cor de kleinste somwaarde en de hoogste correlatiecoëfficiënt. De gevonden waarden worden op het scherm afgedrukt met de mededeling bij welke taal ze horen.
De procedure SlaGegevensOp schrijft relevante gegevens naar diskette, de procedure LeesGegevens leest ze weer in bij het opstarten van het programma. SlaGegevensOp schrijft de gegevens naar twee bestanden op schijf, TAAL.DTA en NUM.DTA. TAAL.DTA bevat, voor iedere taal i, de gegevens van de complexe datastructuur Taal[i] in slechts voor de computer leesbare vorm; NUM.DAT bevat voor iedere ingelezen taal de tabel met de relatieve letterfrequenties en, alleen indien het programma gebruikt is om een tekst te determineren, de tabel met somafwijkingen en correlatiecoëfficiënten voor iedere taal. NUM.DTA kan i.t.t. TAAL.DAT wel door de gebruiker geïnspecteerd worden.
De laatste twee pagina's van de listing bevatten het eigenlijke programma dat nu ook voor lezers die geen Pascal kennen, begrijpelijk moet zijn.
| |
| |
| |
3.2. Verschillen tussen Turbo-Pascal en ISO Standard Pascal.
In drie opzichten is in Polyglot gebruik gemaakt van dialecteigenaardigheden van Turbo-PascalGa naar eind11. die afwijken van de ISO standaard. In de procedure SlaGegevensOp wordt met een enkele write-opdracht een heel record van het type Specificatie weggeschreven, in de ISO-standaard is dit niet mogelijk. Een tweede afwijking betreft het Assignstatement in dezelfde procedure. Met de opdracht assign wordt een relatie gelegd tussen een in het programma gebruikte naam voor een bestand en een op diskette gehanteerde naam, in dit geval tussen geheugen en TAAL.DTA enerzijds en tussen NumData en NUM.DTA anderzijds. De derde afwijking treedt op in de procedure LeesGegevens. De zogenaamde compileroptie {I-} zorgt ervoor dat het programma geen run-time error geeft als de bestandsnaam die de gebruiker opgeeft, niet in de directory van de diskette voorkomt; in plaats van onderbreking van de executie wordt een waarde anders dan nul toegekend aan de variabelen IOresult; in de Boolese uitdrukking (IOresult = 0) wordt vervolgens getest of het bestand bestaat.
| |
4. Mogelijke toepassingen van Polyglot
De meest voor de hand liggende toepassing van Polyglot ligt buiten de theoretische linguïstiek: bij de dienst onbestelbare poststukken van de PTT worden brieven die niet of niet voldoende geadresseerd zijn, geopend om te achterhalen of de inhoud van de brief zelf geen aanwijzingen geeft over afzender of geadresseerde. Het lijkt me waarschijnlijk dat de mensen op die dienst soms met hun handen in het haar zitten als een brief in het Hausa of het Swahili is gesteld. Je kunt zo'n brief natuurlijk pas laten vertalen als je weet naar welke vertaler je toe moet stappen. Wat mooi zou het zijn als na intikken van de inhoud van de brief de mededeling op het scherm zou verschijnen: ‘De brief is gesteld in het Sanskriet, neem contact op met de heer F. Staal’.
Een tweede toepassingsmogelijkheid zie ik in de filologie. Zeker voor geschriften uit periodes waarin duidelijke spellingsafspraken ontbraken en dialecteigenaardigheden in de spelling tot uitdrukking kwamen, lijkt het programma zeer geschikt, temeer daar verfijningen voor de hand liggen. Zo zou men kunnen denken aan een variant waarin niet de 26 letters geteld worden, maar (27 maal 27) digrammen, aa, ab,
| |
| |
ac, ... az, a, ba, bb, ... bz, b, ...za, zb, ... zz, z, waar staat voor een woordgrens.
Minder voor de hand liggende, maar veruit de interessantste toepassingen zie ik evenwel voor de theoretische taalkunde. De volgende vragen dringen zich op:
a) | Hoe gedraagt Polyglot zich als je het programma laat kijken naar bepaalde deelverzamelingen van het alfabet (alleen de klinkers, alleen de medeklinkers, de complete set minus de h, etc.)? Welk is de kleinste deelverzameling van de letters van het alfabet waarmee nog acceptabele resultaten worden behaald? Hoe goed kunnen talen herkend worden louter op basis van de vocaal/consonant-ratio? Deze en dergelijke vragen hoop ik binnenkort elders te bespreken. Een gedeeltelijk antwoord op de eerste vraag wordt onder c. al gegeven. |
b) | Kunnen we Polyglot een beter resultaat voor zijn tentamen Vergelijkende Taalwetenschap laten behalen door hem uit een groot aantal talen samples te geven in een fonologische transcriptie?
We hopen binnenkort eldersGa naar eind12. verslag te doen van de resultaten van de volgende variant van Polyglot: als in het sample van taal i een bepaald foneem voorkomt, wordt niet alleen de teller voor dat foneem met een bepaalde waarde verhoogd, maar daarenboven de teller voor alle fonemen in de natuurlijke klasse(n) waartoe het behoort. Een voorbeeld: komen we in taal i een t tegen dan verhogen we niet alleen de teller voor de t, maar ook die voor de coronalen, de occlusieven etc. in het algemeen.
Het ligt dan voor de hand om de teksten in fonologische notatie waarmee we het programma de verschillende talen hebben geleerd, nog eens aan te bieden. Bij 50 talen beschikken we dan over een matrix van 50 bij 50 correlatiecoëfficiënten waarop we een factor-analyse kunnen toepassen. Als de Indo-Europese talen inderdaad clusteren zoals we dat op grond van de inzichten uit de Indogermanistiek mogen verwachten, beschikken we over een eenvoudig middel om taalverwantschappen in minder goed onderzochte taalfamilies op het spoor te komen. |
c) | Kunnen we Polyglot niet gemakkelijk foppen?
Het antwoord is een volmondig ‘Ja!’. Met Opperlands weet het programma geen raad. De volgende a-saga werd aan het programma aangeboden:
‘A-saga.
|
| |
| |
|
Ga gang na van kaal man. Als dat kan, pak kaal man dan vast. Als man kan gaan, laat man dan naar A'dam gaan, alwaar aan gracht vast praatpaal zal staan. Vacht dan. Vraag aan krant dat krant man haalt.
Alvast dank!’ |
Deze a-saga werd door Polyglot herkend als, hoe kan het anders...
Bahasa.
Te oordelen naar de sommatie van de afwijkingen is dit artikel, exclusief de bijlagen, gesteld in het Nederlands (modern).somafwijking: 0.16768.
Te oordelen naar de correlatiecoëfficiënt is dit artikel,exclusief de bijlagen gesteld in het Nederlands (modern).correlatiecoëfficiëent: 0.98286.
Rijksinstituut voor HBO,
Opleiding tot Vertaler
Maastricht
| |
| |
| |
program Polyglot(input, output, geheugen, tekst, numdata);
label |
100; |
|
const |
MaxAantalTalen = 100 {Maximaal aantal verschillende talen}; |
|
type |
KarakterTabel = array[‘a’ .. ‘z’] of real; |
|
|
Specificatie = record |
|
|
Naam: string[20]; |
|
|
RelatieveLetterFrequentie: KarakterTabel; |
|
|
end; |
|
|
Languages = array[1..MaxAantalTalen] of Specificatie; |
|
|
Reeks = array[1..26] of real; |
|
var |
Opslag: |
|
KarakterTabel; |
|
c: |
|
char; |
|
Taal: |
|
Languages; |
|
AantalIngelezenTalen,
Indexl, Totaal,
verder, i: |
|
integer; |
|
Som, Cor: |
|
array[1..MaxAantalTalen] of real; |
|
Geheugen: |
|
file of Specificatie; |
|
Tekst: |
|
file of char; |
|
Letters, HoofdLetters: |
|
set of char; |
|
FileBestaatAl, Keuzel: |
|
Boolean; |
|
HulpRec: |
|
Specificatie; |
|
FileName: |
|
string[12]; |
|
Numdata: |
|
text; |
procedure ZetOpNul; |
{Hier worden alle velden van Taal[i], Som[i] en Cor[i] op nul gezet} |
var i: integer; |
c: char; |
|
begin |
for i ≔ 1 to MaxAantalTalen do |
begin |
Taal[i].Naam ≔ ''; |
for c ≔ ‘a’ to ‘z’ do |
begin |
Taal[i].RelatieveLetterFrequentie[c] ≔ 0; |
end; |
Som[i] ≔ 0; Cor[i] ≔ 0; |
end; |
end; |
|
procedure Bepaal(var index: integer); |
{Bepaalt aantal ingelezen talen} |
|
var i: integer; |
|
begin |
i ≔ 1; |
while not (Taal[i].Naam = '') do |
begin |
i ≔ i + 1; |
end; |
index ≔ i - 1; |
end; |
| |
| |
procedure VulOpslag; |
|
var c: char; |
|
begin |
for c ≔ ‘a’ to ‘z’ do opslag[c] ≔ 0; totaal ≔ 0; |
repeat |
writeln(‘Geef naam van de input file’); |
readln(Filename); Assign(tekst, FileName); |
{$I-} reset(tekst); {$I+} |
FileBestaatAl ≔ (IOresult = 0); |
if not FileBestaatAl then writeln(‘File bestaat niet.’); |
until FileBestaatAl; |
while not eof(tekst) do |
begin |
read(tekst, c); |
if (c in letters) then |
begin if (c in hoofdletters) then |
begin |
case c of |
‘A’ : c ≔ ‘a’; ‘B’ : c ≔ ‘b’; ‘C’ : c ≔ ‘c’ |
‘D’ : c ≔ ‘d’; ‘E’ : c ≔ ‘e’; ‘F’ : c ≔ ‘f’ |
‘G’ : c ≔ ‘g’; ‘H’ : c ≔ ‘h’; ‘I’ : c ≔ ‘i’ |
‘J’ : c ≔ ‘j’; ‘K’ : c ≔ ‘k’; ‘L’ : c ≔ ‘l’ |
‘M’ : c ≔ ‘m’; ‘N’ : c ≔ ‘n’; ‘O’ : c ≔ ‘o’ |
‘P’ : c ≔ ‘p’; ‘Q’ : c ≔ ‘q’; ‘R’ : c ≔ ‘r’ |
‘S’ : c ≔ ‘s’; ‘T’ : c ≔ ‘t’; ‘U’ : c ≔ ‘u’ |
‘V’ : c ≔ ‘v’; ‘U’ : c ≔ ‘u’; ‘W’ : c ≔ ‘w’ |
‘X’ : c ≔ ‘x’; ‘Y’ : c ≔ ‘y’; ‘Z’ : c ≔ ‘z’ |
end; |
end; |
opslag[c] ≔ opslag[c] + 1; totaal ≔ totaal + 1; |
end; |
end; |
close(Tekst); |
for c ≔ ‘a’ to ‘z’ do opslag[c] ≔ opslag[c] / totaal; |
end; |
|
procedure LeerTaal; |
|
var c: char; |
|
begin |
Bepaal(AantalIngelezenTalen); |
Writeln(‘In welke taal is de tekst gesteld?’); |
Readln(Taal[AantalIngelezenTalen + 1].Naam); |
VulOpslag; |
for c ≔ ‘a’ to ‘z’ do |
begin |
Taal[AantalIngelezenTalen + 1].RelatieveLetterFrequentie[c] ≔ Opslag[c]; |
end; |
end; |
| |
| |
procedure BepaalSomVerschillen; |
|
var i,j: integer; |
c: char; |
|
begin |
for i ≔ 1 to MaxAantalTalen do som[i] ≔ 0; |
i ≔ 1; |
while not (Taal[i].Naam = '') do |
begin |
for c ≔ ‘a’ to ‘z’ do |
begin |
som[i] ≔ som[i] + |
Abs(Taal[i].RelatieveLetterFrequentie[c] - Opslag[c]); |
end; |
i ≔ i + 1; |
end; |
end; |
|
procedure alfabetiseer; |
|
var i, j: integer; |
hulp: specificatie; |
|
begin |
bepaal(AantalIngelezenTalen); |
for i ≔ 1 to AantalIngelezenTalen do |
begin |
for j ≔ i to AantalIngelezenTalen do |
begin |
if (Taal[j].Naam < Taal[i].Naam) then |
begin |
Hulp ≔ Taal[i]; Taal[i] ≔ Taal[j]; Taal[j] ≔ Hulp; |
end; |
end; |
end; |
end; |
|
procedure KopieerTabel(lijst: karaktertabel; var column: reeks); |
|
var cl: char; |
i: integer; |
|
begin |
i ≔ 0; |
for cl ≔ ‘a’ to ‘z’ do |
begin |
i ≔ i + 1; |
column[i] ≔ lijst[cl]; |
end; |
end; |
| |
| |
function StandaardDeviatie(lijst: Reeks): real; |
|
var i: integer; |
gm, som: real; |
|
begin |
gm ≔ 1 / 26; |
som ≔ 0; |
for i ≔ 1 to 26 do |
begin |
som ≔ som + ((lijst[i] - gm) * (lijst[i] - gm)); |
end; |
StandaardDeviatie ≔ Sqrt(Som/i); |
end; |
|
function CorrelatieCoefficient(lijst1, lijst2: reeks): real; |
|
var i: integer; |
sigma1, sigma2, gem1, gem2, som: real; |
|
begin |
som ≔ 0; |
sigma1 ≔ StandaardDeviatie(Lijst1); |
sigma2 ≔ StandaardDeviatie(Lijst2); |
gem1 ≔ 1 / 26; |
gem2 ≔ 1 / 26; |
if ((sigmal = 0) or (sigma2 = 0)) |
then CorrelatieCoefficient ≔ 0 |
else |
begin |
for i ≔ 1 to 26 do |
begin |
som ≔ som + (((Lijst1[i] - gem1) / sigma1) * ((Lijst2[i] - gem2) / sigma2)); |
end; |
CorrelatieCoefficient ≔ som / i; |
end; |
end; |
|
procedure BepaalKleinsteVerschil; |
|
var i: integer; |
KleinsteVerschil: real; |
|
begin |
i ≔ 1; |
KleinsteVerschil ≔ som[i]; Index1 ≔ i; |
while not (Taal[i].Naam = '') do |
begin |
if som[i] < KleinsteVerschil then |
begin |
KleinsteVerschil ≔ som[i]; Index1 ≔ i; |
end; |
i ≔ i + 1; |
end; |
writeln; |
writeln(‘Te oordelen naar de sommatie van de afwijkingen’); |
writeln(‘is de tekst gesteld in het’, Taal[index1].Naam); |
writeln(‘KleinsteVerschil: ’, KleinsteVerschil:8:5); |
end; |
| |
| |
procedure BepaalCorrelaties; |
|
var i, j: integer; |
c: char; |
kolom1, kolom2: reeks; |
|
begin |
KopieerTabel(opslag, koloml); |
i ≔ 1; |
While (not (Taal[i].Naam = '')) do |
begin |
KopieerTabel(Taal[i].RelatieveLetterFrequentie, kolom2); |
Cor[i] ≔ CorrelatieCoeffieient(Kolom1, Kolom2); |
i ≔ i + 1; |
end; |
end; |
|
procedure BepaalGrootsteCor; |
|
var i: integer; |
GrootsteCor: real; |
|
begin |
i ≔ 1; |
GrootsteCor ≔ Cor[i]; Index1 ≔ i; |
while (not (Taal[i + 1].Naam = '')) do |
begin |
i ≔ i + 1; |
if Cor[i] >= GrootsteCor then |
begin |
GrootsteCor ≔ Cor[i]; Index1 ≔ i; |
end; |
end; |
writeln; |
writeln(‘Te oordelen naar de correlatiecoefficient is’); |
writeln(‘de tekst gesteld in het’, Taal[index1].Naam); |
writeln(‘CorrelatieCoefficient:’, Cor[Index1]:8:5); |
end; |
|
procedure LeesGegevens; |
|
var i: integer; |
|
begin |
i ≔ 1; |
Assign(Geheugen, ‘TAAL.DTA’); {$I-} Reset(Geheugen) {$I+}; |
FileBestaatAl ≔ (IOresult = 0); |
if FileBestaatAl then |
begin |
While not EOF(Geheugen) do |
begin |
read(Geheugen, Taal[i]); i ≔ i + 1; |
end; |
close(geheugen); |
end; |
end; |
| |
| |
procedure SlaGegevensOp; |
|
var i: integer; |
c: char; |
|
begin |
i ≔ 1; |
Assign(Geheugen, ‘TAAL.DTA’); Rewrite(Geheugen); |
Assign(NumData, ‘NUM.DTA’); Rewrite(NumData); |
while not ((Taal[i].Naam = '') or (i > MaxAantalTalen)) |
begin |
write(Geheugen, Taal[i]); writeln(NumData); |
writeln(NumData,Taal[i].Naam); writeln(NumData) ; |
for c ≔ ‘a’ to ‘z’ do |
begin |
writeln(NumData, c, '', |
Taal[i].RelatieveLetterFrequentie[c]:8:5); |
end; |
i ≔ i + 1; |
end; |
if (i >= MaxAantalTalen) then |
begin |
writeln(‘Maximum aantal talen overschreden’); |
writeln(‘Verhoog constante MaxAantalTalen’); |
end; |
i ≔ 1; |
while not ((Taal[i].Naam = '') or (i > MaxAantalTalen)) do |
begin |
writeln(NumData,Taal[i].Naam, |
': som: ',som[i]:8:5,' corr.:',cor[i]:8:5); |
i ≔ i + 1; |
end; |
close(Geheugen); close(NumData); |
end; |
|
procedure Menu(var keuze: Boolean); |
|
var i: integer; |
|
begin |
writeln; writeln; |
writeln(‘ MENU’); |
writeln; |
writeln(‘1. Een nieuwe taal leren’); |
writeln(‘2. Tekst determineren’); |
writeln; writeln(‘Maak uw keuze...’); |
readln(i); |
if (i = 1) then keuze ≔ TRUE else keuze ≔ FALSE; |
end; |
|
{* * * Hier begint het eigenlijke programma * * *} |
|
begin |
|
Letters ≔ [‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’, ‘h’, ‘i’, ‘j’, ‘k’, ‘l’, ‘m’, ‘n’, ‘o’, ‘p’, ‘q’, ‘r’, ‘s’, ‘t’, ‘u’, ‘v’, ‘w’, ‘x’, ‘y’, ‘z’, ‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’, ‘H’, ‘I’, ‘J’, ‘K’, ‘L’, ‘M’, ‘N’, ‘O’, ‘P’, ‘Q’, ‘R’, ‘S’, ‘T’, ‘U’, ‘V’, ‘W’, ‘X’, ‘Y’, ‘Z’,]; |
| |
| |
HoofdLetters ≔ [‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’, ‘H’, ‘I’, ‘J’, ‘K’, ‘L’, ‘M’, ‘N’, ‘O’, ‘P’, ‘Q’, ‘R’, ‘S’, ‘T’, ‘U’, ‘V’, ‘W’, ‘X’, ‘Y’, ‘Z’]; |
|
ZetOpNul; {Zet de arrays Taal en Som op nul.} |
LeesGegevens; {Leest gegevens uit bestand taal.dta indien aanwezig} |
Alfabetiseer; {Alfabetiseert het array taal} |
|
{Overzicht bekende talen} |
|
100: writeln; |
writeln(‘De volgende talen ken ik:’); writeln; |
i ≔ 1; |
while not ((i >= MaxAantalTalen) or |
(Taal[i].Naam = '')) do |
begin |
writeln(Taal[i].Naam:20, Taal[i+1].Naam:20, |
Taal[i+2].Naam:20); i ≔ i + 3; |
end; |
writeln; |
Menu(Keuzel); |
{Geeft keuze tussen leren of determineren} |
if Keuzel then begin |
LeerTaal; |
SlaGegevensOp |
end |
else begin |
VulOpslag; |
{leest tekst en legt tabel aan met relatieve letterrequenties} |
BepaalSomVerschillen; |
{vergelijkt gevonden letterfrequenties met die van de bekende talen en berekent somafwijkingen} |
BepaalCorrelaties; |
{vergelijkt gevonden letterfrequenties met die van de bekende talen en berekent de correlatiecoefficient} |
BepaalKleinsteVerschil; |
{Welke taal levert kleinste somafafwijking? Voer naam van die taal uit.} |
BepaalGrootsteCor; |
{Welke taal levert de hoogste correlatiecoefficient? Voer naam van die taal uit.} |
end; |
|
Writeln; |
Writeln(‘Wilt u stoppen, tik dan getal < 0’); |
Writeln(‘Wilt u verdergaan, tik dan getal >= 0’); |
Read(verder); |
If (verder > 0) then goto 100; |
SlaGegevensOp; |
{Slaat gegevens op in de bestanden TAAL.DTA en NUM.DTA; de gegevens in laatstgenoemd bestand kunnen door gebruiker geinspecteerd worden} |
Writeln; |
Writeln(‘Dat was het dan. Dank u en tot ziens!’); |
end. |
|
-
eind1.
- Graag bedank ik hier alle mensen die me op de een of andere manier hebben geholpen bij het tot stand komen van dit artikel: Peggy Marijn, Ton van Reeken, Rob van de Sandt, Pieter Seuren, Ton Weijters, Han van de Staay, de collega's van de Opleiding tot Vertaler en de redactie van Tabu.
-
eind2.
- Om mogelijke misverstanden te vermijden wil ik er hier nadrukkelijk op wijzen dat het weglaten van diacritische tekens niet essentieel is voor het algoritme. Integendeel, het valt te verwachten dat het programma betere resultaten geeft als met dergelijke tekens wel rekening gehouden wordt. Het is eerder verrassend dat Polyglot, in weerwil van het feit dat op deze manier een deel van de informatie verloren gaat, toch nog zulke goede resultaten geeft.
-
eind3.
- Wanneer een tekst werd aangeboden in een nog niet ‘bekende’ taal liepen de resultaten soms wel uiteen. In paragraaf 2. zullen we zien dat de somafwijking een betere maat voor de verwantschap lijkt op te leveren dan de correlatiecoëfficiënt.
-
eind4.
-
Statistische methoden in de cryptoanalyse van S. Kullback, vertaald en bewerkt door E.A. Van Doorn, deel I en II., Harderwijk (1975).
Dit boek bevat niet alleen een schat aan gegevens over letterfrequenties in het Nederlands, Engels, Frans, Duits, Italiaans, Spaans, Portugees, Japans, Pools, Tsjechisch en Russisch, maar ook. over bigram-, trigram- en tetragramfrequenties in Amerikaanse regeringstelegrammen.
-
eind5.
-
Van den vos Reinaerde, uitgegeven door D.C. Tinbergen, 19-de druk, verzorgd doord L.M. van Dis, Wolters-Noordhoff, Groningen 1969.
-
eind6.
- Ornee, W.A. en N.C.H. Wijngaards, Letterkundige bloemlezing I, Thieme, Zutphen, 1969.
-
eind7.
- Voor het Faroers beschikte ik slechts over de vertaling van een gedicht van Simon Vinkenoog. Dientengevolge zijn de letters van het woord ‘provo’ enigszins oververtegenwoordigd.
-
eind8.
- A.W. de Groot, (1986), Inleiding tot de Algemene Taalwetenschap, Tevens Inleiding tot de Grammatica van het Hedendaagse Nederlands. Wolters-Noordhoff, Groningen.
-
eind9.
- Een 5.25" diskette voor MS.DOS-systemen met een gecompileerde versie van het programma alsmede de bestanden TAAL.DTA en NUM.DTA en de sample-teksten van een vijftigtal talen zijn bij de auteur verkrijgbaar (inlichtingen: 043-617967).
-
eind10.
- Zie: Kathleen Jensen en Niklaus Wirth, Pascal User Manual and Report, third edition, ISO Pascal Standard, revised by Andrew B. Mickel and James F. Miner, Springer-Verlag, New York, Berlin, Heidelberg, Tokyo.
-
eind11.
- Polyglot herkent wel Pascal als een taal tussen het Engels en het Nederlands, mits niet te veel commentaar en niet te lange variabelen. Ik heb nog geen tijd gehad om na te gaan of het in staat is programma's in Turbo-Pascal te onderscheiden van programma's in ISO Standard Pascal.
-
eind12.
- Hoppenbrouwers, C. en Hoppenbrouwers, G. (in voorbereiding), A simple measure for relatedness of languages.
|