U vraagt zich misschien af over de termijn Zipf-distributie. Om te begrijpen wat we bedoelen met deze term, moeten we definiëren De wet van Zipf eerste. Maak je geen zorgen, ik zal alles eenvoudig houden.
De wet van Zipf stelt eenvoudig dat, gegeven een aantal corpus (grote en gestructureerde reeks teksten) van natuurlijke taaluitingen, het voorkomen van het meest voorkomende woord ongeveer tweemaal zo vaak zal zijn als het op een na meest voorkomende woord, driemaal als het op twee na meest voorkomende woord, vier keer als het vierde meest voorkomende woord, enzovoort.
Laten we daar een voorbeeld van bekijken. Als je in het Brown Corpus of American English kijkt, zul je merken dat het meest voorkomende woord is de (69.971 exemplaren). Als we naar het op een na meest voorkomende woord kijken, dan is dat van, we zullen opmerken dat het 36.411 keer voorkomt.
Het woord de is goed voor ongeveer 7% van de Brown Corpus-woorden (69.971 van iets meer dan 1 miljoen woorden). Als we bij het woord komen van, we zullen opmerken dat het goed is voor ongeveer 3,6% van het corpus (ongeveer de helft van de). We kunnen dus opmerken dat de wet van Zipf op deze situatie van toepassing is.
Zo probeert de wet van Zipf ons te vertellen dat een klein aantal artikelen meestal het grootste deel van de activiteiten uitmaakt die we waarnemen. Een klein aantal ziektes (kanker, hart- en vaatziekten) is bijvoorbeeld verantwoordelijk voor de meeste doden. Dit geldt ook voor woorden die het leeuwendeel van alle woordvoorvallen in de literatuur verklaren, en vele andere voorbeelden in ons leven.
Voordat ik verder ga, kan ik u verwijzen naar de gegevens die we gebruiken om mee te experimenteren in onze zelfstudie. Onze gegevens zijn deze keer afkomstig van de National Library of Medicine. We zullen hier een zogenaamd MeSH (Medical Subject Heading) ASCII-bestand downloaden. In het bijzonder d2016.bin (28 MB).
Ik zal niet in detail treden bij het beschrijven van dit bestand, omdat het buiten het bestek van deze tutorial valt, en we hebben het alleen nodig om te experimenteren met onze code.
Nadat je de gegevens in de bovenstaande sectie hebt gedownload, gaan we nu beginnen met het bouwen van ons Python-script dat de Zipf-verdeling van de gegevens in d2016.bin
.
De eerste normale stap om uit te voeren is om Open
het bestand:
open_file = open ('d2016.bin', 'r')
Om de nodige bewerkingen op de bak
bestand, moeten we het bestand laden in een stringvariabele. Dit kan eenvoudig worden bereikt met behulp van de lezen()
functie, als volgt:
file_to_string = open_file.read ()
Omdat we naar een patroon (dus woorden) op zoek zijn, komen reguliere expressies in beeld. We zullen dus gebruik maken van Python's opnieuw
module.
Op dit punt hebben we al de bak
bestand en laadde de inhoud ervan in een stringvariabele. Het vinden van de Zipf-verdeling betekent dat de frequentie van voorkomen van woorden in de bak
het dossier. De reguliere expressie wordt dus gebruikt om de woorden in het bestand te lokaliseren.
De methode die we zullen gebruiken om zo'n match te maken is de vind alle()
methode. Zoals vermeld in de opnieuw
module documentatie over vind alle()
, de methode zal:
Retourneer alle niet-overlappende overeenkomsten van patroon in draad, als een lijst met strings. De draad wordt van links naar rechts gescand en de resultaten worden geretourneerd in de gevonden volgorde. Als een of meer groepen in het patroon aanwezig zijn, retourneert u een lijst met groepen; dit zal een lijst van tupels zijn als het patroon meer dan één groep heeft. Lege matches worden in het resultaat opgenomen, tenzij ze het begin van een andere match aanraken.
Wat we willen doen, is een reguliere expressie schrijven die alle individuele woorden in de variabele tekstreeks zal lokaliseren. De reguliere expressie die deze taak kan uitvoeren, is:
\ B [A-Za-z] [a-z] 2,10 \ b
waar \ b
is een anker voor woordgrenzen. In Python kan dit als volgt worden weergegeven:
woorden = re.findall (r '(\ b [A-Za-z] [a-z] 2,9 \ b)', file_to_string)
Deze reguliere expressie vertelt ons in feite om alle woorden te vinden die beginnen met een letter (hoofdletter of kleine letter) en gevolgd door een reeks letters die minstens bestaat uit 2
karakters en niet meer dan 9
karakters. Met andere woorden, de grootte van de woorden die in de uitvoer worden opgenomen, varieert van 3
naar 10
karakters lang.
We kunnen nu een lus uitvoeren die is gericht op het berekenen van de frequentie van voorkomen van elk woord:
for word in words: count = frequency.get (word, 0) frequency [word] = count + 1
Hier, als het woord nog niet in de woordenlijst staat, in plaats van het op te halen KeyError
, de standaardwaarde 0
wordt teruggestuurd. Anders wordt het aantal opgehoogd met 1
, die tot nu toe het aantal keren voorstelde dat het woord in de lijst voorkomt.
Ten slotte zullen we het sleutel / waarde-paar van het woordenboek afdrukken, met het woord (sleutel) en het aantal keren dat het in de lijst voorkomt (waarde):
voor sleutel, waarde in omgekeerd (gesorteerd (frequency.items (), key = itemgetter (1))): afdruksleutel, waarde
Dit deel gesorteerd (frequency.items (), key = itemgetter (1))
sorteert de uitvoer op waarde in oplopende volgorde, dat wil zeggen, het toont de woorden van de minst frequente gebeurtenis tot de meest voorkomende gebeurtenis. Om de meest voorkomende woorden aan het begin weer te geven, gebruiken we de omgekeerd()
methode.
Nadat we de verschillende bouwstenen van het programma hebben doorgenomen, laten we zien hoe alles er samen uitziet:
importeer opnieuw van operator import itemgetter frequentie = open_file = open ('d2016.bin', 'r') file_to_string = open_file.read () woorden = re.findall (r '(\ b [A-Za-z] [ az] 2,9 \ b) ', file_to_string) voor woorden in woorden: count = frequency.get (woord, 0) frequentie [word] = count + 1 voor sleutel, waarde in omgekeerde volgorde (gesorteerd (frequency.items ( ), toets = itemgetter (1))): afdruksleutel, waarde
Ik zal hier de eerste tien woorden tonen en hun frequenties geretourneerd door het programma:
de 42602 abcdef 31913 en 30699 abbcdef 27016 was 17430 zie 16189 met 14380 onder 13127 voor 9767 abcdefv 8694
Uit deze Zipf-distributie kunnen we de wet van Zipf valideren, omdat sommige woorden (hoogfrequente woorden) het grootste deel van woorden vertegenwoordigen, zoals we hierboven kunnen zien de
, en
, was
, voor
. Dit geldt ook voor de sequenties abcdef
, abbcdef
, en abcdefv
Dit zijn zeer frequente letterreeksen die een bepaalde betekenis hebben voor dit bestand.
In deze tutorial hebben we gezien hoe Python het gemakkelijk maakt om te werken met statistische concepten zoals de wet van Zipf. Python komt vooral van pas bij het werken met grote tekstbestanden, wat veel tijd en moeite kost als we de distributie van Zipf handmatig zouden vinden. Zoals we zagen, konden we de Zipf-distributie van een bestand van 28 MB snel laden, parseren en vinden. Laat staan de eenvoud in het sorteren van de uitvoer dankzij de woordenboeken van Python.