Sie fragen sich vielleicht über den Begriff Zipf-Verteilung. Um zu verstehen, was wir unter diesem Begriff verstehen, müssen wir definieren Das Gesetz von Zipf zuerst. Keine Sorge, ich halte alles einfach.
Das Gesetz von Zipf besagt lediglich, dass das Auftreten des häufigsten Wortes bei einigen Korpus (großen und strukturierten Textsätzen) von Ausdrücken in natürlicher Sprache etwa doppelt so häufig ist wie das zweithäufigste Wort, dreimal das dritthäufigste Wort. viermal als vierthäufigstes Wort und so weiter.
Schauen wir uns ein Beispiel dafür an. Wenn Sie in den Brown Corpus of American English schauen, werden Sie feststellen, dass das häufigste Wort ist das (69.971 Ereignisse). Wenn wir in das zweithäufigste Wort schauen, ist das von, wir werden feststellen, dass es 36.411 mal vorkommt.
Das Wort das entfallen rund 7% der Wörter des Brown Corpus (69.971 von etwas über 1 Million Wörtern). Wenn wir zum Wort kommen von, wir werden feststellen, dass es etwa 3,6% des Corpus (etwa die Hälfte des das). Daher können wir feststellen, dass das Gesetz von Zipf auf diese Situation anwendbar ist.
So versucht das Gesetz von Zipf uns mitzuteilen, dass eine kleine Anzahl von Artikeln für den Großteil der Aktivitäten verantwortlich ist, die wir beobachten. Beispielsweise macht eine kleine Anzahl von Krankheiten (Krebs, Herz-Kreislauf-Erkrankungen) den Hauptteil der Todesfälle aus. Dies gilt auch für Wörter, die den Großteil aller Wortvorkommen in der Literatur ausmachen, und viele andere Beispiele in unserem Leben.
Bevor wir fortfahren, möchte ich Sie auf die Daten verweisen, mit denen wir in unserem Tutorial experimentieren werden. Unsere Daten werden diesmal aus der National Library of Medicine stammen. Wir werden von hier aus eine so genannte MeSH-Datei (Medical Subject Heading) herunterladen. Insbesondere d2016.bin (28 MB).
Ich werde nicht näher auf die Beschreibung dieser Datei eingehen, da sie den Rahmen dieses Tutorials sprengen würde und wir nur brauchen, um mit unserem Code zu experimentieren.
Nachdem Sie die Daten im obigen Abschnitt heruntergeladen haben, beginnen wir mit der Erstellung unseres Python-Skripts, in dem die Verteilung der Daten von Zipf gefunden wird d2016.bin
.
Der erste normale Schritt ist der öffnen
die Datei:
open_file = open ('d2016.bin', 'r')
Um die notwendigen Vorgänge an der Behälter
Datei müssen wir die Datei in eine String-Variable laden. Dies kann einfach mit der lesen()
Funktion wie folgt:
file_to_string = open_file.read ()
Da wir nach Mustern (d. H. Wörtern) suchen, kommen reguläre Ausdrücke ins Spiel. Wir werden also Pythons verwenden Re
Modul.
An diesem Punkt haben wir bereits das gelesen Behälter
Datei und seinen Inhalt in eine String-Variable geladen. Die Verteilung der Zipf zu finden bedeutet, die Häufigkeit des Auftretens von Wörtern in der Behälter
Datei. Der reguläre Ausdruck wird daher verwendet, um die Wörter in der Datei zu finden.
Die Methode, die wir für eine solche Übereinstimmung verwenden werden, ist die finde alle()
Methode. Wie im erwähnt Re
Moduldokumentation über finde alle()
, Die Methode wird:
Gibt alle nicht überlappenden Übereinstimmungen von zurück Muster im Schnur, als Liste von Strings. Das Schnur wird von links nach rechts gescannt und Übereinstimmungen werden in der gefundenen Reihenfolge zurückgegeben. Wenn eine oder mehrere Gruppen im Muster vorhanden sind, geben Sie eine Liste mit Gruppen zurück. Dies ist eine Liste von Tupeln, wenn das Muster mehr als eine Gruppe hat. Leere Übereinstimmungen werden in das Ergebnis einbezogen, es sei denn, sie berühren den Beginn einer anderen Übereinstimmung.
Wir möchten einen regulären Ausdruck schreiben, mit dem alle einzelnen Wörter in der Textzeichenfolgenvariablen gesucht werden. Der reguläre Ausdruck, der diese Aufgabe ausführen kann, ist:
\ b [A-Za-z] [a-z] 2,10 \ b
woher \ b
ist ein Anker für Wortgrenzen. In Python kann dies wie folgt dargestellt werden:
words = re.findall (r '(\ b [A-Za-z] [a-z] 2,9 \ b)', file_to_string)
Dieser reguläre Ausdruck sagt uns grundsätzlich, dass wir alle Wörter finden müssen, die mit einem Buchstaben (Groß- oder Kleinschreibung) beginnen und von einer Buchstabenfolge gefolgt werden, die mindestens aus Buchstaben besteht 2
Zeichen und nicht mehr als 9
Zeichen. Mit anderen Worten, die Größe der Wörter, die in die Ausgabe aufgenommen werden, reicht von 3
zu 10
Zeichen lang.
Wir können jetzt eine Schleife ausführen, die die Häufigkeit des Auftretens jedes Wortes berechnet:
für worte in worten: count = frequency.get (word, 0) frequenz [word] = count + 1
Hier, wenn das Wort noch nicht in der Liste der Wörter gefunden wurde, anstatt ein Zeichen zu setzen KeyError
, der Standardwert 0
ist zurück gekommen. Andernfalls wird die Anzahl um erhöht 1
, gibt an, wie oft das Wort bisher in der Liste vorgekommen ist.
Zum Schluss drucken wir das Schlüssel-Wert-Paar des Wörterbuchs mit dem Wort (Schlüssel) und der Häufigkeit, mit der es in der Liste (Wert) angezeigt wurde:
für Schlüssel, Wert in umgekehrter Reihenfolge (Sortierung (frequency.items (), Schlüssel = itemgetter (1))): Druckschlüssel, Wert
Dieser Teil sortiert (frequency.items (), key = itemgetter (1))
Sortiert die Ausgabe nach Wert in aufsteigender Reihenfolge, dh sie zeigt die Wörter vom seltensten bis zum häufigsten Auftreten an. Um die häufigsten Wörter am Anfang aufzulisten, verwenden wir die rückgängig gemacht()
Methode.
Nachdem wir die verschiedenen Bausteine des Programms durchgearbeitet haben, schauen wir uns an, wie alles zusammen aussieht:
import re aus Operator importieren itemgetter frequency = open_file = open ('d2016.bin', 'r') file_to_string = open_file.read () words = re.findall (r '(\ b [A-Za-z] [ az] 2,9 \ b) ', file_to_string) für Wörter in Wörtern: count = frequency.get (word, 0) frequency [word] = count + 1 für Schlüssel, Wert in umgekehrter Reihenfolge (frequency.items ( ), key = itemgetter (1))): Druckschlüssel, Wert
Ich werde hier die ersten zehn Wörter und ihre vom Programm zurückgegebenen Frequenzen anzeigen:
die 42602 abcdef 31913 und 30699 abbcdef 27016 waren 17430, siehe 16189 mit 14380 unter 13127 für 9767 abcdefv 8694
Mit dieser Zipf-Distribution können wir das Gesetz von Zipf dahingehend überprüfen, dass einige Wörter (Wörter mit hoher Häufigkeit) den Großteil der Wörter repräsentieren, wie wir oben sehen können das
, und
, war
, zum
. Dies gilt auch für die Sequenzen abcdef
, abbcdef
, und abcdefv
Dies sind sehr häufige Buchstabenfolgen, die eine bestimmte Bedeutung für diese Datei haben.
In diesem Lernprogramm haben wir gesehen, wie Python die Arbeit mit statistischen Konzepten wie dem Gesetz von Zipf vereinfacht. Python ist insbesondere beim Arbeiten mit großen Textdateien sehr praktisch. Dies würde viel Zeit und Mühe kosten, wenn wir die Verteilung von Zipf manuell finden würden. Wie wir gesehen haben, konnten wir die Verteilung der Zipf-Datei mit einer Größe von 28 MB schnell laden, analysieren und finden. Ganz zu schweigen von der Einfachheit beim Sortieren der Ausgabe dank Pythons Wörterbüchern.