You are on page 1of 10

Datacompressie en Afrikaanse taalstructuren

Stijn Lamers, student T&C


Luuk Stoop, student BDM
Universiteit van Tilburg
S.G.F.Lamers@uvt.nl
L.D.J.Stoop@uvt.nl

10 mei 2007

Abstract

In dit paper wordt onderzocht welke Afrikaanse taalfamilies te onderscheiden


zijn. Hierbij wordt gebruik gemaakt van gzip-compressie in Unix. Middels het
programma PuTTy is het mogelijk om teksten door middel van een script (een
commando voor de computer) aan elkaar te koppelen in een gecomprimeerd
bestand.

Aan de hand van deze gecomprimeerde bestanden is het mogelijk om taalfamilies


te herkennen. De huidige generatie zip-programma’s maakt gebruik van een
woordenlijst, waarin alle woorden van een tekst voorkomen, en nummers, om de
woorden in de tekst zelf mee te vervangen. De gouden regel hierbij luidt: hoe
kleiner het bestand, hoe meer de teksten op elkaar lijken. Een woord dat in beide
teksten voorkomt hoeft immers maar één keer gecategoriseerd te worden.

1 Introductie

1.1 Inleiding
Van het ene verschijnsel maken we allemaal dagelijks gebruik, van het andere verschijnsel op
zijn minst wekelijks. We hebben het hier over taal en datacompressie. Taal is essentieel om
actief deel te kunnen nemen aan onze maatschappij en om te kunnen overleven.
Datacompressie lijkt op het eerste gezicht minder prominent aanwezig in onze samenleving,
maar schijn bedriegt. Veel computerprogramma’s maken zonder dat je het zelf door hebt
gebruik van datacompressie. Daarnaast maken veel computergebruikers bewust gebruik van
datacompressie met behulp van programma’s als WinZip en WinRar, om nog maar te zwijgen
van de miljoenen mp3-spelers die dagelijks gebruikt worden. Een mp3-file is namelijk ook
niets meer dan een gecomprimeerde versie van een originele, analoge geluidsgolf. Hieronder
proberen we een beknopt doch doeltreffend beeld te schetsen van wat datacompressie is, hoe
het werkt, en wat er al aan onderzoek naar is gedaan.

1
1.1.1 ZIP: een introductie
Om grote bestanden via het internet te verzenden wordt vaak gebruik gemaakt van ZIP-files.
Kortweg komt het er op neer dat een ZIP-file een kleine versie is van een bestand. De
ontvanger kan dit bestand vervolgens uitpakken (middels programma’s als WinZip en
WinRar) en zien zoals het bestand er oorspronkelijk uitzag (meer hierover verderop) en met
de oorspronkelijke grootte.

Andere digitale voorbeelden die gebruik maken van ditzelfde principe zijn .mp3, .jpg en
.mpeg.

Bij compressie wordt gebruik gemaakt van algoritmen. Een algoritme is een set regels plus de
hiërarchische ordening daarvan, die door de computer verwerkt worden. Een recept is
bijvoorbeeld een algoritme (Wikipedia: Algoritme). Het beschrijft verschillende processen die
in een min of meer vaste volgorde afgewerkt moeten worden. Zo is het verstandig om het
water pas aan de kook te brengen als het ei erin zit. Sommige processen, zoals het ei uit de
eierdoos halen en de pan pakken, zijn niet gebonden aan een vaste volgorde.

1.1.2 Lossy compressie


Er zijn twee soorten datacompressie: lossy en lossless. Zoals de namen al enigszins doen
vermoeden heb je bij lossy te maken met enige vorm van dataverlies, en bij lossless niet.
Lossy compressie elimineert overbodige ruimte binnen het bestand om deze zodoende kleiner
te maken. Dit heeft een zeer minimaal effect op de verwerking van het bestand (je hoort het
niet bij mp3’s; je ziet het niet op .jpg afbeeldingen), maar verkleint de bestandsgrootte
aanzienlijk. Bestanden die er baat bij hebben om in exact dezelfde vorm te blijven bestaan
(zoals tekstbestanden) zijn dus niet geschikt om lossy gecomprimeerd te worden.

1.1.3 Lossless compressie


