===== 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]].