Klasifikace textu do kategorií spam/ne-spam



Podobné dokumenty
Semestrální práce KIV/PC Řešení kolizí frekvencí sítě vysílačů Zdeněk Bečvář A14B0466P 10. ledna 2016

Pokud nebude na příkazové řádce uveden právě jeden argument, vypište chybové hlášení a stručný

Semestální práce z předmětu PC

Semestrální práce 2 znakový strom

Semestrální práce z KIV/PC. Kolja Matuševský (A14B0310P)

Datové struktury 2: Rozptylovací tabulky

Adresní vyhledávání (přímý přístup, zřetězené a otevřené rozptylování, rozptylovací funkce)

Algoritmy a struktury neuropočítačů ASN P9 SVM Support vector machines Support vector networks (Algoritmus podpůrných vektorů)

Zadání druhého zápočtového projektu Základy algoritmizace, 2005

Iterační výpočty. Dokumentace k projektu č. 2 do IZP. 24. listopadu 2004

Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

Algoritmy a datové struktury

Algoritmy I, složitost

Typy souborů ve STATISTICA. Tento článek poslouží jako přehled hlavních typů souborů v programu

bin arn ı vyhled av an ı a bst Karel Hor ak, Petr Ryˇsav y 23. bˇrezna 2016 Katedra poˇ c ıtaˇ c u, FEL, ˇ CVUT

Binární vyhledávací stromy pokročilé partie

AVL stromy. pro každý uzel u stromu platí, že rozdíl mezi výškou jeho levého a pravého podstromu je nejvýše 1 stromy jsou samovyvažující

Implementace numerických metod v jazyce C a Python

Stromy. Strom: souvislý graf bez kružnic využití: počítačová grafika seznam objektů efektivní vyhledávání výpočetní stromy rozhodovací stromy

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Úloha - rozpoznávání číslic

2 Datové struktury. Pole Seznam Zásobník Fronty FIFO Haldy a prioritní fronty Stromy Hash tabulky Slovníky

Datový typ prioritní fronta Semestrální práce z předmětu 36PT

Systém adresace paměti

Stromy, haldy, prioritní fronty

Profilová část maturitní zkoušky 2017/2018

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

Binární vyhledávací strom pomocí směrníků Miroslav Hostaša L06620

Zadání soutěžních úloh

Základy programování (IZP)

Základy programování. Úloha: Eratosthenovo síto. Autor: Josef Hrabal Číslo: HRA0031 Datum: Předmět: ZAP

Spojová implementace lineárních datových struktur

Profilová část maturitní zkoušky 2013/2014

Uživatelský manuál. Aplikace GraphViewer. Vytvořil: Viktor Dlouhý

Návrh designu: Radek Mařík

Trénování sítě pomocí učení s učitelem

KRY. Projekt č. 2. Kamil Dudka xdudka00

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Tento dokument popisuje instalaci a používání elektronické cvičebnice Styx.

Třetí skupina zadání projektů do předmětu Algoritmy II, letní semestr 2017/2018

Program pro tvorbu technických výpočtů. VIKLAN - Výpočty. Uživatelská příručka. pro seznámení se základními možnostmi programu. Ing.

Matematika v programovacích

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz

Základy programování (IZP)

Základy algoritmizace. Pattern matching

NOVINKY v PROGRAMU DOCHÁZKA ADS

Časová a prostorová složitost algoritmů

Data v počítači. Informační data. Logické hodnoty. Znakové hodnoty

Popis programu EnicomD

Zadání soutěžních úloh

Překladač a jeho struktura

Šifrování/Dešifrování s použitím hesla

1 Nejkratší cesta grafem

Testování prvočíselnosti

1. Převeďte dané číslo do dvojkové, osmičkové a šestnáctkové soustavy: a) b)

Geometrické algoritmy pro počítačovou grafiku

Zpracování deklarací a přidělování paměti

Ovládání Open Office.org Calc Ukládání dokumentu : Levým tlačítkem myši kliknete v menu na Soubor a pak na Uložit jako.

Katedra informatiky a výpočetní techniky. 10. prosince Ing. Tomáš Zahradnický doc. Ing. Róbert Lórencz, CSc.

