Využití datových struktur, práce s textem. IB111 Úvod do programování

Podobné dokumenty
Práce s daty. IB111 Základy programování Radek Pelánek

Regulární výrazy, práce s textem a daty. IB111 Úvod do programování skrze Python

Regulární výrazy, práce s textem a daty. IB111 Úvod do programování skrze Python

Konečný automat. Jan Kybic.

Programování: základní konstrukce, příklady, aplikace. IB111 Programování a algoritmizace

Regulární výrazy. Vzory

SPJA, cvičení 1. ipython, python, skripty. základy syntaxe: základní datové typy, řetězce. podmínky: if-elif-else, vyhodnocení logických výrazů

Prioritní fronta, halda

IB111 Úvod do programování skrze Python

VISUAL BASIC. Práce se soubory

Tabulkový procesor. Základní rysy

IB111 Základy programování Radek Pelánek

Da D to t v o é v ty t py IB111: Datové typy

NPRG030 Programování I, 2017/18 1 / :22:16

Rekurze. IB111 Úvod do programování skrze Python

Rekurze. IB111 Úvod do programování

(a kryptografické odbočky) IB111 Úvod do programování skrze Python

Maturitní otázky z předmětu PROGRAMOVÁNÍ

DSL manuál. Ing. Jan Hranáč. 27. října V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v

Rekurze. IB111 Základy programování Radek Pelánek

Funkce, podmíněný příkaz if-else, příkaz cyklu for

Úvod do UNIXu. Okruh č. 4 - vi, regulární výrazy, grep a sed. Jakub Galgonek. verze r2. inspirováno materiály Davida Hokszy

IV122 Matematika a programování Úvod kurzu. Radek Pelánek

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Přednáška 7. Celočíselná aritmetika. Návratový kód. Příkazy pro větvení výpočtu. Cykly. Předčasné ukončení cyklu.

ALGORITMIZACE A PROGRAMOVÁNÍ

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

Spojový seznam. Jan Kybic.

IB111 Úvod do programování skrze Python

Slepé prohledávání do šířky Algoritmus prohledávání do šířky Při tomto způsobu prohledávání máme jistotu, že vždy nalezneme koncový stav, musíme ale p

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Hanojská věž. T2: prohledávání stavového prostoru. zadání [1 1 1] řešení [3 3 3] dva možné první tahy: [1 1 2] [1 1 3]

Kolekce, cyklus foreach

Programování. Bc. Veronika Tomsová

Zdokonalování gramotnosti v oblasti ICT. Kurz MS Excel kurz 3. Inovace a modernizace studijních oborů FSpS (IMPACT) CZ.1.07/2.2.00/28.

IB111 Úvod do programování skrze Python Přednáška 7

Obsah. Předmluva 13. O autorovi 15. Poděkování 16. O odborných korektorech 17. Úvod 19

Algoritmizace a programování

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

NPRG030 Programování I, 2016/17 1 / :58:13

Regulární výrazy. jemný úvod. Miloslav Brada

Algoritmizace a programování

Programovací jazyk Pascal

Programování v Pythonu

Programování v jazyce JavaScript

Prohledávání do šířky = algoritmus vlny

NPRG030 Programování I, 2010/11

Hledání správné cesty

POČÍTAČE A PROGRAMOVÁNÍ

Třídění a vyhledávání Searching and sorting

Řešení: PŘENESVĚŽ (N, A, B, C) = přenes N disků z A na B pomocí C

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

PROGRAMOVÁNÍ V SHELLU

Zadání soutěžních úloh

Zadání soutěžních úloh

Vzdálenost uzlů v neorientovaném grafu

Vstupní požadavky, doporučení a metodické pokyny

Programování v C++ 1, 1. cvičení

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

Standardní algoritmy vyhledávací.

Prolog PROgramming in LOGic část predikátové logiky prvního řádu rozvoj začíná po roce 1970 Robert Kowalski teoretické základy Alain Colmerauer, David

Binární soubory (datové, typované)

Praktické tipy, programovací jazyky. IB111 Základy programování Radek Pelánek

POČÍTAČE A PROGRAMOVÁNÍ

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

Algoritmy a datové struktury

(a kryptografické odbočky) IB111 Úvod do programování skrze Python

Inovace výuky prostřednictvím šablon pro SŠ

Výrazy a operátory. Operátory Unární - unární a unární + Např.: a +b

Úvod do programování 6. hodina

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program

Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

