Skiplinks

  • Tekst
  • Verantwoording en downloads
  • Doorverwijzing en noten
Logo DBNL Ga naar de homepage
Logo DBNL

Hoofdmenu

  • Literatuur & taal
    • Auteurs
    • Beschikbare titels
    • Literatuur
    • Taalkunde
    • Collectie Limburg
    • Collectie Friesland
    • Collectie Suriname
    • Collectie Zuid-Afrika
  • Selecties
    • Collectie jeugdliteratuur
    • Basisbibliotheek
    • Tijdschriften/jaarboeken
    • Naslagwerken
    • Collectie e-books
    • Collectie publiek domein
    • Calendarium
    • Atlas
  • Periode
    • Middeleeuwen
    • Periode 1550-1700
    • Achttiende eeuw
    • Negentiende eeuw
    • Twintigste eeuw
    • Eenentwintigste eeuw
Tabu. Jaargang 17 (1987)

Informatie terzijde

Titelpagina van Tabu. Jaargang 17
Afbeelding van Tabu. Jaargang 17Toon afbeelding van titelpagina van Tabu. Jaargang 17

  • Verantwoording
  • Inhoudsopgave



Genre

sec - taalkunde

Subgenre

tijdschrift / jaarboek


In samenwerking met:

(opent in nieuw venster)

© zie Auteursrecht en gebruiksvoorwaarden.

Tabu. Jaargang 17

(1987)– [tijdschrift] Tabu–rechtenstatus Auteursrechtelijk beschermd

Vorige Volgende
[pagina 1]
[p. 1]

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.

[pagina 2]
[p. 2]

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.

[pagina 3]
[p. 3]

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-

[pagina 4]
[p. 4]

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

[pagina 5]
[p. 5]

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,

[pagina 6]
[p. 6]

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

[pagina 7]
[p. 7]

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

[pagina 8]
[p. 8]

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

[pagina 9]
[p. 9]

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

[pagina 10]
[p. 10]

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

[pagina 11]
[p. 11]

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

[pagina 12]
[p. 12]

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

[pagina 13]
[p. 13]

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.

[pagina 14]
[p. 14]

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:

[pagina 15]
[p. 15]

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

[pagina 16]
[p. 16]

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.

[pagina 17]
[p. 17]

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,

[pagina 18]
[p. 18]

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.
[pagina 19]
[p. 19]

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

[pagina 21]
[p. 21]

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;
[pagina 22]
[p. 22]
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;
[pagina 23]
[p. 23]
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;
[pagina 24]
[p. 24]
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;
[pagina 25]
[p. 25]
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;
[pagina 26]
[p. 26]
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’,];
[pagina 27]
[p. 27]
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.

Vorige Volgende

Footer navigatie

Logo DBNL Logo DBNL

Over DBNL

  • Wat is DBNL?
  • Over ons
  • Selectie- en editieverantwoording

Voor gebruikers

  • Gebruiksvoorwaarden/Terms of Use
  • Informatie voor rechthebbenden
  • Disclaimer
  • Privacy
  • Toegankelijkheid

Contact

  • Contactformulier
  • Veelgestelde vragen
  • Vacatures
Logo DBNL

Partners

Ga naar kb.nl logo KB
Ga naar taalunie.org logo TaalUnie
Ga naar vlaamse-erfgoedbibliotheken.be logo Vlaamse Erfgoedbibliotheken

Over dit hoofdstuk/artikel

auteurs

  • Geer Hoppenbrouwers


taalkunde

  • Dialectologie

  • Taalverwerving / Psycholinguïstiek