===== List Comprehensions, Sortieren, pyplot, Zipf's law ===== Aus dem Programm, das ein "Wörterbuch" der Worthäufigkeiten in einem Text erstellt, wurde im nächsten Schritt eine nach absteigender Häufigkeit geordnete Liste. ==== List comprehensions ==== Die Umwandlung eines Wörterbuchs in eine Liste hätte sich auf verschiedene Weisen realisieren lassen. Eine auch in anderen Zusammenhängen nützliche Weise ist die Definition einer Liste mit einer so genannten //list comprehension//: wbliste = [[wb[wort],wort] for wort in wb] Die so erzeugte Liste besteht aus zweielementigen Listen [12,'Katze'],[13,'Hunde]... Allgemein lässt sich mit einer //list comprehension// aus einer Liste ''liste'' eine neue Liste ''neueliste'' erzeugen: neueliste=[ f(x) for x in liste] wobei ''f(x)'' für irgendeinen Ausdruck steht, in dem ''x'' vorkommt. ==== Sortieren ==== Hat man nun eine Liste ''liste'', so lässt sich diese wieder auf verschiedene Weisen sortieren: liste.sort() sortiert die Liste lexikographisch. Anstelle mit der Methode ''sort'' lässt, die die gegeben Liste modifiziert, lässt sich das auch mit der Funktion ''sorted'' machen, die eine neue sortierte Liste zurückgibt: liste=sorted(liste) Sind die Einträge wie bei ''wbliste'' selbst Listen, so wird erst nach dem ersten Eintrag, dann nach dem zweiten sortiert, usw. Für ''wbliste'' heißt das, dass nach Häufigkeit sortiert wird und unter den Wörtern gleicher Häufigkeit alphabetisch. Durch liste.sort(reverse=True) wird absteigend lexikographisch geordnet. Will man nicht lexikographisch ordnen, sondern nach einer selbst definierten Ordnungsrelation, so lässt sich das mit Hilfe eines weiteren Paramters ''key=...'' realisieren, siehe z.B. [[https://wiki.python.org/moin/HowTo/Sorting|hier.]] ==== Zipf's law und erste Plots ==== Ein bemerkenswertes Gesetz gilt für alle natürlichen Sprachen: Ordnet man die Wörter nach absteigender Häufigkeit, so besteht zwischen dem Rang ''r'' und der Häufigkeit ''f'' eine Beziehung der Form \( f=c r^{-s}\). Dies bedeutet dass zwischen ''log f'' und ''log r'' eine lineare Beziehung mit negativer Steigung besteht. Um das (qualitativ) zu überprüfen ist ein Plot nützlich. Ist ''x'' eine Liste von x-Werten und ''y'' eine Liste von gleich vielen y-Werten so lässt sich mit dem Modul matplotlib leicht ein Plot erstellen: from matplotlib import pyplot as plt plt.plot(x,y) plt.show() Es wird an anderer Stelle noch mehr zum Plotten geben... Als Beispiele Winnetou1, Die Buddenbrooks und Shakespeare's complete works (hier wurde der natürliche Logarithmus verwendet): {{:ss14:zipf-winnetou.png?200|Winnetou 1}} {{:ss14:zipf-buddenbrooks.png?200|Die Buddenbrooks}} {{:ss14:zipf-Shakespeare.png?200|Shakespeare's complete works}} Man sieht, dass bei diesen Graphen die lineare Abhängigkeit für die allerhäufigsten Wörter verletzt ist. Ca. ab dem 20.-häufigsten Wort lässt sich der Graph allerdings gut durch eine Gerade beschreiben. (Ich nehme an, dass Henrikas Vermutung zutrifft, dass Eigennamen eine Sonderrolle spielen. Wenn man aber ein ganzes Textkorpus verschiedener Autoren einer Sprache nimmt, wird die Beziehung sehr gut erfüllt.) p.s. - Fürs Polnische hat Ilona den folgenden [[http://www.ipipan.waw.pl/~ldebowsk/docs/seminaria/zipf1.pdf|Link]] (S. 15) gefunden. - Es liegt nahe, die Untersuchung quantitativ zu machen, d.h. die optimalen Konstanten \( c\) und \( s\) im Zipf'schen Gesetz zu finden und nach Sprachen und Textsorten zu unterscheiden. - Ich habe mehrere ganz verschiedene Erklärungsversuche für das Phänomen gefunden. Ein relativ neuer und interessanter findet sich [[http://www.pnas.org/content/100/3/788.full|hier]].