5. Vyhledávání a řazení 1

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

A7B38UOS Úvod do operačních systémů. 6. Cvičení. Příkazy sed a awk

Metody návrhu algoritmů, příklady. IB111 Programování a algoritmizace

Uživatelský manuál. Aplikace GraphViewer. Vytvořil: Viktor Dlouhý

Metodický koncept k efektivní podpoře klíčových odborných kompetencí s využitím cizího jazyka ATCZ62 - CLIL jako výuková strategie na vysoké škole

Lekce 2. Řetězce a práce s nimi. Vstup a výstup. C2184 Úvod do programování v Pythonu podzim 2016

8. Rekurze. doc. Ing. Jiří Vokřínek, Ph.D. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze

Úvodem... 9 Kapitola 1 Karetních

Programování a algoritmizace: úvod

Marketingová komunikace. 2. soustředění. Mgr. Pavel Vávra Kombinované studium Skupina N9KMK1aPH/N9KMK1bPH (um1a1ph/um1b1ph)

Programování v C++, 2. cvičení

ANOTACE vytvořených/inovovaných materiálů

Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague

Dotazy tvorba nových polí (vypočítané pole)

Programování v Pythonu

Dynamické datové struktury III.

Obsah. Proč právě Flash? 17 Systémové požadavky 17. Jak používat tuto knihu 18 Doprovodný CD-ROM 19

Funkcionální programování. Kristýna Kaslová

Výukový materiál zpracován v rámci projektu EU peníze školám

PHP tutoriál (základy PHP snadno a rychle)

Úvod do programování 8. hodina

Chyby a výjimky. Chyba. Odkud se chyby berou? Kdo chyby opravuje? Co můžete dělat jako programátor? Dvě hlavní metody práce s chybami.

Použití dalších heuristik

4EK311 Operační výzkum. 1. Úvod do operačního výzkumu

Transkript:

Využití datových struktur, práce s textem IB111 Úvod do programování 2016

Výhled dnes: logické úlohy a hry, textová data příště: obrázky nástroje pro práci s textem/obrázky ilustrační příklady využití datových struktur co kdy použít výhody a nevýhody různých reprezentací uvažování o problémech, volba přístupu, kladení otázek

Práce se soubory připomenutí Otevírání a zavírání: f = open("myfile.txt") otevření pro čtení f = open("myfile.txt","w") otevření pro zápis f.close() uzavření souboru zápis pomocí with lepší praxe (ale pokročilejší, souvisí s výjimkami) Čtení a zápis: f.readline() vrátí další řádek ze souboru f.readlines() vrátí seznam všech zbývajících řádků f.write(text) zapíše do souboru

Logické úlohy, hry Hanojské věže Problém N dam Číselné bludiště Šachy Člověče, nezlob se! Pexeso Piškvorky algoritmus reprezentace stavu

Reprezentace stavu přednáška o rekurzi: Hanojské věže seznam seznamů (různé délky): velikosti disků Problém N dam 2D mřížka seznam seznamů (fixní délky) True/False seznam souřadnic optimalizovaný seznam souřadnic

Číselné bludiště jednoduchá logická úloha Ilustrace pojmů a postupů: návrh algoritmu volba datových struktur seznam seznamů slovník fronta načítání ze souboru objekty

Číselné bludiště levý horní roh pravý dolní roh skoky vertikálně a horizontálně, číslo = délka skoku 4 1 1 3 3 2 2 4 4 2 1 2 4 3 3 2 2 3 1 4 3 3 3 4 3 1 1 4 4 3 1 3 3 1 1 2 1 4 4 3 1 2 1 4 2 3 4 4 2 4 4 3 3 3 3 2 2 3 3 3 3 1 2 2 2 3 2 1 4 4 4 1 K vyzkoušení: tutor.fi.muni.cz

Variace nejkratší cesta vzhledem k počtu skoků vzhledem k celkové délce cesty kontrola jednoznačnosti nejkratšího řešení generování co nejtěžšího zadání

Reprezentace bludiště Jak budeme v programu reprezentovat bludiště? 2 4 4 3 3 2 3 3 2 3 3 2 3 1 3 2 2 3 2 1 1 4 4 4 zadani.txt: 5 24433 23323 32313 22321 14440

