Leposlovje

Leposlovje

Avtor: Sanja Milasinovic

Leposlovje

Sanja Milasinovic

Besedilo naloge

Napišite program, ki prebere neko literarno delo v tekstovni obliki, nato pa vrne statistiko: • najpogosteje uporabljene besede (katere besede in koliko jih je) • frekvence črk (kolikokrat se pojavi posamezna črka) • koliko je dolga povprečna beseda • koliko besed je dolg povprečen stavek. Rezultate frekvenc lahko primerjaš s člankom iz Wikipedije . Nekaj besedil lahko najdeš tukaj

Postopek reševanja v Python-u


import math
class Leposlovje:
        def __init__(self, datoteka):#konstruktor razreda Leposlovje
            #pripravimo spremenljivke v katere bomo shranjevali statistiko
            #črke in besede shranjujemo v slovar
            self.besede={}#inicializacija slovarja
            self.frekvence={}
            self.povprecnaBeseda=0
            self.povprecenStavek=0
            #odpremo datoteko in začnemo z analizo besed
            f=open(datoteka)
            self.dokument=f.read()
            f.close()
            self.popraviBesedilo()
            self.analizirajBesedilo()
            self.testni()

        def popraviBesedilo(self):
            besedilo=self.dokument
            #zamenjamo ? in!, da lahko stavke ločimo glede na piko
            besedilo=besedilo.replace('!','.')
            besedilo=besedilo.replace('?','.')
            #spremenimo vse velike začetnice v majhne začetnice
            besedilo=besedilo.lower()
            #spremenimo vse šumnike, saj python ne ve kako delati z njimi
            #potrebno je popraviti tako velike kot majhne šumnike, saj jih ukaz lower ne spremeni
            besedilo=besedilo.replace('\xc4\x8d','c')#to so kode šumnikov računalniške abecede(utf-8)
            besedilo=besedilo.replace('\xc5\xa1','s')
            besedilo=besedilo.replace('\xc5\xbe','z')
            besedilo=besedilo.replace('\xc4\x8c','c')
            besedilo=besedilo.replace('\xc5\xa0','s')
            besedilo=besedilo.replace('\xc5\xbd','z')
            #zamenjamo vse znake, ki niso del besedila oz. jih ne potrebujemo
            besedilo=besedilo.replace('*','')
            besedilo=besedilo.replace('-','')
            besedilo=besedilo.replace('\'','')
            besedilo=besedilo.replace(',','')
            besedilo=besedilo.replace(';','')
            #odstranimo vse nove vrstice
            besedilo=besedilo.replace('\n','')
            #vrnemo besedilo razdeljeno glede na pike
            self.dokument=besedilo.split('.')

        def analizirajBesedilo(self):
            stavki=self.dokument
            steviloStavkov=0
            steviloCrk=0
            for stavek in stavki:
                #izpustimo vse prazne stavke
                if len(stavek)>0:
                    steviloStavkov+=1
                    #vzamemo ta stavek ven in razdelimo stavek na besede
                    besede=stavek.strip().split(' ')
                    self.povprecenStavek+=len(besede)
                    #pogledamo vsako besedo posebej
                    for beseda in besede:
                        #izpustimo prazne besede
                        if len(besede)>0:
                            #statistika
                            self.povprecnaBeseda+=len(beseda)
                            if beseda in self.besede.keys():#če se ta beseda nahaja v slovarju ki smo ga z generirali
                                self.besede[beseda]+=1#na začetku povečamo števec frekvence
                            else:
                                self.besede[beseda]=1
                            #štejemo še vsako črko posebej
                            for crka in beseda:
                                steviloCrk+=1
                                if crka in self.frekvence.keys():
                                    self.frekvence[crka]+=1
                                else:
                                    self.frekvence[crka]=1
            #izračunamo frekvenco črk
            for kljuc in self.frekvence.keys():
                self.frekvence[kljuc]/=float(steviloCrk)
            #v self.povprecenStavek je trenutno zapisano število vseh besed
            self.povprecnaBeseda/=float(self.povprecenStavek)
            self.povprecenStavek/=float(steviloStavkov)


        def testni(self):
                print ('Povprečna beseda je dolga:', self.povprecnaBeseda, 'črk.')
                print ('Povprečen stavek je dolg:', self.povprecenStavek, 'besed.')
                print ('Frekvence črk:')
                for k in self.frekvence.keys():
                        print( k, ':', math.floor(self.frekvence[k]*10000) / 100)
                print ('Frekvence besed:')
                for k in self.besede.keys():
                        if self.besede[k] > 100:
                            print (k, ':', self.besede[k])





