Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

ss14:list_comprehension_sortieren_pyplot_sitzung_vom_8._mai

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

Winnetou 1 Die Buddenbrooks 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.

  1. Fürs Polnische hat Ilona den folgenden Link (S. 15) gefunden.
  2. 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.
  3. Ich habe mehrere ganz verschiedene Erklärungsversuche für das Phänomen gefunden. Ein relativ neuer und interessanter findet sich hier.
ss14/list_comprehension_sortieren_pyplot_sitzung_vom_8._mai.txt · Zuletzt geändert: 2016/05/10 14:46 (Externe Bearbeitung)