Search
yield
read_classification_from_file()
encoding
open(filename, mode, encoding='utf-8')
Zadání na interních stránkách.
Druhá část úlohy Spam filtr je týmová. Bylo by dobře, kdybyste nejpozději příští týden věděli, s kým budete v týmu. Dejte nám vědět, zda tým už máte nebo si někoho najdete sami, zda byste chtěli, abychom vám někoho přidělili, nebo zda máte k týmové práci takový odpor, že opravdu chcete úlohu řešit sami.
Dotazník
Pokud se rozhodnete úlohu řešit sami, vězte, že to bude mnohem více práce: musíte vytvořit kód, report i prezentaci sami. V týmu se o práci můžete podělit.
Pokud někdo stále naráží na problémy, zkuste si přečíst
Opět existuje několik způsobů, jak testy spustit. Vyberte si ten, který vám nejvíc vyhovuje. Spuštění testů z jednoho modulu v Python shellu Spustí testy v jednom modulu: Pokud chcete modul testovat tímto způsobem, je třeba mít přímo v kódu modulu zajištěno vykonání testů, tedy např: if __name__=="__main__": import doctest doctest.testmod() v případě doctestů, nebo if __name__=="__main__": import unittest unittest.main() v případě použití modulu unittest. Postupujte jako v případě spuštění normálního skriptu, viz předchozí sekce (označte celý kód a nechte jej ohodnotit v Python konzoli). Spuštění testů jednoho modulu v nástroji Test Spustí testy v jednom modulu. Otevřete modul s testy v editoru. PyCharm pravděpodobně správně odhalí, že soubor obsahuje unittesty a vytvoří výchozí konfiguraci. Proveďte jednu z následujících akci: Klikněte pravým tlačítkem na název souboru v okně Project. Z kontextové nabídky vyberte možnost Run 'Unittests in …' V drop-down menu v nástrojové liště vyberte Unittests in … a klikněte na zelené tlačítko Run. Z menu Run vyberte položku Run … a vyberte konfiguraci Unittest in … Výsledky testů byste měli vidět v přehledné stromové struktuře v okně nástroje Run. Pokud PyCharm z nějakého důvodu nenabízí výchozí konfiguraci Unittests in …, můžete si ji ručně nadefinovat, viz postup níže. 2017-11-30: Dnes jsme zjistili, že v učebně 307 v PyCharm Community tato možnost nefunguje správně. Pokud narážíte na podobné problémy, zkuste si běhovou konfiguraci nadefinovat ručně (viz následující popis). Stačí použít Target Python s názvem testovaného modulu, např. test_readClassificationFromFile. Možnost s Target Path občas nefunguje. Spuštění všech testů v adresáři (projektu) najednou v nástroji Test Spustí všechny testy. Pro tuto možnost je nutné nadefinovat si vlastní konfiguraci pro běh a ladění. V menu Run vyberte položku Edit Configurations …. V otevřeném dialogovém okně Run/Debug configurations klikněte na tlačítko zelené plus. V nabídce, která se objeví, vyberte Python tests > Unittests. Vytvoří se prázdná konfigurace, kterou je třeba vyplnit v pravé části dialogu. Vložte jméno konfigurace do políčka Name, např. “All tests”. Na záložce Configuration, ve skupině Unittests, vyberte pro položku Target možnost Path. V editačním poli pod Target vložte cestu k vašim souborům s testy, tedy např. “/skola/rph/spam”. Do pole Pattern vložte vzor pro názvy souborů, v nichž se mají hledat testy, např. “test_*.*”. Ostatní nastavení by nemělo být třeba měnit. Po kliknutí na OK by měla být konfigurace dokončena a připravena k použití. Spusťte konfiguraci. V okně s výsledky byste měli vidět, že se spustily testy ze všech souborů “test_*.py”. 2018/07/17 13:25
Opět existuje několik způsobů, jak testy spustit. Vyberte si ten, který vám nejvíc vyhovuje.
Spustí testy v jednom modulu:
Pokud chcete modul testovat tímto způsobem, je třeba mít přímo v kódu modulu zajištěno vykonání testů, tedy např:
if __name__=="__main__": import doctest doctest.testmod()
if __name__=="__main__": import unittest unittest.main()
unittest
Spustí testy v jednom modulu.
Pokud PyCharm z nějakého důvodu nenabízí výchozí konfiguraci Unittests in …, můžete si ji ručně nadefinovat, viz postup níže.
2017-11-30: Dnes jsme zjistili, že v učebně 307 v PyCharm Community tato možnost nefunguje správně. Pokud narážíte na podobné problémy, zkuste si běhovou konfiguraci nadefinovat ručně (viz následující popis). Stačí použít Target Python s názvem testovaného modulu, např. test_readClassificationFromFile. Možnost s Target Path občas nefunguje.
Spustí všechny testy.
Pro tuto možnost je nutné nadefinovat si vlastní konfiguraci pro běh a ladění.
http://docs.python.org/py3k/library/unittest.html
Stáhněte si testy ke kroku 1 úlohy Spam filtr. Archiv rozbalte do adresáře, kde vyvíjíte spam filter.
Zopakujte (podle potřeby) výše uvedené i pro testy ke kroku 2.
Iterable, iterator, ''yield''
__next__
for
next
StopIteration
Vyzkoušejte a diskutujte se studenty: def myfunc(): print('Before first yield.') yield 'First yield.' print('After first, before second yield.') yield 'Second yield.' print('After second yield.') >>> gen = myfunc() >>> next(gen) Before first yield. 'First yield.' >>> next(gen) After first, before second yield. 'Second yield.' >>> next(gen) After second yield. builtins.StopIteration: >>> next(gen) Traceback (most recent call last): File "<string>", line 1, in <fragment> builtins.StopIteration: >>> Volání v cyklu: for neco in myfunc(): print('Got from the function:', neco) print('---') vyprodukuje Before first yield. Got from the function: First yield. --- After first, before second yield. Got from the function: Second yield. --- After second yield. >>> Výstupy z generátoru lze zamozřejmě posbírat do seznamu: >>> gen = myfunc() >>> gen <generator object myfunc at 0x01081378> >>> s = list(gen) Before first yield. After first, before second yield. After second yield. >>> s ['First yield.', 'Second yield.'] >>> Pomocí yield lze velmi elegantně vytvořit generátor Fibonacciho řady: def fibgen(): a, b = 0, 1 while 1: yield a a, b = b, a+b 2018/07/17 13:25
Vyzkoušejte a diskutujte se studenty:
def myfunc(): print('Before first yield.') yield 'First yield.' print('After first, before second yield.') yield 'Second yield.' print('After second yield.')
>>> gen = myfunc() >>> next(gen) Before first yield. 'First yield.' >>> next(gen) After first, before second yield. 'Second yield.' >>> next(gen) After second yield. builtins.StopIteration: >>> next(gen) Traceback (most recent call last): File "<string>", line 1, in <fragment> builtins.StopIteration: >>>
Volání v cyklu:
for neco in myfunc(): print('Got from the function:', neco) print('---')
vyprodukuje
Before first yield. Got from the function: First yield. --- After first, before second yield. Got from the function: Second yield. --- After second yield. >>>
Výstupy z generátoru lze zamozřejmě posbírat do seznamu:
>>> gen = myfunc() >>> gen <generator object myfunc at 0x01081378> >>> s = list(gen) Before first yield. After first, before second yield. After second yield. >>> s ['First yield.', 'Second yield.'] >>>
Pomocí yield lze velmi elegantně vytvořit generátor Fibonacciho řady:
def fibgen(): a, b = 0, 1 while 1: yield a a, b = b, a+b
Corpus
emails()
Vyplňte dotazník ohledně složení týmů pro Spam filtr, pokud jste to ještě neudělali.
Pokud se vám to nepodařilo už na cvičení, dokončete:
Příprava na krok 3 úlohy spam filtr:
Prostudujte si: V článku Binary Classification najděte a pochopte význam zkratek TP, FP, TN, FN. Na kus papíru napište: co podle vás tyto zkratky znamenají pro problém filtrování spamu co budeme potřebovat, abychom tyto statistiky mohli napočítat 2018/07/17 13:25
Prostudujte si:
Na kus papíru napište:
Příprava na krok 4 úlohy spam filtr:
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? 2018/07/17 13:25
Rozmyslete si a načrtněte na kus papíru: