Frequentieanalyse is het onderzoek naar de frequentie van letters of groepen van letters van een tekst. Het wordt gebruikt als hulpmiddel voor het breken van klassieke cryptografie. De methode is gebaseerd op het feit dat binnen elke geschreven taal bepaalde letters of lettercombinaties een bepaalde frequentie van voorkomen hebben. Frequentieanalyse vereist een basiskennis van de karakteristieken van een bepaalde taal, zo komen in het Nederlands de e, n en a het meeste voor. De meest voorkomende letters in bijvoorbeeld het Frans zijn e, a, i, s en t en in het Duits e, n, i, r en s.
Taalkundigen gebruiken de letterfrequenties als een rudimentiare techniek om talen te identificeren. Dit is vooral nuttig om een indicatie te krijgen of een onbekende taal alfabetisch, syllabisch of ideograisch is. Bijvoorbeeld, de Japanse Hiragana taal bevat 46 verschillende karakters, wat duidelijk meer is dan de meeste fonetische alfabetten; het Nederlandse en het Hawaiiaanse alfabet bevatten respectievelijk 26 en 13 letters. Het moge duidelijk zijn dat je geen vaste letterfrequentie kan ontdekken in een gegeven taal, aangezien elke schrijver lichtjes anders schrijft. Maar de meeste talen hebben wel een karakteritieke kansverdeling voor het lettergebruik die vooral duidelijk wordt in langere teksten.
Schrijf een programma dat een tekstbestand inleest en een dictionary opstelt om bij te houden hoeveel keer elke teken voorkomt in de tekst. Met teken worden niet alleen letters bedoelt, maar ook leestekens, maar geen spaties en newline-symbolen zoals '\n'. We maken hierbij wel geen onderscheid tussen hoofdletters en kleine letters; dus de letter 'A' en 'a' tellen beiden voor het teken 'a'. Het in te lezen bestand vind je hier vandenvosreynaerde.txt1. Als output zet het programma per lijn een symbool op het scherm gevolgd door aantal keer dat dit voorkwam in de tekst, gevolgd door het percentage van voorkomen, telkens gescheiden door een spatie. De symbolen worden op het scherm geplaats in dalende volgorde van voorkomen. Om het percentage van voorkomen te berekenen hou je wel rekening met alle tekens (inclusief spaties en newline-symbolen).
Het programma leest het bestand vandenvosreynaerde.txt2 in. Zie de tip op het einde over het inlezen van bestanden.
De output van het programma zijn de symbolen, in dalende volgorde van aantal keer voorkomen, gevolgd door het aantal keer dat het symbool voorkomt in de tekst en het percentage van voorkomen (telkens gescheiden door een spatie):
e 18984 17.524555055018094 n 8845 8.16501735470054 i 5578 5.149176574846762 d 5494 5.071634295842257 a 5471 5.050402481352928 t 5189 4.790081973266376 r 5124 4.730079019274795 h 4526 4.178051842552248 o 3747 3.458939517022377 s 3558 3.2844693892622407 l 2727 2.5173547005391037 c 2684 2.4776604386677494 m 2231 2.0594860054648843 g 2135 1.9708662580311649 u 1572 1.451148364227162 v 1567 1.4465327523816558 w 1530 1.4123772247249096 , 1515 1.398530389188391 b 1241 1.1455948600546488 . 1110 1.0246658297023854 p 856 0.7901927479506684 y 583 0.5381803411860276 j 563 0.5197178938040027 " 476 0.4394062476921941 k 427 0.3941732516062329 f 389 0.3590946015803855 z 318 0.2935529133741969 : 219 0.20216379883317334 ? 108 0.0996972158629348 q 106 0.0978509711247323 ! 88 0.08123476848090982 x 32 0.029539915811239936 ' 21 0.019385569751126208 ; 19 0.017539325012923712 - 16 0.014769957905619968
Python kan bestanden inlezen op voorwaarde dat deze in dezelfde map staan als het programma-bestand. Vervolgens zal je in het programma het bestand, met bestandsnaam bestandsnaam.ext, openen via
bestand = open('bestandsnaam.ext')
Python maakt dan een file-object aan met de naam bestand. Dit object kan je lijn per lijn overlopen via een for-lus. Na het verwerken van alle lijnen in het bestand, kan dit terug gesloten worden.
bestand = open('bestandsnaam.ext') for lijn in bestand: ... hier komt hoe je de ingelezen lijn wil verwerken bestand.close()
Wat Dodona betreft: daar wordt het in te lezen bestand automatisch klaargezet voor jullie in dezelfde map als waar het programma-bestand terecht komt. Dit hoef je niet zelf te doen. Dit betekent dat je op Dodona ook met de bovenstaande procedure het bestand kan inlezen. Deze code staat reeds klaar in het input-vak. De verwerking van de ingelezen lijn en de rest van het programma, moet je zelf verder aanvullen