Implementujte vlastní, co nejlepší filtr.
Testy ke kroku 6:
Rozmyslete si, jaké vnitřní mechanismy byste chtěli ve svém filtru použít, podle čeho by se váš filtr měl rozhodovat mezi korektním emailem a spamem a jak by se dal takový filtr učit z dat.
Projděte si také sekci s několika tipy, které by se vám při konstrukci filtru mohly hodit.
Na tomto místě bychom vám rádi poskytli pár užitečných tipů ke konstrukci vlastních filtrů. Zdaleka ne vše, co je v této sekci uvedeno, budete nutně potřebovat. Např. nepředpokládáme, že budete využívat modul email
nebo regulární výrazy (i když samozřejmě můžete).
Procházení uspořádaných prvků slovníku (čítače)
Úkol:
K čemu nám to bude:
Následující specifikace pro třídu MyFilter
jsou povinné a musíte jim vyhovět!
V modulu filter.py
vytvořte třídu MyFilter
, která bude schopna
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()
.
Typické použití třídy MyFilter
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í (a bude také testováno):
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).