Operační systémy. Cvičení 3: Programování v C pod Unixem

b) červená, zelená, modrá, c) černá, bílá, d) černá, bílá, šedá. 5. PNG je formát: a) textový,

Systém souborů (file system, FS)

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

FORTANNS. 22. února 2010

3. úloha - problém batohu metodami branch & bound, dynamické programování, heuristika s testem

Recognoil RRW Manager rychlý návod k obsluze

Algoritmizace a programování

Základní datové struktury III: Stromy, haldy

Semestrální úloha 1 z předmětu Programovací jazyk C. Textový merge. Student:

Komprese dat (Komprimace dat)

Základy programování (IZP)

1 Uživatelská dokumentace

ČÁST 1. Základy 32bitového programování ve Windows

Nápověda k aplikaci EA Script Engine

Formulář pro křížový filtr

SRSW4IT Inventarizační SW. Prezentace aplikace. Vedoucí DP: ing. Lukáš Macura Autor: Bc. Petr Mrůzek

Dílčí projekt: Systém projektování textilních struktur 1.etapa: tvorba systému projektování vlákno - příze - tkanina

SEMESTRÁLNÍ PROJEKT Y38PRO

Algoritmizace prostorových úloh

Rozdělování dat do trénovacích a testovacích množin

Rekurzivní algoritmy

Interpret jazyka IFJ2011

Automatické vyhledávání informace a znalosti v elektronických textových datech

Programování 3. hodina. RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015

DATABÁZE MS ACCESS 2010

Obsah přednášky Jaká asi bude chyba modelu na nových datech?

PA152. Implementace databázových systémů

Práce se soubory. Základy programování 2 Tomáš Kühr

Vyvažování a rotace v BVS, všude se předpokládá AVL strom

Zásadní dovednosti Indesign. Stručné otázky a odpovědi

Základy algoritmizace. Hašování

František Hudek. duben ročník

Nápověda pro vyplnění elektronického formuláře Oznámení o provedení asanace vytěženého jehličnatého dříví

APS mini.ed programová nadstavba pro základní vyhodnocení docházky. Příručka uživatele verze

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Datové struktury Úvod

Gymnázium Jiřího Ortena, Kutná Hora

Transkript:

Západočeská univerzita v Plzni Fakulta aplikovaných věd Klasifikace textu do kategorií spam/ne-spam KIV/PC 2. ledna 2015 Marek Zimmermann A12B0215P zimmma@students.zcu.cz

Obsah 1 Zadání 2 2 Analýza úlohy 3 2.1 Klasifikační algoritmy............................... 3 2.2 Datové struktury.................................. 4 3 Popis implementace 7 3.1 Dictionary...................................... 7 3.2 Item......................................... 7 3.3 Fungování programu................................ 8 4 Uživatelská příručka 10 4.1 Překlad programu................................. 10 4.2 Spuštění programu................................. 10 5 Závěr 12

