Heb je je ooit afgevraagd over een snelle manier om te vertellen waar een document op focust? Wat is het belangrijkste onderwerp? Laat me je deze simpele truc geven. Maak een lijst van de unieke woorden die in het document worden genoemd en controleer vervolgens hoe vaak elk woord is genoemd (frequentie). Op deze manier zou je een indicatie krijgen van waar het document voornamelijk over gaat. Maar dat zou niet gemakkelijk met de hand kunnen werken, dus we hebben een geautomatiseerd proces nodig, is het niet??
Ja, een geautomatiseerd proces maakt dit veel gemakkelijker. Laten we eens kijken hoe we de verschillende unieke woorden in een tekstbestand kunnen weergeven en de frequentie van elk woord kunnen controleren met behulp van Python.
In deze zelfstudie gebruiken we test.txt als ons testbestand. Ga je gang en download het, maar open het niet! Laten we een klein spel maken. De tekst in dit testbestand is afkomstig uit een van mijn zelfstudies bij Envato Tuts +. Laten we op basis van de frequentie van woorden raden naar welke tutorials deze tekst is geëxtraheerd.
Laat het spel beginnen!
Omdat we een patroon in onze game gaan toepassen, moeten we reguliere expressies (regex) gebruiken. Als 'reguliere expressies' een nieuwe term voor u is, is dit een mooie definitie van Wikipedia:
Een reeks tekens die een zoekpatroon definiëren, voornamelijk voor gebruik bij patroonaanpassing met tekenreeksen, of tekenreeksaanpassing, d.w.z. "zoeken en vervangen" -achtige bewerkingen. Het concept ontstond in de jaren 1950, toen de Amerikaanse wiskundige Stephen Kleene de beschrijving van een reguliere taal formaliseerde en gemeengoed werd met de Unix-tekstverwerkingsprogramma's ed, een editor en grep, een filter
Als je meer wilt weten over reguliere expressies voordat je verder gaat met deze tutorial, kun je mijn andere tutorial Reguliere expressies in Python zien en nog een keer terugkomen om door te gaan met deze tutorial.
Laten we stap voor stap werken aan het bouwen van dit spel. Het eerste wat we willen doen is het tekstbestand opslaan in een stringvariabele.
document_text = open ('test.txt', 'r') text_string = document_text.read ()
Laten we nu, om onze reguliere expressie gemakkelijker toe te passen, alle letters in ons document in kleine letters zetten, gebruikmakend van de lagere () functie, als volgt:
text_string = document_tekst. lees (). lager ()
Laten we onze reguliere expressie schrijven die alle woorden retourneert met het aantal tekens in het bereik [3-15]
. Beginnend vanaf 3
helpt bij het vermijden van woorden dat we misschien niet geïnteresseerd zijn in het tellen van hun frequentie als, van, in, enz., en woorden met een lengte groter dan 15
misschien niet de juiste woorden. De reguliere expressie voor een dergelijk patroon ziet er als volgt uit:
\ B [a-z] 3,15 \ b
\ b
is gerelateerd aan woordgrens. Voor meer informatie over de woordgrens kunt u deze zelfstudie raadplegen.
De bovenstaande reguliere expressie kan als volgt worden geschreven:
match_pattern = re.search (r '\ b [a-z] 3,15 \ b', text_string)
Omdat we door meerdere woorden in het document willen lopen, kunnen we de vind alle
functie:
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.
Op dit punt willen we de frequentie van elk woord in het document vinden. Het geschikte concept om hier te gebruiken is de woordenboeken van Python, omdat we dat nodig hebben sleutel waarde
paren, waar sleutel
is de woord, en de waarde
vertegenwoordigt de frequentie woorden verschenen in het document.
Ervan uitgaande dat we een leeg woordenboek hebben verklaard frequentie =
, de bovenstaande paragraaf ziet er als volgt uit:
voor woord in match_pattern: count = frequency.get (woord, 0) frequentie [woord] = aantal + 1
We kunnen nu onze sleutels zien met behulp van:
frequency_list = frequency.keys ()
Tot slot, om het woord en de frequentie ervan te krijgen (aantal keren dat het in het tekstbestand verscheen), kunnen we het volgende doen:
voor woorden in frequency_list: print words, frequency [words]
Laten we het programma samenvoegen in de volgende sectie en zien hoe de uitvoer eruit ziet.
Na het programma stap voor stap te hebben besproken, laten we nu zien hoe het programma er uitziet:
import re import string frequency = document_text = open ('test.txt', 'r') text_string = document_text.read (). lower () match_pattern = re.findall (r '\ b [az] 3,15 \ b ', text_string) voor woord in match_pattern: count = frequency.get (woord, 0) frequentie [word] = count + 1 frequency_list = frequency.keys () voor woorden in frequency_list: print words, frequency [words]
Als u het programma uitvoert, zou u ongeveer het volgende moeten krijgen:
Laten we teruggaan naar onze game. Als je door de woordfrequenties gaat, denk je dat het testbestand (met inhoud van mijn andere Python-tutorial) het had over?
(Hint: controleer het woord met de maximale frequentie).