Úloha “Spam filter” má definovány 2 kontrolní body.
Spam filtr musíte vypracovat v Pythonu 3.4.x, který bude nainstalován na strojích pro automatické hodnocení! Pokud této podmínce nevyhovíte, může se stát, že váš filtr nebude správně fungovat!
Vaším úkolem je vytvořit třídu MyFilter v modulu filter.py, která
train(train_corpus_dir),test(test_corpus_dir), tj. vytvoří v adresáři testovacího korpusu soubor !prediction.txt. Metoda by měla být schopná pracovat i tehdy, když předtím nedojde k natrénování filtru metodou train().
V korpusech se mohou vyskytovat speciální soubory, jejichž název vždy začíná znakem ! (např. !truth.txt). Tyto soubory neobsahují maily - ignorujte je!
Detailnější informace v následujících sekcích.
Třída bude definována v modulu s názvem filter.py. Typické použití třídy bude následující:
from filter import MyFilter filter = MyFilter() filter.train('/path/to/training/corpus') # Tento adresář bude obsahovat soubor !truth.txt filter.test('/path/to/testing/corpus') # V tomto adresáři metoda vytvoří soubor !prediction.txt
Protože by ale metoda test() měla být schopná pracovat i bez předchozího volání metody train(), je přípustné i toto použití:
from filter import MyFilter filter = MyFilter() filter.test('/path/to/testing/corpus') # V tomto adresáři metoda vytvoří soubor !prediction.txt
Při hodnocení kvality predikcí filtru samozřejmě budeme vždy volat metodu train() před metodou test().
MyFilter implementovat metodu train(), která ovšem může být prázdná.
!truth.txt s informací o skutečné třídě emailů v daném korpusu.
!prediction.txt, v němž pro každý soubor s emailem v testovacím korpusu uvede řádek nazevsouboru OK, jedná-li se (podle mínění filtru) o korektní email, nebo nazevsouboru SPAM, jedná-li se (podle mínění filtru) o spam.
!truth.txt v adresářích testovacích korpusů. Testy budou probíhat tak, že tam žádný takový soubor nebude!
train(). V metodě test() pak bude nějakým způsobem využívat postupy zvolené autorem, podle nichž pro každý testovací email určí, jedná-li se o spam nebo ham.
train(). V metodě test() se pak bude rozhodovat na základě externích informací uložených v souboru (souborech) uploadovaných spolu se zdrojovým kódem filtru. Důvodem k takovéto “architektuře” může být např. to, že proces učení filtru je časově náročný - filtr byl studentem naučen offline a předem. (Pokud chce student v tomto případě body za to, že se filtr umí učit, musí na cvičení svého cvičícího přesvědčit, že předem připravené informace skutečně pocházejí z procesu učení.) Jiným důvodem použití této varianty může být využití nějakého externího slovníku, apod.
train() a ta je dostatečně rychlá, že zvládne extrahovat potřebné znalosti z informací uložených v řádově stovkách emailů (velikost trénovací sady).
Odevzdávat budete 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, archív nesmí obsahovat žádné adresáře! Pokud jste postupovali podle návodu, měl by váš archív obsahovat nejspíše soubory quality.py, confmat.py, utils.py, příp. další.
Předmětem testování v této fázi bude pouze funkce compute_quality_for_corpus(), tedy výstup z kroku 3, kde najdete i její specifikace. Chceme tím zajistit, abyste všichni měli po ruce funkci, která vám snadno a správně vypočte, jak dobře vaše filtry pracují (jak kvalitní predikce poskytují).
Odevzdávat budete ZIP archív s vaším filtrem a všemi soubory, které váš filter potřebuje. Tyto soubory musí být v kořeni archívu, archív nesmí obsahovat žádné adresáře! 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.
quality nebo confmat.