1 Zadání Naprogramujte v ANSI C přenositelnou konzolovou aplikaci, která bude rozhodovat, zda úsek textu (textový soubor) je nebo není spam. Aplikace bude přijímat z příkazové řádky sedm parametrů: První dva parametry budou vzor jména a počet trénovacích souborů obsahujících nevyžádané zprávy (tzv. spam). Třetí a čtvrtý parametr budou vzor jména a počet trénovacích souborů obsahujících vyžádané zprávy (tzv. ham). Pátý a šestý parametr budou vzor jména a počet testovacích souborů. Sedmý parametr představuje jméno výstupního textového souboru, který bude po dokončení činnosti Vaší aplikace obsahovat výsledky klasifikace testovacích souborů. Program se bude spouštět příkazem: classify.exe spam spam-cnt ham ham-cnt test test-cnt out-file Symboly spam, ham a test představují vzory jména vstupních souborů. Symboly spam-cnt, ham-cnt a test-cnt představují počty vstupních souborů. Vstupní soubory mají následující pojmenování: vzorn, kde N je celé číslo z intervalu 1; N. Přípona všech vstupních souborů je.txt, přípona není součástí vzoru. Váš program tedy může být během testování spuštěn například takto:...\>classify.exe spam 10 ham 20 test 50 result.txt Výsledkem činnosti programu bude textový soubor, který bude obsahovat seznam testovaných souborů a jejich klasifikaci. Pokud nebude na příkazové řádce uvedeno právě sedm argumentů, vypište chybové hlášení a stručný návod k použití programu v angličtině podle běžných zvyklostí (viz např. ukázková semestrální práce na webu předmětu Programování v jazyce C). Vstupem programu jsou pouze argumenty na příkazové řádce interakce s uživatelem pomocí klávesnice či myši v průběhu práce programu se neočekává. Hotovou práci odevzdejte v jediném archivu typu ZIP prostřednictvím automatického odevzdávacího a validačního systému. Archiv necht obsahuje všechny zdrojové soubory potřebné k přeložení programu, makefile pro Windows i Linux (pro překlad v Linuxu připravte soubor pojmenovaný makefile a pro Windows makefile.win) a dokumentaci ve formátu PDF vytvořenou v typografickém systému TEX, resp. L A TEX. Bude-li některá z částí chybět, kontrolní skript Vaši práci odmítne 1. 1 Úplné znění zadání dostupné na webové adrese předmětu KIV/PC: http://www.kiv.zcu.cz/studies/predmety/pc/doc/work/sw2014-03.pdf 2

2 Analýza úlohy Cílem programu je klasifikovat danou množinu e mailů. Klasifikovat budeme do 2 kategorií: ham (vyžádaná pošta) nebo spam (nevyžádaná pošta). Požadovaná přesnost klasifikace je alespoň 90% 2. Při analýze úlohy pak bude důležitá volba klasifikačního algoritmu a struktury, kterou budeme využívat pro trénování a posléze klasifikaci. 2.1 Klasifikační algoritmy Pro klasifikaci e mailů lze využít několika klasifikátorů: Support Vector Machine, naivní Bayesův klasifikátor, klasifikátor Maximální entropie a další. Support Vector Machines (SVM) je metoda strojového učení, která v úloze klasifikace hledá nadrovinu, která v prostoru příznaků rozděluje data od sebe tak, aby minimální vzdálenost bodů z n množin byla maximální (viz obrázek 1). Toto platí v případě, kdy jsou od sebe množiny lineárně separovatelné. Pokud tomu tak není, využívá se tzv. jádrová funkce (kernel function, nebo také kernel transformation), která převede lineárně neseparovatelnou úlohu na lineárně separovatelnou pomocí projekcí do vyšší dimenze, než jsou vstupní data [1]). Obrázek 1: Binární SVM klasifikátor, Zdroj: http://docs.opencv.org/doc/tutorials/ ml/introduction_to_svm/introduction_to_svm.html Naivní Bayesův klasifikátor (NBC) je pravděpodobnostní klasifikátor, založený na aplikaci tzv. Bayesovy věty a předpokladu nezávislosti mezi danými příznaky (což v realitě většinou neplatí proto naivní ). Mezi jeho klady patří schopnost inkrementálního učení (je možné ho po testování dotrénovat pomocí nových dat) a také je vhodný pro klasifikaci velkého souboru dat díky předpokladu nezávislosti mezi danými příznaky tato vlastnost totiž zjednodušuje vzorec potřebný pro výpočet pravděpodobnosti. Jeho klasifikační úspěšnost je výrazně závislá na kvalitě trénovací množiny. Grafická ukázka klasifikace bodu podle jeho polohy je zachycena v obrázku 2. Z těchto dvou algoritmů, které patří mezi nejpoužívanější v oblasti klasifikace e mailů, jsem se rozhodl zvolit NBC, nebot s ním lze dosáhnout požadované úspěšnosti, byl doporučen v zadání práce a přišel mi jednodušší na implementaci. 2 Tedy například ze 100 klasifikovaných dokumentů jich musí být správně klasifikováno nejméně 90. 3

