====== 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 oznáno jako platné!
* Spam filtr musí fungovat v **Pythonu 3.4.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 ====
* Vyvoř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řelkroč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!