====== Spam filter: Specifikace ====== Na této stránce jsou popsány požadavky, jimž **musíte vyhovět!** Jejich nedodržení by mohlo vést k tomu, že vaše řešení úlohy nebude uznáno jako platné! * Spam filtr musí fungovat v **Pythonu 3.5.x** (2018-12-11 upraveno na **Python 3.6.x**), který bude nainstalován na strojích pro automatické hodnocení! Jinak se může stát, že vaše kódy nebudou fungovat správně! * Je dán **[[.data|předepsaný formát dat a metadat]]**, která budete buď číst nebo vytvářet. Když jej nedodržíte, váš filtr nebude rozumět datům, která mu budeme předkládat při testování, nebo my nebudeme rozumět výstupům, které váš filtr vytvoří. * Úloha má definovány 2 kontrolní body, jejichž požadavky jsou detailně popsány níže: - Specifikace pro [[#xx_sp_eval|sp_eval]]. - Specifikace pro [[#xx_sp_filt|sp_filt]]. ===== xx_sp_eval ===== Účelem prvního kontrolního bodu je zajistit, že všichni máte k dispozici funkci, který správně ohodnotí kvalitu filtru. Předmětem testování v této fázi bude pouze funkce ''compute_quality_for_corpus()'' (a kód, který tato funkce využívá), jejíž detailnější specifikaci najdete v [[krok3#funkce_compute_quality_for_corpus|kroku 3]]. ==== Míra kvality filtru ==== "Kvalita filtru", podle níž budou přidělovány body, se bude počítat podle následujícího vzorce: $$q = \frac{TP + TN}{TP + TN + 10 \cdot FP + FN}$$ Pozitivní případy (//P//) zde odpovídají mailům, které filtr označil jako spam, negativní (//N//) pak těm, které filtr označil jako korektní emaily. //FP// tedy označuje počet korektních emailů označených jako spam, //FN// označuje počet spamů označených jako korektní email. Zdůrazňujeme, že hodnoty //TP, FP, TN, FN// ve výše uvedeném vzorci představují **počty případů**, nikoli procenta. ==== Co odevzdat? ==== * **ZIP archív s vaším modulem ''quality.py'' a případně se všemi moduly, které tento modul importuje.** * **Tyto soubory musí být v kořeni archívu**, nesmí být vnořeny v žádném adresáři! * Pokud jste postupovali podle návodu, měl by váš ZIP obsahovat nejspíše soubory ''quality.py'', ''confmat.py'', ''utils.py'', příp. další. * **Neodevzdávejte** testy k jednotlivým krokům! ===== xx_sp_filt ===== Cílem druhého kontrolního bodu je otestovat a ohodnotit vámi vytvořený filtr. Předmětem testování bude třída ''MyFilter'', jejíž detailnější specifikace najdete v [[krok6#trida_myfilter|kroku 6]]. ==== Časové požadavky ==== * Vytvoření objektu filtru (metoda ''__init__()'') by měla být rychlá operace trvající maximálně sekundy, spíše mnohem méně. * Učení filtru (metoda ''train()'') na několika stovkách emailů by nemělo trvat déle než desítky sekund, maximálně jednotky minut. Ve většině případů to lze zvládnout mnohem rychleji. V BRUTE bude nastaven limit na učení 5 minut. * Aplikace filtru na nová data (metoda ''test()'') by už měla být také rychlá operace trvající maximálně jednotky sekund. V BRUTE bude nastaven limit na predikci 2 minuty. ==== Velikost uploadu ==== * ZIP archiv, který obsahuje pouze kód, nebude větší než jednotky kB. * Chcete-li se svým filtrem odevzdat i nějaká předpočítaná data, můžete, ale pak by velikost ZIP archivu neměla překročit 1 MB. Pokud myslíte, že vás tento limit příliš omezuje, proberte své řešení se svým cvičicím. * Kód nesmí stahovat jakákoli data z internetu. ==== Filtr nesmí ==== * snažit se navázat spojení s jiným počítačem, jiným procesem a pod. * využívat knihovny třetích stran jako nltk, sklearn, pandas, atp., protože na hodnoticím stroji nebudou nainstalované (využijte jen standardní knihovnu Pythonu) * být nepatřičně zvídavý, např. prohlížet obsah disku * ... ==== Co odevzdat? ==== * Odevzdávat budete **ZIP archív s vaším modulem ''filter.py'' a všemi soubory, které váš filter potřebuje.** * **Tyto soubory musí být v kořeni archívu**, nesmí být vnořeny v žádném adresáři! * Pokud jste postupovali podle návodu, měl by váš archív obsahovat následující soubory: - ''filter.py''. Implementace vašeho filtru. - ''basefilter.py''. Pokud jste našli nějakou funkcionalitu, která je společná všem filtrům a extrahovali jste ji např. do třídy ''BaseFilter'' v modulu ''basefilter.py'', od které třída vašeho filtru dědí, musíte do archívu zařadit i soubor ''basefilter.py''. - ''corpus.py'' a ''trainingcorpus.py''. Pravděpodobně jste si uvědomili, že v metodě ''train()'' vašeho filtru s výhodou využijete třídu ''TrainingCorpus'', zatímco v metodě ''test()'' využijete zase třídu ''Corpus''. Pokud je využíváte, musíte je odevzdat v archivu spolu s vaším filtrem. - ''utils.py''. Vaše třída ''TrainingCorpus'' pravděpodobně využívá funkci ''read_classsification_from_file'' z modulu ''utils.py'', musíte tedy do archívu zahrnout i tento soubor. - případné další soubory, které váš filtr potřebuje k činnosti. * **Neodevzdávejte** moduly, které váš filtr přímo nevyužívá, např. moduly ''quality'' nebo ''confmat''. * **Neodevzdávejte** testy k jednotlivým krokům!