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.
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.
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. hier.
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):
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.