====== Spam III ====== * Dotazy a odpovědi * Kontrola DÚ z minulého týdne * Varování před přílišnou podobností kódů * Tutoriál: Dědičnost * Hádanka * Demonstrace problému přeučení * Programovací úloha * Konzultace problémů a práce na úloze Spam filter * **CÍL**: dovést všechny studenty do stavu, v němž proběhnou unit testy ke krokům 2, 3, 4 a příp. 5. ===== Dědičnost v OOP ===== * Bude se týkat tříd ''TrainingCorpus'' a jednotlivých spam filtrů. ==== Interaktivní programovací úloha a příklad k diskusi ==== ++++ Teplé nápoje | Máme malé automatizované bistro. Prodáváme v něm tureckou kávu a čaj. Recept na kávu: - Uvař vodu - Dej do šálku dávku mleté kávy - Zalij kávu vodou - Přidej mléko, cukr, atd., pokud si to zákazník přeje. Recept na čaj: - Uvař vodu - Dej do šálku sáček čaje - Zalij čaj vodou - Přidej citron, cukr, atd., pokud si to zákazník přeje. Dotazy k diskusi: * Jaké entity zde vystupují? Co mají společného? * Jaké jsou mezi nimi vztahy? (IS-A) Vytvořte software pro automatické vyřizování objednávek tak, aby následující kód objednavka = [TureckaKava('mléko a cukr'), Caj('citrón'), TureckaKava('mléko')] for napoj in objednavka: napoj.priprav() print() měl následující výstup: Vařím vodu. Dávám do šálku lžičku mleté kávy. Nalévám vodu do šálku. Přidávám mléko a cukr. Vařím vodu. Dávám do šálku sáček čaje. Nalévám vodu do šálku. Přidávám citrón. Vařím vodu. Dávám do šálku lžičku mleté kávy. Nalévám vodu do šálku. Přidávám mléko. > {{page>..:..:internal:cviceni:inheritance#Napoje&editbtn}} ++++ ++++ Dopravní prostředky | Mějme strategickou počítačovou hru typu Civilizace, Transport Tycoon nebo SimCity. Ve hře se vyskytují různé typy dopravních prostředků: * Co mají společného? * Jaké jsou mezi nimi vztahy? (Is-a) Předpokládejme, že chceme namodelovat schopnost těchto prostředků pohybovat se s tím, že bychom chtěli nějak zohlednit, že ne každé místo může být pro každý dopravní prostředek dosažitelné. Zkusme vytvořit systém, který např. po inicializaci 3 prostředků a po požadavku na přesun do Prahy vehicles = [ WaterVehicle(id='Titanic', current_location='Liverpool'), GroundVehicle(id='Humvee', current_location='Baghdad'), AirVehicle(id='Air Force One', current_location='Washington') ] for vehicle in vehicles: vehicle.move_to('Prague') print(vehicle) vypíše např. toto: Titanic: No route available. Current location: Liverpool Humvee: Travelled via ('Baghdad', 'gas station', 'Prague'). Current location: Prague Air Force One: Travelled via ('Washington', 'Prague'). Current location: Prague > {{page>..:..:internal:cviceni:inheritance#dopravni_prostredky&editbtn}} ++++ ===== Hádanka ===== /* [[https://forms.gle/kFqxMq54p7hjByPu6|101]] | [[https://forms.gle/3nLTaoxHoVa3zQVk7|102]] | [[https://forms.gle/QaZvFUtncp1Ne1CH7|103]] | [[https://forms.gle/vzsGD3QyLgcqMk1g7|104]] | [[https://forms.gle/oMqTMgeh4ao4uiwL8|105]] | [[https://forms.gle/uyin2XUR2RuBFCna6|106]] | [[https://forms.gle/MuffuZrZW4u4wWx8A|107]] | [[https://forms.gle/4kfZisGQAbhkvdvHA|108]] | [[https://forms.gle/yARdGc2Gxtt5qAudA|109]] */ > {{page>courses:b4b33rph:internal:puzzles#cviceni_10}} ===== Přeučení ===== Představme si, že máme učicí se filtr, který funguje následovně. Při trénování si pro všechny trénovací emaily zapamatuje začátek řetězce zprávy o délce N a třídu, do níž daný email patří. Při hodnocení nové zprávy spočítá, s kolika spamy a s kolika hamy se shoduje začátek nové zprávy, a zaklasifikuje zprávu podle majority. Parametr N představující délku fragmentů, které si filtr pamatuje, nám umožňuje filtr ladit. * Jak se chová míra kvality měřená na trénovacích a testovacích datech v závislosti na změně parametru N? * Jaká hodnota N je pro tento filtr a daná data optimální? Jaké hledisko vlastně použijeme k posouzení optimality? > {{page>..:..:internal:cviceni:spam:preuceni&editbtn&noheader}} ===== Programování/konzultace ===== Dotáhněte úlohu spam filter do stavu, kdy vám **fungují jednoduché filtry a jste schopni spočítat jejich kvalitu** (tedy až do kroku 4). Pokud vám něco není jasné, **ptejte se cvičícího!** * Neprochází-li vaše kódy přes unit testy ke krokům 2 nebo 3, **rozhodně** kontaktujte vyučujícího a v diskusi s ním si vyjasněte, kde je chyba a jak je třeba pokračovat! * Neprochází-li vaše třída TrainingCorpus přes unit test ke kroku 5 a rádi byste vypracovali filtr, který se umí učit, opět kontaktujte vyučujícího! * V čase zbývajícím do odevzdání byste měli pracovat už jen na vlastním filtru, všechny podpůrné třídy a funkce byste již měli mít hotové! Využijte příležitosti - vyučující je na cvičeních pro vás! ===== Programovací tipy ===== Projděte si sekci [[..:spam:krok6#programovaci_tipy|krok 6: programovací tipy]] uvedenou v programu prací na úloze spam. Obsahuje (neúplný) výčet tříd, metod a funkcí jazyka Python, které by se vám mohly při vytváření spam filtru hodit. ====== Domácí úkol ====== Na konci roku je termín pro **odevzdání 2. části úlohy Spam filtr**! Postupujte podle [[..:spam:specifikace#sp-filt|specifikací]]. Termín najdete v odevzdávacím systému. ===== Programování ===== * [[..:spam:krok5|Krok 5 - třída TrainingCorpus]], pokud ji ve svém filtru budete využívat. * [[..:spam:krok6|Krok 6 - vlastní filtr]]: pusťte se do něj! Dotazy na fóru nebo emailem.