"""Načtení textu, tokenizace, vytvoření slovníku, frekvenčního seznamu, relativní frekvence slov, uspořádáné slovníky, stop list, vytvoření frekvenčního seznamu jen autosémantik""" # nacteni obsahu z existujiciho souboru with open('C:\\Users\\Cech\\00_prace\\vyuka\\Brno\\PLIN057_stroj_zprac_textu\\text_01.txt', encoding='UTF-8') as f: obsah = f.read() print(obsah) # alternativa, nebudu ukazovat: file = open('file_path', 'w')ef #!!! uporzornit, ze ted nebudeme presit problem s interpunkci # rozseka nacteny text na slova do seznamu slova = obsah.split() print(slova) # rozseka nacteny text na jednotky, jejichz hranici urcuje tecka casti = obsah.split('.') print(casti) # rozseka nacteny text na radky do seznamu radky = obsah.split('\n') print(radky) # kazdou polozku seznamu na radek for slovo in slova: print(slovo) for cast in casti: print(cast) # pokud mam dlouhy text, chci si zobrazit je cast, napr. pro kontrolu print(obsah[0:100]) # vybrany pocet znaku print(slova[0:10]) # vybrany pocet slov #UKOL: vypiste poslednich 10 znaku textu, poslednich 10 slov print(obsah[-100:]) # vybrany pocet poslednich znaku print(slova[-10:]) # vybrany pocet poslednich slov #UKOL: zobrazte 10 až 20 slovo print(slova[9:20]) # vybrany pocet slov - pripomenout, ze posledni hodnota se nezapocitava # zjisteni delky textu -> pocet polozek seznam (interpunkce nevadi, protoze je prilepena na slovech) delka_ve_znacich = len(obsah) # meri se puvodni text print(delka_ve_znacich) # UKOL: vytisknout vetu 'Text má XY znaků.' print('Text má', delka_ve_znacich, 'znaků.') # lepsi je f-string (https://docs.python.org/3/tutorial/inputoutput.html#fancier-output-formatting%22%22%22) print(f"Text má {delka_ve_znacich} znaků") # zjisteni delky textu -> pocet polozek seznam (interpunkce nevadi, protoze je prilepena na slovech) delka_ve_slovech = len(slova) # meri se seznam slov print(delka_ve_slovech) #nebo print(f'Text má {delka_ve_slovech} slov.') # UKOL: potencialne se da predpokladat, ze delka slov se lisi napr. v ruznych typůech textu, je indikatorem readablity atp. # spocitejte průmernou delku slova ve znacich a ulozte ji do promenne 'prumerna_delka_slova' # pote vytisknete: Text má xy znaků a yz slov. Průměrná délka slova je zz znaků.', pouzijte f-string # !!!! je tam chyba, pocitame i mezery, coz nenni OK, kolega Vlcek bod prumerna_delka_slova = delka_ve_znacich / delka_ve_slovech print(f'Text má {delka_ve_znacich} znaků a {delka_ve_slovech} slov. Průměrná délka slova je {prumerna_delka_slova} znaků.') # 2. seminar # spocitame mezery pocet_mezer = obsah.count(' ') print(pocet_mezer) # UKOL: upravte vzorec na vypocet prumerne delky slova tak, ze tam zaclenite pocet mezer prumerna_delka_slova = (delka_ve_znacich - pocet_mezer) / delka_ve_slovech print(f'Text má {(delka_ve_znacich - pocet_mezer)} znaků bez mezer a {delka_ve_slovech} slov. Průměrná délka slova je {prumerna_delka_slova:.2f} znaků.') # to desetinne cislo vypada hrozne, proto prumerna_delka_slova = (delka_ve_znacich - pocet_mezer) / delka_ve_slovech print(f'Text má {(delka_ve_znacich - pocet_mezer)} znaků a {delka_ve_slovech} slov. Průměrná délka slova je {round(prumerna_delka_slova, 2)} znaků.') # furt tam je ale interpunkce # TOKENIZACE # je treba vyhazet vsechny nealfanumericke znaky # nahrazeni jednoho znaku print(obsah) obsah_bez_carek = obsah.replace(',', '') print(obsah_bez_carek) # nahrazeni vice znaku interpunkce = (',.!?') text_bez_interpunkce = '' for pismeno in obsah: if pismeno not in interpunkce: text_bez_interpunkce += pismeno print(text_bez_interpunkce) #alternativa text_bez_interpunkce = obsah.translate(str.maketrans({',':'', '.':'', '!':'', '?':''})) print(text_bez_interpunkce) # Vysvetleni: # slovnik `{',':'', '.':'', '!':'', '?':''}` predstavuje mapu: co za co se ma vymenit, napr. znak `','` za prazdny znak `'` # funkce `str.maketrans` prevede znaky uvedene v mape do jejich ciselne podoby # funkce `.translate()` provede samotnou transformaci textu # cil -> VYTVORENI SLOVNIKU # prevedeni textu na mala pismena text_bez_interpunkce_lc = text_bez_interpunkce.lower() print(text_bez_interpunkce_lc) # rozsekam do seznamu slova = text_bez_interpunkce_lc.split() print(slova) len(slova) # analogicky k odstraneni interpunkce # je treba tam nechat jen unikatni polozky seznam_slov = [] for slovo in slova: if slovo not in seznam_slov: seznam_slov.append(slovo) print(seznam_slov) # lepsi je set -> `set` je mnozina, datovy typ Pythonu; podoba se seznamu, ale kazdou unikatni polozku udrzuje pouze v jedne kopii seznam_slov = set(slova) print(seznam_slov) #pokud bychom chteli prevest na seznam seznam_slov = list(set(slova)) print(seznam_slov) # abecedne usporadany slovnik seznam_slov_abc = sorted(set(slova)) print(seznam_slov_abc) #cilem vytvorit seznam skladajici se jen s autosemantik # synsemantika jsou v stop listu (vytahl jsem to pro ilustraci jen z tohoto textz) stop_list = ['a', 'aby', 'ani', 'bych', 'byla', 'byli', 'bylo', 'byste','do','i','jako', 'je','jen','jimiž','jsem', 'jsou', 'k','která', 'které', 'který','mi','mnou', 'moji','míste', 'mým', 'mými', 'mě', 'na', 'naše', 'našeho', 'našich', 'naší', 'nebo', 'nejen', 'nejsem', 'nikdy', 'pro', 'přede', 'přes', 's', 'samém', 'se', 'také', 'tu', 'tyto', 'této', 'v', 'vaše', 'vašich', 've', 'vy', 'vám', 'vámi', 'vás', 'váš', 'všech', 'všechna', 'všechny', 'všichni', 'vždyť', 'z', 'že', '100', '50tá',] # UKOL: analogicky k odstranovani interpunkce vytvorte seznam autosemantik autosemantika = [] for slovo in seznam_slov_abc: if slovo not in stop_list: autosemantika.append(slovo) print(autosemantika) len(autosemantika) #FREKVENCNI SLOVNIK from collections import Counter #vytvori frekvencni slovnik usporadny od nejfrekventovanejsich frekv_slovnik = Counter(slova) print(frekv_slovnik) type(frekv_slovnik) #prevedu do dict frekv_slovnik = dict(frekv_slovnik) print(frekv_slovnik) # # alternativa # text_segm = text_bez_interpunkce_lc.split() # freq_slovnik = {} # for slovo in text_segm: # if slovo in freq_slovnik: # freq_slovnik[slovo] += 1 # else: # freq_slovnik[slovo] = 1 # print(freq_slovnik) #deset nejcastejsich slov v textu frekv_slovnik.most_common(10) #frekvence konkretniho slova frekv_slovnik['vám'] hledane_slovo = 'vám' frekv = frekv_slovnik[hledane_slovo] print(f'Frekvence slova {hledane_slovo} je {frekv}') # seznam hodnot, tj. jednotlivych frekvenci frekvenci tak, jak jdou v textu za sebou frekvence = list(frekv_slovnik.values()) print(frekvence) #UKOL: zjistete pocet slov o delce 1, 2, ... n. Je to tzv. frekvencni spektrum, ulozte tedy hodnoty do promenne frekvencni_spektrum frekvencni_spektrum = Counter(frekvence) print(frekvencni_spektrum) #zjisteni slov o dane frekvenci hledana_frekvence = 2 #zadani hodnoty hledane frekvence slova_o_frekvenci = [] for i in frekv_slovnik: if frekv_slovnik[i] == hledana_frekvence: slova_o_frekvenci.append(i) print(slova_o_frekvenci) #relativni frekvencni slovnik rel_frekv_slovnik = frekv_slovnik #nejdrive si nactu abs. frekvence do chystanho slovniku a ten pak budu menit pocet_slov = len(slova) for hodnota in rel_frekv_slovnik: rel_frekv_slovnik[hodnota] = rel_frekv_slovnik[hodnota] / pocet_slov print(rel_frekv_slovnik) #se zaokrouhlenim #relativni frekvencni slovnik rel_frekv_slovnik = frekv_slovnik #nejdrive si nactu abs. frekvence do chystanho slovniku a ten pak budu menit pocet_slov = len(slova) for hodnota in rel_frekv_slovnik: rel_frekv_slovnik[hodnota] = round(rel_frekv_slovnik[hodnota] / pocet_slov, 6) print(rel_frekv_slovnik) # #UKOL: vyjdrete to jako procentualni pokryti jednotlivych slov v textu na dve desetinna cisla frekv_slovnik = Counter(slova) rel_frekv_slovnik = frekv_slovnik #nejdrive si nactu abs. frekvence do chystanho slovniku a ten pak budu menit pocet_slov = len(slova) for hodnota in rel_frekv_slovnik: rel_frekv_slovnik[hodnota] = round((rel_frekv_slovnik[hodnota] / pocet_slov)*100, 2) print(rel_frekv_slovnik) type(rel_frekv_slovnik) rel_frekv_slovnik_02 = dict(rel_frekv_slovnik) dict(sorted(frekv_slovnik.items(), key=lambda i: (-i[1], i[0]))) # UKOL: kolik procent pouzitych slov (types) daneho textu tvori synsemantika (viz seznam), # (zaokrouhlete na dve desetinna cisla)? podil_synsemantik_types = (len(stop_list) / len(list(set(slova)))) * 100 print(round(podil_synsemantik_types, 2)) # UKOL: kolik procent pouzitych slov (tokens) daneho textu tvori synsemantika (viz seznam), (zaokrouhlete na dve desetinna cisla)? # pocet slov v celem extu len(slova) # vyvorim text pouze z synsemanti a zmerim jeho delku synsemanticky_text = [] for slovo in slova: if slovo in stop_list: synsemanticky_text.append(slovo) print(synsemanticky_text) len(synsemanticky_text) j podil_synsemantik_tokens = (len(synsemanticky_text) / len(slova)) * 100 print(round(podil_synsemantik_tokens, 2))