Razlaga programa

  • Najprej pripravimo spremenljivke v katere bomo shranjevali statistiko. Črke in besede shranjujemo v slovar. Slovar je pa sestavljen iz ključa ter vrednosti(črke, besede). Datoteko odpremo(open(datoteka)) ter začnemo z analizo besed(tako rečeno začnemo iz datoteke brat tisto kar od nas zahteva naloga).
  • Nato popravimo besedilo, tako da spremenimo: - Klicaje in vprašaje, da kasneje lahko stavke ločimo samo glede na piko. To naredimo z ukazom replace. Ukaz replace nam v bistvu zamenja v besedilu vse klicaje in vprašaje z piko. - Vse velike začetnice v majhne. To naredimo z ukazom lower(). -Vse šumnike, saj python ne ve kaj početi s šumnike(zamenjamo velike in male šumnike). Za spreminjanje šumnikov si pomagamo z računalniško abecedo(utf-8). Kode pa dobimo v Python-u s pomočjo ukaza encode('utf-8'). Tako dobimo kode za velike in male šumnike. Nato te kode s pomočjo ukaza replace zamenjamo s črkami brez šumnikov. -Vse znake, ki niso del besedila(+ * - , ;). -Odstranimo vse nove vrstice(\n). Ter vrnemo besedilo razdeljeno glede na pike, s pomočjo ukaza split('.').
  • Naredimo novo funkcijo analizirajBesedilo(). V kateri bomo analizirali stavke, vse besede v stavkih ter vse črke v besede. S pomočjo zanke for gremo skozi vse stavke. Kjer je dolžina stavka večja od 0 (len(stavek)>0), vzamemo ta stavek ven in ga razdelimo na besede. Potem pogledamo vsako besedo posebej. Če je dolžina besede večja od 0 (len(beseda)>0), pogledamo ali se ta beseda nahaja v slovarju, ki smo ga na začetku z generirali. Če imamo to besedo v slovarju se števec poveča, če ne pa ostane enak 1. Nato gremo še skozi vse črke v besedi.

Na koncu pa še naredimo testni program, tako da nam izpiše s pomočjo ukaza print: -kako povprečno je dolga beseda in iz koliko črk je sestavljena -kako povprečno je dolg stavek in iz koliko besed je sestavljen -frekvenca črk(vsako črko posebej nam izpiše, ki se nahaja v besedilu) Frekvenco črk naredimo s pomočjo ukaza, tako da nam parameter k gre skozi vse ključe(črke) ko v slovarju in nam nato izpiše še vrednosti teh črk. Vrednost teh črk nato še malo uredimo, tako da pomnožimo z 10000(da imamo za vejico 4 decimalke) nato pa še delimo s 100. -frekvenca besed S pomočjo zanke for gremo s parametrom k skozi vse ključe(besede) v slovarju, če se ena beseda pojavi večkrat kot 100 naj jo izpiše(to omejitev smo si sami izmislili).

Program na koncu še zaženemo:
a=Leposlovje('fa_00023.txt')

Ta testni program smo si izbrali zato, ker nam na koncu program lepo vse izpiše in lahko vidimo našo iskano frekvenco nekega besedila.

0%
0%