From 6930ab98a0c0b53125c7cc9557fc0231f16b6fb3 Mon Sep 17 00:00:00 2001 From: Martin Mares <mj@ucw.cz> Date: Sun, 24 Nov 2019 22:38:52 +0100 Subject: [PATCH] =?UTF-8?q?Slovn=C3=ADky:=20P=C5=99=C3=ADklady?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 08-slovniky/k-gramy.py | 19 +++++++++++++++++++ 08-slovniky/k-gramy2.py | 20 ++++++++++++++++++++ 08-slovniky/k-gramy3.py | 26 ++++++++++++++++++++++++++ 08-slovniky/porovnavani.py | 25 +++++++++++++++++++++++++ 4 files changed, 90 insertions(+) create mode 100755 08-slovniky/k-gramy.py create mode 100755 08-slovniky/k-gramy2.py create mode 100755 08-slovniky/k-gramy3.py create mode 100644 08-slovniky/porovnavani.py diff --git a/08-slovniky/k-gramy.py b/08-slovniky/k-gramy.py new file mode 100755 index 0000000..c0dd493 --- /dev/null +++ b/08-slovniky/k-gramy.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python3 +# Spočítá frekvence k-gramů v souboru soubor.txt +# (v každém řádku zvlášť). + +from collections import defaultdict + +k=3 +kgramy=defaultdict(int) + +for radek in open('soubor.txt'): + # Rozdělíme na k-gramy + # (ignorujeme znak konce řádku na poslední pozici) + for i in range(len(radek)-k): + kgramy[radek[i:i+k]] += 1 + +# Vytvoříme seznam dvojic (frekvence, k-gram), vypíšeme seřazeně +vystup = [ (f, g) for g, f in kgramy.items() ] +for f, g in reversed(sorted(vystup)): + print(f, g) diff --git a/08-slovniky/k-gramy2.py b/08-slovniky/k-gramy2.py new file mode 100755 index 0000000..0a0c552 --- /dev/null +++ b/08-slovniky/k-gramy2.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python3 +# Spočítá frekvence k-gramů v souboru soubor.txt +# (uvažujeme i k-gramy jdoucí přes hranice řádků). + +from collections import defaultdict + +k=3 + +text = "" +for radek in open('soubor.txt'): + text += radek[:-1] + ' ' + +kgramy=defaultdict(int) +for i in range(len(text)-k): + kgramy[text[i:i+k]] += 1 + +# Vytvoříme seznam dvojic (frekvence, k-gram), vypíšeme seřazeně +vystup = [ (f, g) for g, f in kgramy.items() ] +for f, g in reversed(sorted(vystup)): + print(f, g) diff --git a/08-slovniky/k-gramy3.py b/08-slovniky/k-gramy3.py new file mode 100755 index 0000000..af68c13 --- /dev/null +++ b/08-slovniky/k-gramy3.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python3 +# Vygeneruje náhodný text na motivy zadaného +# podle k-gramové statistiky. + +from collections import defaultdict +import random + +k=3 + +text = "" +for radek in open('soubor.txt'): + text += radek[:-1] + ' ' + +pokrac=defaultdict(list) +for i in range(len(text)-k-1): + pokrac[text[i:i+k]] += text[i+k] + +gen = random.choice(list(pokrac)) +while len(gen) < 1000: + p = pokrac[gen[-k:]] + if p: + gen += random.choice(p) + else: + gen += '/' + random.choice(list(pokrac)) + +print(gen) diff --git a/08-slovniky/porovnavani.py b/08-slovniky/porovnavani.py new file mode 100644 index 0000000..16923f8 --- /dev/null +++ b/08-slovniky/porovnavani.py @@ -0,0 +1,25 @@ +# Obsahují dva seznamy tytéž prvky (až na pořadí)? +# Verze pro seznamy, které mají všechny prvky různé. +def porovnej(x, y): + return set(x) == set(y) + +# Pokud se prvky mohou opakovat, můžeme seznamy setřídit +# a pak je porovnat. To ovšem trvá řádově n*log n kroků. +def porovnej2(x, y): + return sorted(x) == sorted(y) + +# Nebo můžeme použít slovník, abychom spočítali četnosti +# prvků v obou seznamech. To trvá řádově n kroků. + +def pocitej(x): + cetnosti = defaultdict(int) + for a in x: + cetnosti[a] += 1 + return cetnosti + +def porovnej3(x, y): + return pocitej(x) == pocitej(y) + +# Jsou všechny prvky seznamu navzájem různé? +def ruzne_prvky(x): + return len(x) == len(set(x)) -- GitLab