Bij lossless compressie heb je te maken met algoritmes, die de informatie in het doelbestand
groeperen, sorteren en zodoende ordenen. Het bestand wordt verkleind en kan weer exact
gereproduceerd worden zonder enig verlies van data.
Maar hoe is het mogelijk om een bestand te verkleinen, te versturen, en weer uit te pakken tot
haar oorspronkelijke grootte? De truc hier is een fenomeen met de naam ‘redundantie’
(Harris: http://www.howstuffworks.com/file-compression1.htm).

Vandale.nl spreekt van een overvloed aan gegevens. Het volgende voorbeeld kan dit
duidelijker aangeven.

‘Ask not what your country can do for you – ask what you can do for your country.’ Deze
uitspraak is afkomstig van John F. Kennedy in zijn inaugurele rede van 1981 (Harris). Als we
gaan turven zien we dat ieder woord 2 keer voorkomt. De helft van de tekst is dus redundant.

Twee bekende vormen van lossless datacompressie zijn die van Lempel Ziv, en van David
Huffman. We zullen nu aan de hand van het Kennedy-voorbeeld gaan kijken hoe Huffman en
Lempel Ziv Welch werken in het comprimeren.

1.1.4 Huffman codering


David Huffman’s manier van coderen (1952) is een vorm van lossless compressie. Gebaseerd
op de gegevens van de taal van het bestand (het gaat hier dus om tekstbestanden) wordt een

2
frequentielijst opgesteld van de letters van de taal. Hoe vaker een symbool voorkomt, hoe
kleiner de code deze letter krijgt. Het coderingsprincipe is binair en werkt als volgt (deel van
de frequentielijst van het Nederlands, gevonden op
http://www.onzetaal.nl/advies/letterfreq.html):

1. E 18,91 %
2. N 10,03 %
3. A 7,49 %
4. T 6,79 %
5. I 6,50 %
6. R 6,41 %
7. O 6,06 %

We beginnen met de E. Deze krijgt de code ‘0’. N is de volgende, deze krijgt ‘1’. De lijst
codes werkt altijd hetzelfde: eerst worden alle codes die mogelijk zijn gegeven 0 en 1
afgewerkt die 1 bit (1 karakter) beslaan. In dit geval zijn dat alleen 0 en 1, omdat er niet meer
mogelijk is. Vervolgens gebeurd hetzelfde voor 2 karakters (de keuzes zijn dan 00, 01, 10,
11), voor 3 karakters, en zo verder tot alle karakters die in het doelbestand voorkomen een
code hebben. Door het gebruik van kortere codes voor meer voorkomende letters is het
mogelijk om data te comprimeren: de letter ‘E’ is in ASCII code 1 byte (oftewel 8 bits) groot.
Nadat je er Huffman op loslaat is de ‘E’ nog maar 1 bits groot – een winst van 7 bits, oftewel
83%.

1.1.5 Lempel Ziv (Welch)


Abraham Lempel en Jacob Ziv zijn in 1977 met een compressiemethode gekomen die gebruik
maakt van een gecatalogiseerde bibliotheek van data. Voluit heet deze methode de adaptive
dictionary-based algorithm (Harris). Kort gezegd wordt er van een bestand een lijst gemaakt
van alle woorden die erin zitten. Deze worden genummerd, en het doelbestand wordt dus een
tekst waar alleen maar getallen in staan.

In 1984 hebben Lempel en Ziv samengewerkt met Terry Welch aan een verbeterde versie. In
plaats van woorden ging deze compressiemethode uit van veel voorkomende patronen, niet
zozeer woorden op zich.

Omdat de LZ (Lempel Ziv) methode (later de LZW (Lempel Ziv Welch) methode) de meest
gebruikte is zullen we hier meer aandacht aan besteden.

Voor het Kennedy-voorbeeld zou de woordenlijst er als volgt uit zien:

1. ask
2. what
3. your
4. country
5. can
6. do
7. for
8. you

(Opmerking: ‘not’ is niet opgenomen in de lijst omdat dit een booleaanse operator is.)

3
De zin ziet er dan als volgt uit: “1 not 2 3 4 5 6 7 8 – 1 2 8 5 6 7 3 4.” Deze zin op zich is,
inclusief de database, amper gecomprimeerd te noemen. Maar met elke zin die erbij komt
wordt het percentage gecomprimeerde bits groter: er zullen woorden voorkomen die al in de
database stonden, en die dus geen nieuwe ‘entry’ meer nodig hebben.

De huidige datacompressie-toepassingen doen dit proces volledig automatisch. Het grote


verschil is dat er geen ‘echte’ bibliotheek wordt opgebouwd, maar een verzameling van (veel)
voorkomende frases. Hierbij is de compressie niet gelimiteerd tot woorden, maar zoekt deze
enkel patronen: dat kúnnen woorden zijn, maar meestal zijn het onderdelen van woorden,
soms met een spatie of leesteken.

1.1.6 ZIP en talen


De patronen brengen ons op het volgende onderwerp, namelijk talen. Ook in talen komen
patronen voor. Elke taal heeft vaste opeenvolgingen van woorden en/of klanken, de een meer
dan de ander. Dit laatste opvallende weetje is de sleutel in datacompressie als het gaat om
talen. Door een stuk tekst te pakken (liefst een identiek stuk tekst) in verschillende talen, kan
men kijken – door enkel het gezipte bestand te zien – welke talen op elkaar lijken. Als er twee
talen zijn die veel op elkaar zouden lijken, is dat middels ZIP eenvoudig te controleren:
komen de bestandsgrootten een beetje overeen, dan zijn ze inderdaad gelijkend.

1.1.7 Taal
Zoals gezegd maakt iedereen elke dag gebruik van taal, en ondanks het feit dat taal een van de
meest complexe systemen is die we kennen, kan (bijna) iedereen het leren. Wat taal zo
moeilijk maakt is dat de relatie tussen een woord en haar betekenis volledig arbitrair is,
onomatopeeën uitgesloten. Er is geen enkele zinnige reden dat we een stoel stoel noemen en
een tafel tafel, het omgekeerde was namelijk ook acceptabel geweest. Daarnaast stelt de
grammatica de mens in staat deze woorden te combineren tot een oneindig aantal mogelijke
zinnen. Een lichtpuntje dat deels door de regels van de grammatica wordt verschaft is dat we
in taal altijd structuur aantreffen. Deze patronen treffen we op alle niveaus van een tekst aan.
Zo zit er structuur in de tekst als geheel, maar ook binnen de alinea’s, binnen de zinnen, en
zelfs binnen de woorden. Zo wijkt de zinsstructuur van het Engels vaak sterk af van die van
het Nederlands en komt de lettercombinatie sch in het Nederlands en Duits veel vaker voor
dan in het Frans.
Deze patronen herhalen zich constant en zijn voor zowel mensen als computers te herkennen.
Het is bekend dat het mogelijk is om deze patronen ‘af te korten’ en zo opslagruimte te
besparen, maar misschien kan datacompressie ook nog voor andere doeleinden gebruikt
worden. Dat laatste willen we in deze paper onderzoeken.1

1.1.8 Eerder onderzoek


Zonder uitzondering zijn structuren in alle talen terug te vinden. Er zijn een aantal universele
taalstructuren, en er zijn structuren die gezien kunnen worden als eigen aan een bepaalde taal.
Dit laatste stelt ons in staat vast te stellen in welke taal een bepaald document geschreven is
zonder het document te openen.

Wanneer we bijvoorbeeld een tekst hebben die Nederlands óf Frans kan zijn, kunnen we
erachter komen welke van de twee het is door deze tekst toe te voegen aan zowel een zip van
een Frans corpus als een zip van een Nederlands corpus. Als de tekst Nederlands is zal de

1
Neijt et al, Universele Taalkunde, Dordrecht, 1994

4
grootte van de Nederlandstalige zip minder toenemen dan de grootte van de Franse zip. Dit
komt doordat het zip-programma in de Nederlandse tekst patronen herkent die hij al eerder
heeft gezien in de andere Nederlandse teksten. Als de Nederlandse tekst aan de zip-file van
het Franse corpus wordt toegevoegd moet het programma als het ware een andere taal leren.

Het is in eerder onderzoek al bewezen dat zip-programma’s inderdaad kunnen helpen bij het
identificeren van talen. Het bleek zelfs mogelijk om de schrijver van een document te
achterhalen aan de hand van teksten van een beperkt aantal schrijvers. Zo werd met behulp
van een zip-programma bewezen dat schrijver Marek van der Jagt dezelfde persoon is als
Arnon Grunberg. De schrijver en zijn pseudoniem maakten dus blijkbaar gebruik van
bepaalde woorden en zinsstructuren die zoveel op elkaar leken dat ze wel van dezelfde hand
moesten zijn.

Het woordgebruik en de opbouw van een tekst is logischerwijs in eerste instantie afhankelijk
van de taal waarin de tekst is geschreven, maar ook het onderwerp van een tekst bepaalt mede
het vocabulaire en de structuur van de tekst. Zo wordt het dus mogelijk om een
computerprogramma onderscheid te laten maken tussen teksten op basis van hun onderwerp,
een eigenschap die voor zoekmachines wellicht interessant is.2

Een ander onderzoek laat zien hoe je een zip-programma als spamfilter kun laten fungeren. Je
neemt een lijst met zogenaamde spam e-mails en zipt deze tot een bestand met grootte S.
Vervolgens comprimeer je een lijst met ‘echte’ e-mails (ham) tot een bestand met grootte H.
Een nieuwe e-mail, waarvan het niet bekend is of het spam of ham is, wordt aan beide zip-
files toegevoegd en vormt daarmee de bestanden HT en HS. De e-mail wordt dan
gekwalificeerd als ham wanneer HT – H < ST – S.

WinRar schijnt hier overigens geschikter voor te zijn dan WinZip. We mogen daarom
aannemen dat de logaritmen waarmee WinRar werkt beter aansluiten bij de structuur van taal
dan de logaritmen die door WinZip gebruikt worden.

Het is bij het toepassen van deze techniek dus van wezenlijk belang dat de efficiëntie van de
compressie nauwkeurig wordt gemeten. Daarnaast bleek uit onderzoek dat de methode beter
werkt bij langere teksten, omdat de kans op terugkerende patronen dan groter is.

1.2 Vraagstelling
Kunnen we door middel van datacompressie taalfamilies onderscheiden binnen de 10 officiële
Afrikaanse talen?

1.3 Hypothese
We verwachten een significant verschil in de groottes van de zip-bestanden te vinden waaruit
we verschillende taalfamilies af kunnen leiden. Zo is het bijvoorbeeld zeer voor de hand
liggend dat Nederlands en Afrikaans samen een klein zip-bestand vormt, wat hun relatie
aangeeft.

2
http://unisci.com/stories/20021/0204024.htm

5
2 Methode

2.1 Corpus
Het belangrijkste kenmerk van het corpus moet zijn dat de teksten die erin voorkomen
vergelijkbaar zijn. Daarom is hier gekozen voor de Universele Verklaring voor de Rechten
van de Mens. Naast het feit dat de teksten allemaal dezelfde inhoud hebben, zijn deze teksten
ook gratis en eenvoudig verkrijgbaar in alle officiële talen van de wereld
(http://www.unhchr.ch/udhr/navigate/alpha.htm).

We hebben gekozen voor de officiële Afrikaanse talen volgens Wikipedia


(http://nl.wikipedia.org/wiki/De_elf_offici%C3%ABle_talen_van_Zuid-Afrika), met
uitzondering van Engels, omdat deze taal als vanzelfsprekend ver af staat van de ‘echte’
Afrikaanse talen.

Deze talen zijn:


• Afrikaans
• Ndebele
• Noord-Sotho
• Swazi / Siswati
• Tsonga
• Tswana
• Venda (deze taal was niet in de lijst te vinden)
• Xhosa
• Zulu

Deze talen hebben we opgezocht op eerdergenoemde site, en vervolgens opgeslagen in Joe


(de tekstverwerker van PuTTy / Unix). We hebben elk bestand de extensie .snl (deze was zelf
verzonnen en staat voor ‘Stijn (e)n Luuk’) gegeven, omdat de manier van werken dit vereiste
(i.e. dat alle bestanden eenzelfde, niet-bestaande extensie hebben).

Enkele teksten bleken te lang in kladblokformaat. Op deze manier is het moeilijk oordelen:
het zijn dan wel dezelfde teksten, maar als ze significant in omvang verschillen, is vergelijken
een moeilijk karwei.

Om dit te verhelpen zijn we uit gegaan van de kleinste tekst, en alle andere teksten hebben we
daarom verkleind – één alinea per keer, totdat de teksten in omvang veel meer op elkaar leken
dan voorheen.

De kleinste tekst vóór deze aanpassingen was de Ndebele (9069 bytes), en de grootste was
Swazi / Siswati (17026 bytes). Na de veranderingen was de kleinste Zulu (9568 bytes). De
grootste was Sotho (10401 bytes).

2.2 Verwerking in Gzip


Nadat we alle afzonderlijke teksten hebben ingevoerd, hebben we de teksten onderworpen aan
een computatie. Het doel van deze computatie was om een gecomprimeerd bestand te maken
(in dit geval .gzip) voor elke mogelijke talencombinatie. Doel van dit alles zoeken naar
gelijkenissen binnen de talen. De theorie zegt dat een .zip bestand kleiner wordt naarmate de

6
talen meer op elkaar gaan lijken. Het zip-programma hoeft minder woorden / structuren te
categoriseren en daarom kan er een groter percentage gecomprimeerd worden.

Dit gebeurde middels het volgende script:

for x in *.snl ; do
for y in *.snl ; do
cat $x $y > $x.$y
gzip $x.$y
done
done

Vervolgens kregen we een lijst waar, op alfabetische volgorde, aller taalcombinaties


uitkwamen plus de bestandsgrootte van elk paar. Hiervoor gebruikten we:

dir *.snl.gz | awk '{print $5,$8}' –

Hieruit kwam een lijst met elke mogelijke taalcombinatie (inclusief twee keer dezelfde taal in
eenzelfde bestand. Bestandsnamen zagen er uit als ‘Taal1.snl.Taal2.snl.gz’.

Voor elke taal hebben we vervolgens gekeken wat de kleinste en wat de grootste combinatie
was, en per taal de grootte van elk zipbestand genoteerd. Vervolgens zijn we op zoek gegaan
naar structuur in de data.

3 Resultaten
In tabel 1 zijn resp. de originele bestandsgroottes, de gezipte bestandsgroottes, en de
compressiepercentages te vinden per taal weergegeven.

Tabel 1

Taal Bestandsgrootte Bestandsgrootte gezipt Compressiepercentage*

Afrikaans 9584 3628 62,15 %


Ndebele 9917 3434 65,37 %
Nederlands 9726 3628 62,70 %
Noord-Sotho 9743 3355 65,57 %
Sotho 10401 3505 66,30 %
Swazi / Siswati 10234 3938 61,52 %
Tsonga 10078 3537 64,90 %
Tswana 10130 3426 66,18 %
Xhosa 10127 3736 63,11 %
Zulu 9568 3690 61,43 %
* percentage van de originele bestandsgrootte

7
In tabel 2 staan alle bestandsgroottes nadat de twee aangegeven teksten samen gezipt zijn.

Tabel 2

AFR NDB NED NSO SOT SWA TSO TSW XHO ZUL
AFR 3628 6738 6543 6646 6800 7235 6849 6725 7047 7005
NDB 6740 3434 6730 6469 6607 6890 6633 6535 6590 6449
NED 6539 6732 3628 6644 6799 7230 6847 6733 7034 6995
NSO 6647 6451 6646 3355 6309 6959 6572 6196 6767 6722
SOT 6800 6595 6800 6301 3505 7095 6716 6350 6903 6862
SWA 7233 6852 7226 6959 7111 3938 7136 7035 7205 7059
TSO 6849 6613 6847 6573 6716 7106 3537 6637 6938 6866
TSW 6728 6512 6728 6196 6353 7015 6639 3426 6828 6789
XHO 7042 6564 7027 6771 6901 7214 6941 6830 3736 6751
ZUL 7005 6447 6999 6738 6876 7098 6905 6800 6767 3690

In tabel 3 is telkens aangeven, voor elke taal, welke zip het grootste bestand opleverde, en
welke het kleinste.

Tabel 3

Grootste zip met Kleinste zip met


Afrikaans Swazi/Siswati Nederlands
Ndebele Swazi/Siswati Zulu
Nederlands Swazi/Siswati Afrikaans
Noord-Sotho Swazi/Siswati Tswana
Sotho Swazi/Siswati Noord-Sotho
Swazi/Siswati Afrikaans Ndebele
Tsonga Swazi/Siswati Ndebele
Tswana Swazi/Siswati Noord-Sotho
Xhosa Swazi/Siswati Ndebele
Zulu Swazi/Siswati Ndebele

4 Conclusie en discussie
Het eerste wat opvalt als we naar Tabel 3 kijken is dat Swazi/Siswati een taal is die blijkbaar
sterk afwijkt van de andere 9 talen. Het originele bestand van deze taal was namelijk niet eens
het grootst, maar levert in combinatie met elk van de andere talen wel duidelijk de grootste
zip-bestanden op. Uit Tabel 1 blijkt ook dat Swazi/Siswati op zich een vrij moeilijk te
comprimeren taal is, slechts 61,5%.

Daarnaast blijkt uit Tabel 3 dat Ndebele vrij goed te comprimeren is met de talen
Swazi/Siswati, Tsonga, Tswana, Xhosa en Zulu. Ook Noord-Sotho is aardig te zippen met

8
andere talen: deze taal komt twee keer als kleinste uit de bus in combinatie met de talen Sotho
en Tswana.

Wat verder opvalt is de bevestiging van ons vermoeden dat Nederlands en Afrikaans goed
samen gaan. Wanneer Nederlands en Afrikaans samen gezipt worden levert dit de kleinste
zip-bestanden op. Ook wanneer een andere taal gezipt wordt met Afrikaans of Nederlands
lijken de bestandsgroottes van de zip-bestanden op elkaar.

Verder viel het ons op dat het zippen van twee talen verschillende bestandsgroottes op kan
leveren, afhankelijk van de volgorde waarin zij gezipt worden. Zo is de grootte van de zip
ndebele.snl.afrikaans.snl.gz niet gelijk aan afrikaans.snl.ndebele.snl.gz.

Wanneer we kijken naar de rijen en kolommen van Tabel 2 lijken de bestandsgroottes van
sommige zip-bestanden per taal overeen te komen. Zo lijken Xhosa en Zulu, Ndebele en
Tswana, en Sotho en Tsonga onderling overeen te komen. Helaas zijn de verschillen in
bestandsgrootte voor alle zip-bestanden zo miniem dat we geen significante conclusies
hieraan kunnen verbinden.

Tot slot dient de vraag zich aan, in hoeverre we conclusies kunnen verbinden aan een
wiskundige manier van talen ordenen. Is het betrouwbaar om uit te gaan van woorden en
zinsconstructies, om hier vervolgens over te oordelen? Zijn dit alle kenmerken die nodig zijn
bij het herkennen van taalverschillen, en is zip daadwerkelijk in staat om dit in overweging te
nemen? We zijn geneigd om hier ‘nee’ te zeggen, temeer omdat we behalve de écht voor de
hand liggende paren (zoals Nederlands en Afrikaans) geen significante groepen hebben
geidentificeerd. Dit lijkt een interessant beginpunt voor volgend onderzoek, waarbij mogelijk
grotere corpora gebruikt kunnen worden.

9
Referenties
http://www.data-compression.com/theory.html

http://www.howstuffworks.com/file-compression.htm

http://www.onzetaal.nl/advies/letterfreq.html

http://nl.wikipedia.org/wiki/Lempel_Ziv_Welch

http://nl.wikipedia.org/wiki/Huffman_codering

http://nl.wikipedia.org/wiki/Datacompressie

http://nl.wikipedia.org/wiki/Gzip

http://nl.wikipedia.org/wiki/Algoritme

http://unisi.com/stories/20021/0204024.htm

http://www.unhchr.ch/udhr/navigate/alpha.htm

http://www.studeren.uva.nl/profielwerkstukken/object.cfm/objectid=A1004C1E-D8194686-
81555738A5945348/templateid=31A2F78E-0FC1-4A1F-812C0A64D30A526E

V.Fromkin, R.Rodman & A.Neijt, Universele taalkunde, een inleiding in de


algemene taalwetenschap, Foris Publications, Dordrecht, 1994 (6de druk).

10

Rate