Seznam seznamů klasická reprezentace dvojrozměrné pole (seznam seznamů v Pythonu) maze[x][y] = number [[2, 2, 3, 2, 1], [4, 3, 2, 2, 4], [4, 3, 3, 3, 4], [3, 2, 1, 2, 4], [3, 3, 3, 1, 0]] 2 4 4 3 3 2 3 3 2 3 3 2 3 1 3 2 2 3 2 1 1 4 4 4 Poznámka: maze[x][y] nebo maze[y][x]? (častý zdroj chyb: nekonzistence)

Načítání ze souboru def read_maze(filename = "input.txt"): f = open(filename) n = int(f.readline()) maze = [ [ 0 for y in range(n) ] for x in range(n) ] for y in range(n): line = f.readline() for x in range(n): maze[x][y] = int(line[x]) f.close() return maze

Algoritmus Jak najít řešení? 2 4 4 3 3 2 3 3 2 3 3 2 3 1 3 2 2 3 2 1 1 4 4 4

Algoritmus speciální případ obecného prohledávání do šířky : systematicky zkoušíme všechny následníky pamatujeme si, kde už jsme byli pro každé pole si pamatujeme předchůdce (rekonstrukce cesty)

Algoritmus

Datové struktury co si potřebujeme pamatovat: fronta polí, které musíme prozkoumat (světle zelená pole) množina polí, která už jsme navštívili (tmavě zelená pole) informace o předchůdcích (světle modré šipky) optimalizace: podle informace o předchůdcích poznáme, kde už jsme byli

Zápis v Pythonu přímočaré řešení def solve(n, maze): start = (0, 0) queue = deque([start]) pred = [[ (-1, -1) for x in range(n) ] for y in range(n) ] while len(queue) > 0: (x, y) = queue.popleft() if maze[x][y] == 0: print_solution((x, y), pred) break k = maze[x][y] if x+k < n and pred[x+k][y] == (-1, -1): queue.append((x+k, y)) pred[x+k][y] = (x, y) if x-k >= 0 and pred[x-k][y] == (-1, -1): queue.append((x-k, y)) pred[x-k][y] = (x, y) if y+k < n and pred[x][y+k] == (-1, -1): queue.append((x, y+k)) pred[x][y+k] = (x, y) if y-k >= 0 and pred[x][y-k] == (-1, -1): queue.append((x, y-k)) pred[x][y-k] = (x, y)

Poznámky příkaz break opuštění cyklu využití zkráceného vyhodnocování

Alternativní reprezentace: slovník slovník indexovaný dvojicí souřadnice (x, y) číslo na dané souřadnici maze[(x, y)] = number {(1, 2): 2, (3, 2): 1, (0, 0): 2, (3, 0): 3, (2, 2): 3, (2, 1): 3, (1, 3): 2, (2, 3): 3, (1, 4): 4, (2, 4): 4, (4, 2): 3, (0, 3): 2,... } 2 4 4 3 3 2 3 3 2 3 3 2 3 1 3 2 2 3 2 1 1 4 4 4

N-tice a závorky U n-tic většinou nemusíme psát závorky: a, b = b, a místo (a, b) = (b, a) maze[x, y] místo maze[(x, y)]

Slovník vs seznam seznamů Pozor na rozdíl! maze[x][y] seznam seznamů maze[x, y] slovník indexovaný dvojicí

Další vylepšení Zobecnění repetitivního kódu: Předchůdci copy&paste kód pro 4 směry for cyklus přes 4 směry pamatujeme si rovnou celou cestu také slovník

Upravený kód def solve(maze): start = (0, 0) queue = deque([start]) pred = {} pred[start] = [start] while len(queue) > 0: (x, y) = queue.popleft() if maze[x, y] == 0: print(pred[x,y]) for (dx, dy) in [(-1,0), (1,0), (0,-1), (0,1)]: newx = x + dx * maze[x, y] newy = y + dy * maze[x, y] if (newx, newy) in maze and \ not (newx, newy) in pred: queue.append((newx, newy)) pred[newx, newy] = pred[x, y] + [(newx, newy)]

Poznámky Někdy jsou závorky důležité: s = [1, 2] seznam obsahující dva prvky s = [(1, 2)] seznam obsahující jeden prvek (dvojici) s.append((1, 2)) přidávám dvojici s.append(1, 2) volám append se dvěma argumenty (chyba)

Objektová reprezentace class Maze: def init (self): # initialize def read(self, filename): # read maze from file def solve(self): # find solution def print_solution(self): # text output def save_image(self, filename, with_solution = True): # save maze as an image