Obrázek 2: NBC klasifikace bílého bodu na základě polohy, Zdroj: http://www.statsoft.com/textbook/naive-bayes-classifier 2.2 Datové struktury Pro daný klasifikátor je pak třeba navrhnout vhodnou datovou strukturu, která bude uchovávat výsledky trénování a posléze bude využita pro klasifikaci testovacích e mailů. První strukturou, která by mohla být použita, je binární vyhledávací strom (BST Binary search tree). Ten se skládá z binárního stromu, tj. orientovaného grafu s jedním bodem jakožto počátkem (tzv. kořen), z něhož lze najít cestu do jakéhokoliv vrcholu, přičemž každý vrchol má maximálně dva potomky a právě jednoho předka (pouze kořen žádného nemá). Binární vyhledávací strom se od binárního stromu liší tak, že klíče, přiřazené každému uzlu, jsou uspořádány tak, že hodnota levého podstromu uzlu je menší než hodnota uzlu a hodnota pravého podstromu je naopak vyšší než hodnota uzlu (viz obrázek 3). Obrázek 3: Ukázka jednoduchého BST, Zdroj: http: //cs.wikipedia.org/wiki/bin%c3%a1rn%c3%ad_vyhled%c3%a1vac%c3%ad_strom Druhou strukturou vhodnou k použití je hashovací tabulka (hash table). Její princip spočívá v tom, že pro data, která chceme uložit, získáme klíč pomocí tzv. hashovací funkce a data pak podle klíče uložíme. Klíč poté rovněž slouží k nalezení dat v dané tabulce. Jako struktura pro uložení tabulky se nejčastěji používá pole. Při vkládání dat může díky přiřazení stejného klíče různým datům nastat kolize, kterou lze řešit několika způsoby. Nejjednodušším řešením je tzv. zřetězení záznamů (separate chaining), kdy každá položka tabulky je seznamem prvků se stejným klíčem. Dalším způsobem pak může být otevřená adresace (nebo také otevřené rozptylování, anglicky open addressing), kde data, která by měla být umístěna na již obsazené místo, jsou umístěna na jiné volné místo, které určí zvolený algoritmus. Rozdíl je zobrazen na obrázku 4. Další strukturou, která by mohla být vhodná pro uchovávání dat, je trie. Strukturou je velmi podobná BVS, avšak vrchol zde nemusí mít nejvýše dva potomky (může jich mít tolik, kolik potřebujeme) a jako klíč se zde hojně využívají řetězce (popř. znaky z jednotlivých 4

Obrázek 4: Zřetězení záznamů (vlevo) a otevřená adresace (vpravo) u hashovací tabulky, Zdroj: http://en.wikipedia.org/wiki/hash_table řetězců). Všichni následníci uzlu mají společný prefix, který je shodný s řetězcem přiřazeným k danému uzlu. Kořen je asociovaný s prázdným řetězcem. Každý uzel si s sebou nese informaci, zda je nebo není koncovým písmenem nějakého slova. Trie bývá velmi často používána pro uložení slovníků, kde vyniká kromě rychlosti i v příznivých nárocích na pamět, a to tím více, čím více je ve slovníku slov se stejným prefixem. Na obrázku 5 můžeme vidět uložení daných slov ze slovníku tak, že pro slova s celkovým součtem osmnácti znaků stačí v trie pouze jedenáct uzlů. Obrázek 5: Trie pro slova A, to, tea, ted, ten, i, in a inn, Zdroj: http://en.wikipedia.org/wiki/trie U námi zvolené struktury klademe důraz zejména na operace vložení a hledání prvku, nebot při trénování budeme do struktury pouze vkládat, nebo ji hledat (abychom jí upravili) a při klasifikaci již pouze hledat (pro čtení uložených informací). V tabulce 1 lze vidět, že dobré výsledky v těchto operacích by měla podávat zejména hashtable[2] a trie. V nejhorším případě má u operací vkládání a hledání BVS a hashtable složitost O(n), kde n je počet prvků ve stromu či tabulce a trie O(m), kde m je počet uzlů vedoucí k prvku (tedy počet písmen ve slově). Zde by tedy měla být vítězem trie[3]. Ze dvou vhodných kandidátů jsem se nakonec rozhodl zvolit hashovací tabulku se zřetě- 5

Operace BVS Hashtable Trie Hledání O(log n) O(1) O(m) Vkládání O(log n) O(n) O(m) Tabulka 1: Průměrná asymptotická složitost operací u BVS, hashtable a trie zením záznamů jakožto dobrý kompromis mezi pamět ovou a výpočetní náročností a jednoduchostí implementace. 6

