====== Spam filter - krok 4 ====== Vytvořte 3 jednoduché neadaptivní filtry, paranoidní, naivní a náhodný, a u každého z nich určete, jak kvalitní predikce poskytuje. [[.unit_testing|Testy]] ke kroku 4: * samostatně {{test4_simplefilters.zip|}} nebo * společně se všemi předchozími testy {{test4_all.zip|}}. ===== Příprava ===== Rozmyslete si a načrtněte na kus papíru: * Jakým způsobem se spam filtr vlastně používá? * Jaký je z hlediska implementace rozdíl mezi učicím se filtrem a filtrem, který se učit neumí? * Existuje nějaká část, kterou budou mít všechny spam filtry společnou? * Je lepší realizovat spam filtr jako funkci nebo jako objekt s vlastnostmi a metodami? * Jaké jsou minimální požadavky na tuto realizaci? Co všechno by měla umět? Jaké musí mít vstupy a co musí být jejím výstupem? ===== Příprava: Dědičnost ===== Prostudujte si, jak v OOP funguje a jak se v Pythonu realizuje //dědičnost//. Informace najdete např. * v oficiálním [[https://docs.python.org/3.4/tutorial/classes.html#inheritance|Python tutoriálu]], nebo * v {[b4b33rph:Wentworth2012]}, [[http://openbookproject.net/thinkcs/python/english3e/inheritance.html|kapitola 23]] (navazuje na [[http://openbookproject.net/thinkcs/python/english3e/collections.html|kapitolu 22]]). /* Jak **zjistit parametry skriptu z příkazové řádky**: * Seznam ''[[http://docs.python.org/library/sys.html#sys.argv|sys.argv]]'' */ ===== Jednoduché filtry ===== Úkoly: * **V modulu ''simplefilters.py''** vytvořte tři třídy představující tři hloupé filtry: * ''NaiveFilter'', který bude všechny emaily klasifikovat jako OK, * ''ParanoidFilter'', který bude všechny emaily klasifikovat jako SPAM, a * ''RandomFilter'', který bude maily náhodně zařazovat do tříd OK a SPAM. * Mají-li tyto filtry nějaké části společné, zkuste tyto rysy extrahovat do společného předka ''BaseFilter'' **v modulu ''basefilter.py''**. K čemu nám to bude: * Na jednoduchých filtrech si ukážeme základní kostru třídy představující v našem "frameworku" spamový filtr. Současně budeme mít k dispozici nějaké filtry, jejichž kvalitu si budeme moci otestovat pomocí funkcí z předchozího kroku. ==== Specifikace ==== Abychom umožnili pozdější automatické testování vašeho finálního filtru, budeme vyžadovat, aby se třída vašeho filtru jmenovala ''MyFilter'' a byla umístěna v modulu ''filter.py''. V tomto kroku ale máte vytvořit 3 třídy pojmenované ''NaiveFilter'', ''ParanoidFilter'' a ''RandomFilter'' umístěné v modulu ''simplefilters.py''. Filtr pro nás bude představován třídou, která bude mít minimálně dvě metody: ''train()'' a ''test()''. Filtry, které se nebudou učit z dat, budou mít metodu ''train()'' prázdnou. Další struktura třídy je libovolná. Metoda ''train()'': ^ Vstupy | Cesta k adresáři s ohodnocenými emaily, tj. adresář musí obsahovat soubor ''!truth.txt''. (Pro jednoduché filtry je to jedno.)| ^ Výstupy | Nic. | ^ Efekty | Vytvoření a nastavení vnitřních datových struktur třídy, aby byly později využitelné metodou ''test()''. | Metoda ''test()'': ^ Vstupy | Cesta k adresáři s maily. (Adresář nebude obsahovat soubor ''!truth.txt''.) | ^ Výstupy | Nic. | ^ Efekty | Vytvoří v zadaném adresáři soubor ''!prediction.txt''. | >{{page>..:..:internal:cviceni:spam:krok4#spolecny_predek&editbtn}} >{{page>..:..:internal:cviceni:spam:krok4#jednoduche_filtry&editbtn}} ===== Hodnocení kvality jednoduchých filtrů ===== Vytvořte jednoduchý skript, který vypočte kvalitu predikcí zvoleného filtru. Skript: * importuje třídu zvoleného filtru, * zavolá metodu ''train()'' na jedné poskytnuté datové sadě, * zavolá metodu ''test()'' na druhé poskytnuté datové sadě, * zavolá ''compute_quality_for_corpus()'' pro druhou datovou sadu, * kvalitu vypíše, * odstraní soubor ''!prediction.txt'' z datové sady.