====== Spam III ======
[[courses:b4b33rph:internal:cviceni:program_po_tydnech:tyden_10|Učitelská verze stránky]]
===== Výsledky učení =====
Po tomto cvičení student
* má hotové triviální filtry a umí změřit jejich kvalitu na datové sadě,
* chápe, v čem může být dědičnost užitečná při implementaci spam filtrů.
===== Program =====
* 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
* Programovací úloha
* Konzultace problémů a práce na úloze Spam filter
===== Dědičnost v OOP =====
Může se týkat
* tříd ''Corpus'' a ''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.
++++
++++ 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 =====
Zadání hádanky se dozvíte na cvičení.
===== 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 znaků 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?
===== 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.