3 Popis implementace 3.1 Dictionary Struktura Dictionary (viz zdrojový kód 1) v sobě uchovává slova ve formě hashtabulky (pole ukazatelů na strukturu Item o velikosti DICT ARRAY SIZE 3 ), počet zpracovaných slov ze spamových (spam words) a hamových (ham words) souborů včetně duplicit, počet unikátních zpracovaných slov z obou kategorií (unique words) a počet zpracovaných spamových a hamových souborů (spam files a ham files). Zdrojový kód 1: Struktura Dictionary typedef struct { Item words [ DICT ARRAY SIZE ] ; int spam words ; int ham words ; int unique words ; int s p a m f i l e s ; int h a m f i l e s ; } Dictionary ; 3.2 Item Struktura Item (viz zdrojový kód 2) uchovává dané slovo (word), informace o počtu výskytů daného slova ve spamu (spam occur) a v hamu (ham occur), hodnoty pravděpodobnosti výskytu slova v dané kategorii (spam prob a ham prob), a protože je tato struktura koncipována zároveň jako položka spojového seznamu, uchovává i ukazatel na další prvek (next). typedef struct ITEM { char word ; Zdrojový kód 2: Struktura Item int spam occur ; int ham occur ; double spam prob ; double ham prob ; } Item ; struct ITEM next ; 3 Konkrétní velikost pole popsána v sekci 5 7

3.3 Fungování programu Program nejprve zkontroluje vstupní parametry programu jejich správný počet (musí jich být přesně sedm) a zda je druhý, čtvrtý a šestý parametr celé číslo. V případě, že některá z kontrol selže, program vypíše chybu, nápovědu a ukončí se. Pokud kontrola proběhla v pořádku, program se pokusí alokovat místo pro slovník (strukturu Dictionary). V případě neúspěšného pokusu se zobrazí výpis chyby a program se ukončí. Pokud do této chvíle proběhlo vše v pořádku, začíná trénování. E maily jsou předzpracovány do souborů s příponou.txt tak, že jeden soubor je roven jednomu e mailu. Soubor se pak skládá ze slov oddělených mezerou. Všechna slova jsou na jedné řádce, konec řádky je tedy i koncem souboru 4. Program postupně otevře každý soubor, načte jeho obsah do bufferu a postupně z něj zpracuje každé slovo. Právě zpracovávané slovo zkusí najít ve slovníku. V případě jeho nalezení zvýší o jedna potřebné čítače. Pokud slovo nenajde, pokusí se ho vytvořit a uložit do slovníku. Pokud dojde k chybě u zpracování souboru, program vypíše chybu a její stručný popis a ukončí se. Tento postup byl zvolen, protože pokud by došlo k chybnému natrénování díky chybějícím datům, mohlo by nastat výrazné ovlivnění klasifikace testovacích souborů. Jako hashovací funkce bylo zvoleno sečtení ASCII hodnot písmen daného slova modulo velikostí slovníku. Protože program pracuje ve stylu načti, natrénuj, klasifikuj, ukonči se a nevyužívá tedy jednu z vlastností NBC (viz sekce 2) schopnost inkrementálního učení můžeme ještě před samotnou klasifikací provést malou optimalizaci. Aby program nemusel pro každé slovo opakovaně počítat hodnotu pravděpodobnosti v dané kategorii, můžeme si tyto hodnoty předem vypočítat a uložit do samotné struktury daného slova 5 (viz spam prob a ham prob v podsekci 3.2). V tuto chvíli může začít klasifikace testovacích souborů. Každý testovací soubor je otevřen, jeho obsah je načten a zpracován. Standardně by se pro výpočet pravděpodobnosti, že daný soubor patří do dané kategorie, použil vzorec 1, kde P C je pravděpodobnost výskytu dané kategorie (zpracované soubory podělené všemi soubory) a P (word i C) je pravděpodobnost výskytu slova v dané kategorii. n P S = P C P (word i C) (1) i=0 Protože by zde však došlo k tzv. podtečení (ztráta přesnosti, zde díky násobení velmi malých hodnot mezi sebou), pravděpodobnosti zlogaritmujeme a sečteme (viz vzorec 2), čímž docílíme správného výsledku, nebot malé hodnoty se zde sčítají a k podtečení tak nedojde. n P s = log (P C ) + log (P (word i C)) (2) i=0 Pravděpodobnost výskytu slova v dané kategorii se spočte dle vzorce 3, kde n i je počet výskytů slova v dané kategorii zvýšený o jedna (aby v logaritmu nebyla nula), D C je celkový počet slov zpracovaný slovníkem v dané kategorii a D U je celkový počet unikátních slov zpracovaný slovníkem. P (word i C) = n i + 1 D C + D U (3) 4 Přesněji: soubory neobsahují žádný znak pro ukončení řádky, obsahují pouze znak konce souboru. 5 Výsledky provedené optimalizace viz sekce 5 8