Volba datové struktury Jaká datová struktura pro reprezentaci stavu? Piškvorky plán omezené velikosti neomezený plán Člověče, nezlob se! Želví závody Pexeso

Člověče, nezlob se!

Želví závody

Pexeso simulace paměti simulace hry pexeso hráči s různě dokonalou pamětí: prázdná paměť (náhodná hra) dokonalá paměť omezená paměť buffer velikosti k pravděpodobnost výhry pro jednotlivé hráče reprezentace stavu hry (kartiček)? reprezentace paměti?

Práce s textem více o operacích s textem regulární výrazy ukázky

Rozdělení řetězce split rozdělí řetězec podle zadaného podřetězce, vrací seznam částí join spojení seznamu řetězců do jednoho >>> retezec = "Holka modrooka nesedavej u potoka" >>> retezec.split() [ Holka, modrooka, nesedavej, u, potoka ] >>> retezec.split( o ) [ H, lka m, dr,, ka nesedavej u p, t, ka >>> retezec.split( ka ) [ Hol, modroo, nesedavej u poto, ]

Řetězce: další funkce find, count vyhledávání a počítání podřetězců lower, upper převod na malá/velká písmena ljust, rjust, center zarovnání textu lstrip, rstrip ořezání bílých znaků na začátku/konci Pozn. objektová notace, metody

Regulární výrazy nástroj pro hledání vzorů v textu programování textové editory příkazová řádka: např. grep teorie: formální jazyky, konečné automaty

http://xkcd.com/208/

Regulární výrazy obecně používaný nástroj syntax velmi podobná ve většině jazyků, prostředí ukázky základního využití v Pythonu

Ukázka f = open("slovnik.txt") for line in f.readlines(): line = line.rstrip() if re.search(r st.*st, line): print(line) f.close()

Znaky a speciální znaky základní znak vyhoví právě sám sobě speciální znaky:. ^ $ * +? { } [ ] \ ( ) umožňují konstrukci složitějších výrazů chceme, aby odpovídaly příslušnému symbolu prefix \

Skupiny znaků [abc] jeden ze znaků a, b, c [^abc] cokoliv jiného než a, b, c \d Čísla: [0-9] \D Cokoliv kromě čísel: [^0-9] \s Bílé znaky: [ \t\n\r\f\v] \S Cokoliv kromě bílých znaků: [^ \t\n\r\f\v] \w Alfanumerické znaky: [a-za-z0-9_] \W Nealfanumerické znaky: [^a-za-z0-9_]

Speciální symboly. libovolný znak ^ začátek řetězce $ konec řetězce alternativa výběr jedné ze dvou možností

Opakování * nula a více opakování + jedno a více opakování? nula nebo jeden výskyt {m,n} m až n opakování Pozn. *, + jsou hladové, pro co nejmenší počet opakování *?, +?

Příklady Jaký je význam následujících výrazů? \d[a-z]\d \d\d\d\d \d{3}\s?\d{3}\s?\d{3} [a-z]+@[a-z]+\.cz ^To:\s*(fi kit)(-int)?@fi\.muni\.cz

Regulární výrazy v Pythonu knihovna re (import re) re.match hledá shodu na začátku řetězce re.search hledá shodu kdekoliv v řetězci (re.compile pro větší efektivitu) raw string r vyraz nedochází k interpretaci speciálních znaků jako u běžných řetězců v Pythonu

Regulární výrazy v Pythonu: práce s výsledkem match/search vrací MatchObject pomocí kterého můžeme s výsledkem pracovat pomocí kulatých závorek () označíme, co nás zajímá

Regulární výrazy v Pythonu: práce s výsledkem >>> m = re.match(r"(\w+) (\w+)", \ "Isaac Newton, fyzik") >>> m.group(0) Isaac Newton >>> m.group(1) Isaac >>> m.group(2) Newton

Regulární výrazy: xkcd http://xkcd.com/1313/ http://www.explainxkcd.com/wiki/index.php/1313:_regex_golf https://regex.alf.nu/

Analýza textu statistiky délky slov a vět: x průměr s směrodatná odchylka (míra variability) slova věty x s x s Starý zákon 4.3 2.3 14.9 7.8 Čapek 4.5 2.5 14.9 13.3 Pelánek 5.9 3.6 13.5 6.9 Wikipedie 5.6 3.0 14.8 8.3

Analýza textu postup 1 text seznam délek slov (vět) 2 seznam délek statistiky přímočaré řešení 1. kroku: procházet vstup po znacích pamatovat si délku aktuálního slova, věty speciální znak (mezera, tečka a podobně) aktualizace seznamu

Imitace textu vstup: rozsáhlý text výstup: náhodně generovaný text, který má podobné charakteristiky jako vstupní text imitace na úrovni písmen nebo slov

Náhodnostní imitace vstupního textu I špiské to pole kavodali pamas ne nebo kdy v Dejný Odm sem uvalini se zabijí s Pan stěží ře, a silobe lo v ne řečekovících blova v nadrá těly jakvěmutelaji rohnutkohonebout anej Fravinci V A pěk finé houty. zal Jírakočítencej ské žil, kddo jak a to Lorskříže si tomůžu schno mí, kto. Kterak král kočku kupoval V zemi Taškářů panoval král a zapřisáhl se velikou přísahou že bude pochválena První pán si jí ani nevšimnul zato druhý se rychle shýbl a Jůru pohladil Aha řekl sultán a bohatě obdaroval pana Lustiga koupil od něho telegram z Bombaje v Indii není o nic horší člověk nežli někdo z mých hraček Kdepak mávl Vašek rukou

Základní přístup 1 vstupní text statistiky textu 2 statistiky generování náhodného textu Co jsou vhodné statistiky?

Statistiky textu základ: frekvence písmen (slov) rozšíření: korelace mezi písmeny (slovy) příklad: pokud poslední písmeno bylo a: e velmi nepravděpodobné (méně než obvykle) l, k hodně pravděpodobná (více než obvykle)

Implementace základní frekvenční analýza datová struktura slovník písmeno frekvence rozšířená analýza slovník slovníků písmeno { písmeno frekvence } generování podle aktuálního písmene získám frekvence vyberu náhodné písmeno podle těchto frekvencí vážená ruleta

Imitace sofistikovaněji Recurrent Neural Networks dokáží postihnout i složitější aspekty jazyka básně, recepty, Wikipedia články, zdrojové kódy,... http://karpathy.github.io/2015/05/21/rnn-effectiveness/

Statistiky jmen data: četnosti jmen, příjmení podle roků, krajů,... zdroj: Ministerstvo vnitra ČR http://www.mvcr.cz/clanek/ cetnost-jmen-a-prijmeni-722752.aspx XLS pro zpracování v Pythonu uložit jako CSV (comma-separated values) doporučené cvičení snadno zpracovatelné zajímavá data cvičení na vymýšlení otázek následuje několik ukázek pro inspiraci...

Poznámky ke zpracování slovník: jméno seznam výskytů CSV funkce split seznam normalizace (relativní výskyty jmen) podělit součtem (pro daný rok) různě velké ročníky neúplná data u starých ročníků

Vyučující IB111: JAN, JAROSLAV, JIŘÍ, MAREK, MATĚJ, NIKOLA, ONDŘEJ, RADEK, TOMÁŠ, VALDEMAR

Otázky Co zajímavého můžeme z dat zjistit? Kladení otázek důležitá dovednost hodná tréninku. Computers are useless. They can only give you answers. (Pablo Picasso)

Identifikace trendů U kterých jmen nejvíce roste/klesá popularita? co to vlastně znamená? jak formalizovat?

Nejdelší růst/pokles Kolik let v řadě roste popularita jména: Tobiáš 14 Viktorie, Ella, Sofie 9 Elen, Tobias 8 Kolik let v řadě klesá popularita jména: Jana 26 Martin 21 Petra 11 Zdeněk 9

Největší skok v popularitě za 10 let alespoň desetinásobný nárůst popularity: Sofie, Elen, Amálie, Ella, Nicol, Nella, Tobias pokles alespoň o 60 %: Petra, Pavlína, Martina

Zdroje zajímavých dat Otevřená data / Open data http://www.opendata.cz http://www.otevrenadata.cz http://www.data.gov http://data.gov.uk

Zpracování dat seriózněji využití existujících knihoven: načítání dat ve standardních formátech: HTML, XML, JSON, CSV,... operace s daty: numpy, pandas vizualizace: matplotlib prostředí ipython interaktivní prozkoumávání dat

Shrnutí využití datových struktur: seznamy seznamů, slovníky práce s textem: split, regulární výrazy kladení otázek, přístup k problému