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