Po výpočtu pravděpodobnosti souboru v obou kategoriích se dle vyšší hodnoty jedné z nich rozhodne, zda jde o spam nebo ham. Výsledky se pak zapisují do souboru, jehož název byl zadán jako sedmý parametr při spuštění. Na každý řádek souboru je zapsán jeden výsledek ve formátu: název souboru, tabulátor, H (signalizující ham) nebo S (signalizující spam) a konec řádky. Pokud se některá z částí programu nevykoná správně a program je nucen ukončit svou činnost, kromě stručného výpisu chyby získáme i návratový kód chyby. Kódy jsou rozděleny následovně: 0 program proběhl správně (bez chyb), 1 špatně zadané nebo žádné vstupní parametry, 2 problém s alokací paměti při vytváření struktury Dictionary, 3 I/O chyba (nezdařilo se otevření souboru, zápis do souboru, soubor neexistuje...), 4 jiné problémy s alokací paměti (např. struktury Item pro nové slovo) 9

4 Uživatelská příručka 4.1 Překlad programu Program musí být před použitím přeložen. Pro zjednodušení jsou připraveny dva makefile soubory (makefile pro Linux a makefile.win pro Windows). Oba dva vyžadují mít na daném systému zprovozněný make a gcc překladač. V Linuxu se tohoto stavu dá docílit prostým nainstalováním balíčků make a gcc 6. Ve Windows bude potřeba nainstalovat MinGW 7 nebo CygWin a (pokud to bude nutné) přidat umístění daného programu do systémové proměnné PATH. Na Linuxu můžeme program přeložit v daném adresáři příkazem: make Pokud překlad probíhá na Windows, přeložíme program pomocí: make f m a k e f i l e. win 4.2 Spuštění programu Po překladu se ve stejném adresáři objeví soubor classify.exe. Program se pouští přes konzoli v následujícím formátu: classify.exe spam spam-cnt ham ham-cnt test test-cnt out-file Prvním parametrem je vzorové jméno trénovacích spamových souborů (např pro vzor spam může být jeden ze souborů spam3.txt ). Druhým parametrem je pak počet těchto souborů. Třetím parametrem je vzorové jméno trénovacích hamových souborů, čtvrtým pak jejich počet. Pátým je vzorové jméno souborů, které mají být klasifikovány, šestým parametrem je pak jejich počet. Posledním (sedmým) parametrem je pak název souboru, do kterého se budou zapisovat výsledky klasifikace jednotlivých testovaných souborů. Na obrázku 6 lze vidět chování při spuštění s korektními parametry. Obrázek 6: Ukázka výstupu správného běhu programu Pokud jsou vstupní parametry špatné nebo při běhu nastane chyba, program stručně vypíše kde nastala chyba a ukončí svůj běh. Pokud jsou zadány chybné parametry, program 6 Překlad otestován na gcc ve verzi 4.9.1 na operačním systému Debian GNU/Linux 8.0 (64 bit). 7 Překlad otestován za pomocí MinGW verze 4.8.1 na operačním systému Windows 7 Professional 64 bit. 10

kromě výpisu problému s parametry zobrazí i nápovědu. Pro ukázku běhu programu při chybějícím trénovacím souboru viz obrázek 7. Obrázek 7: Ukázka výstupu programu, pokud chybí testovací soubor 11

5 Závěr Program splnil zadání, jeho úspěšnost klasifikace byla 98 % (z dodaných 200 testovaných souborů 3 ham soubory klasifikoval jako spamy a 1 spam jako ham). Časy běhu programu na Linuxu (tabulka 2) ukazují přibližně 4 až 5 % zrychlení programu vlivem optimalizace (viz sekce 3.3) a mírné urychlování běhu při zvyšování velikosti hashovací tabulky, kromě poslední hodnoty 5000, která se téměř rovnala výsledkům u velikosti 1500. Pokud se podíváme na časy běhu programu ve Windows (tabulka 3), ukazují víceméně podobný trend, pouze hodnoty u velikosti 1500 jsou neočekávaně vysoké. Pravděpodobně se na jejich výsledcích projevily služby běžící na pozadí (a to i přes to, že každá výsledná hodnota představuje průměr z 10 měření). Bohužel, hodnoty pro porovnání běhu se stejným nastavením v Linuxu a ve Windows nejsou porovnatelné, nebot při měření běhu na Windows byl omylem zapnutý debug režim (zajišt ující detailnější výpisy běhu programu), což pravděpodobně ovlivnilo výsledný čas. Časy jsou tak vzájemně porovnatelné pouze v rámci stejného systému. Dle mého názoru však nebylo ovlivnění natolik velké, aby se nedalo konstatovat, že program běžel rychleji na Linuxu. Čas běhu programu v závislosti na optimalizaci a velikosti hash tabulky Velikost hashovací tabulky 500 1000 1500 5000 Bez optimalizace 0,138 s 0,126 s 0,122 s 0,123 s S optimalizací 0,131 s 0,122 s 0,116 s 0,117 s Tabulka 2: Měření času běhu programu Linux Čas běhu programu v závislosti na optimalizaci a velikosti hash tabulky Velikost hashovací tabulky 500 1000 1500 5000 Bez optimalizace 0,280 s 0,268 s 0,274 s 0,271 s S optimalizací 0,275 s 0,271 s 0,270 s 0,270 s Tabulka 3: Měření času běhu programu Windows Program by samozřejmě mohl být ještě vylepšen. Ke kontrole parametrů by šlo přidat i kontrolu existence samotných souborů potřebných pro běh programu (tak, aby program nebyl přerušen kvůli tomuto problému uprostřed učení či klasifikace). Urychlení by mohlo přinést implementování datové struktury jakožto trie za cenu zvýšené pamět ové náročnosti, což dnes není žádný problém, nebot paměti bývá obecně více než procesorového výkonu. Pokud zůstaneme u hashovací tabulky, bylo by vhodné vymyslet algoritmus, který by její velikost vypočítal v závislosti na vstupních datech a pak ji dynamicky vytvářel. Nyní je vytvářena staticky s velikostí, která byla optimalizována pro testovací data, ale nemusí být stejně efektivní pro jiný (jinak velký) soubor dat. Zrychlení programu by také mohla přinést lepší hashovací funkce, která by rovnoměrněji zaplňovala tabulku (méně prázdných řádků a méně nebo žádné kolize na některých řádcích). Program úspěšně prošel testováním pomocí Valgrindu (nebyly detekovány žádné úniky paměti) a kontrolou pomocí Splint, který nakonec nahlásil pouze jedno varování ohledně používání funkce sprintf a radil nahrazení bezpečnější funkcí snprintf. Tuto chybu bohužel nebylo možné opravit, nebot snprintf není součástí standardu ANSI C. Program byl však konstruován tak, že by k přetečení u funkce sprintf nikdy nemělo dojít. 12

Reference [1] Autor: Michal Hrala, Název publikace: Automatická klasifikace dokumentů s podobným obsahem. Vydavatel: Západočeská univerzita v Plzni, Rok: 2012, URI: http://hdl.handle.net/11025/3054 [2] URL: http://bigocheatsheet.com/ Rok: 2014, Poznámka: poslední přístup 21.12.2014 [3] URL: http://en.wikipedia.org/wiki/trie Rok: 2014, Poznámka: poslední přístup 21.12.2014 13