Text Mining Úvod do nestrukturovaných dat Jakub Buček Osnova 1. Motivace 2. Strukturovaná vs nestrukturovaná data 3. Regulární výrazy 4. Sbírání dat 1 Získávání a čištění dat. “80 percent of time spent is preparing data, 20 percent complaining about the need to prepare data.” 2 Motivace Láska z dat Figure 1: Chris McKinlay Převzato z https://www.wired.com/2014/01/how-to-hack-okcupid/ 3 Láska z dat OKCupid • online seznamka založena roku 2004 matematiky s titulem z Harvardu • uživatelé odpovídají až na 350 otázek z různých tématických bloků (např. politika, náboženství, rodina, láska, sex atd.) a zároveň dané otázce přiřazují důležitost • jejich odpovědi jsou speciálním algoritmem porovnány s odpovědmi ostatních uživatelů a je vypočítána jejich shoda (0-100% shoda) • uživatelé vidí odpovědi ostatních uživatelů u otázek, na které taky odpověděli 4 Láska z dat Chrisův postup • automatický sběr dat pomocí robotů (Python); napodobil chování běžného uživatele, aby předešel odhalení → sesbíral data od asi 20 tisíc žen • rozdělení žen do 7 skupin podle jejich podobnosti → rozhodnul se pro 2 skupiny žen (ženy kolem 25 let, umělecky zaměřené, “indie” typ; starší ženy s úspěšnou kariérou v kreativních oborech) • pomocí Text miningu zjistil, jaké zájmy spojuje ženy v těchto skupinách → vytvořil si dva profily, jeden pro první skupinu a druhý pro druhou skupinu → vybral nejpopulárnější odpovědi v těchto skupinách (na které popravdě odpověděl) 5 Láska z dat Figure 2: Rozdělení žen do skupin 6 Láska z dat Chrisův postup • ohromný úspěch → Chris si musel napsat robota, který automaticky navštěvoval profily všech žen s velkou shodou • Chris začal plánovat rande → až na rande číslo 88 našel dívku, se kterou začal chodit a zasnoubil se s ní 7 Strukturovaná vs nestrukturovaná data Strukturovaná data Strukturovaná data jsou data, která jsou uložena v přesně definovaných a popsaných datových polích. Strukturovaná data mají jasný model a popis, a proto je lze dobře ukládat, zpracovávat a analyzovat. 8 Strukturovaná data Příklad data ( ” mtcars ” ) mtcars [ 1 : 5 , 1 : 6 ] ## mpg cyl disp hp drat wt ## Mazda RX4 21.0 6 160 110 3.90 2.620 ## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 ## Datsun 710 22.8 4 108 93 3.85 2.320 ## Hornet 4 Drive 2 1 . 4 6 258 110 3.08 3 . 2 1 5 ## Hornet Sportabout 1 8 . 7 8 360 175 3 . 1 5 3.440 9 Nestrukturovaná data Nestrukturovaná data naopak přesně definovanou strukturu nemají. Do této kategorie patří všechna data, která nemají stálou pevně definovanou strukturu, například obrázky, videa, webové stránky nebo obsah e-mailové a či jiné komunikace. Nestrukturovaná data tvoří absolutní většinu generovaných dat. 10 Nestrukturovaná data Figure 3: Příklad nestrukturovaných dat 11 Regulární výrazy Regulární výrazy Regulární výraz je řetězec znaků popisující celou množinu řetězců. Umožňují jednoduše vyhledávat a nahrazovat text. Například: ".*a.b.*" zastupuje všechny řetězce, které obsahují sekvenci a, libovolný symbol a b jako je například řetězec bambus. 12 Escapování Zápis speciálních znaků. • \' - apostrof • \" - uvozovky • \n - nový řádek • \t - tabulátor 13 Escapování Příklad ” Knock knock . \ n Who’ s there ?\n Cow says . \ n Cow says who?\n No , a cow says mooooo ! ” print vs cat print ( ”a\nb” ) ## [ 1 ] ”a\nb” cat ( ”a\nb” ) ## a ## b 14 Kvantifikátory Specifikují, kolikrát se bude daný řetězec opakovat. * - aspoň 0 shod Příklad s <− c ( ” a ” , ”ab ” , ” acb ” , ” accb ” , ” acccb ” , ” accccb ” ) grep ( ” ac*b ” , s , value = TRUE ) ## [ 1 ] ”ab” ” acb ” ” accb ” ” acccb ” ” accccb ” 15 Kvantifikátory Specifikují, kolikrát se bude daný řetězec opakovat. + - aspoň 1 shoda Příklad s <− c ( ” a ” , ”ab ” , ” acb ” , ” accb ” , ” acccb ” , ” accccb ” ) grep ( ” ac+b ” , s , value = TRUE ) ## [ 1 ] ” acb ” ” accb ” ” acccb ” ” accccb ” 16 Kvantifikátory Specifikují, kolikrát se bude daný řetězec opakovat. ? - maximálně 1 shoda Příklad s <− c ( ” a ” , ”ab ” , ” acb ” , ” accb ” , ” acccb ” , ” accccb ” ) grep ( ” ac?b ” , s , value = TRUE ) ## [ 1 ] ”ab” ” acb ” 17 Kvantifikátory Specifikují, kolikrát se bude daný řetězec opakovat. {n} - přesně n shod Příklad s <− c ( ” a ” , ”ab ” , ” acb ” , ” accb ” , ” acccb ” , ” accccb ” ) grep ( ” ac { 2 } b ” , s , value = TRUE ) ## [ 1 ] ” accb ” 18 Kvantifikátory Specifikují, kolikrát se bude daný řetězec opakovat. {n,} - aspoň n shod Příklad s <− c ( ” a ” , ”ab ” , ” acb ” , ” accb ” , ” acccb ” , ” accccb ” ) grep ( ” ac { 2 , } b ” , s , value = TRUE ) ## [ 1 ] ” accb ” ” acccb ” ” accccb ” 19 Kvantifikátory Specifikují, kolikrát se bude daný řetězec opakovat. {n,m} - mezi n a m shodami Příklad s <− c ( ” a ” , ”ab ” , ” acb ” , ” accb ” , ” acccb ” , ” accccb ” ) grep ( ” ac { 2 , 3 } b ” , strings , value = TRUE ) ## [ 1 ] ” accb ” ” acccb ” 20 Pozice Specifikace pozice vzoru v rámci řetězce. ^ - označuje začátek řetězce Příklad s <− c ( ” abcd ” , ” cdab ” , ” cabd ” , ” c abd ” ) grep ( ” ab ” , s , value = TRUE ) ## [ 1 ] ” abcd ” ” cdab ” ” cabd ” ” c abd” grep (”^ ab ” , s , value = TRUE ) ## [ 1 ] ” abcd ” 21 Pozice Specifikace pozice vzoru v rámci řetězce. $ - označuje konec řetězce Příklad s <− c ( ” abcd ” , ” cdab ” , ” cabd ” , ” c abd ” ) grep ( ” ab$ ” , s , value = TRUE ) ## [ 1 ] ” cdab ” 22 Pozice Specifikace pozice vzoru v rámci řetězce. \b - označuje začátek nebo konec slova (mezeru) Příklad s <− c ( ” abcd ” , ” cdab ” , ” cabd ” , ” c abd ” ) grep (”\\ bab ” , s , value = TRUE ) ## [ 1 ] ” abcd ” ” c abd” 23 Operátory Specifikace pozice vzoru v rámci řetězce. . - nahrazuje jeden libovolný znak Příklad s <− c (”^ ab ” , ”ab ” , ” abc ” , ”abd ” , ” abe ” , ”ab 1 2 ” ) grep ( ” ab . ” , s , value = TRUE ) ## [ 1 ] ” abc ” ”abd” ” abe ” ”ab 12” 24 Operátory Specifikace pozice vzoru v rámci řetězce. [...] - nahrazuje libovolný symbol z dané množiny (lze použít pro výčet) Příklad s <− c (”^ ab ” , ”ab ” , ” abc ” , ”abd ” , ” abe ” , ”ab 1 2 ” ) grep ( ” ab [ c−e ] ” , s , value = TRUE ) ## [ 1 ] ” abc ” ”abd” ” abe ” 25 Operátory Specifikace pozice vzoru v rámci řetězce. [^...] - nahrazuje všechny symboly až na symboly z dané množiny (opak [...]) Příklad s <− c (”^ ab ” , ”ab ” , ” abc ” , ”abd ” , ” abe ” , ”ab 1 2 ” ) grep ( ” ab[^ c ] ” , s , value = TRUE ) ## [ 1 ] ”abd” ” abe ” ”ab 12” 26 Operátory Specifikace pozice vzoru v rámci řetězce. [^...] - nahrazuje všechny symboly až na symboly z dané množiny (opak [...]) Příklad s <− c (”^ ab ” , ”ab ” , ” abc ” , ”abd ” , ” abe ” , ”ab 1 2 ” ) grep ( ” ab[^ c ] ” , s , value = TRUE ) ## [ 1 ] ”abd” ” abe ” ”ab 12” 27 Operátory Specifikace pozice vzoru v rámci řetězce. \ - slouží k escapování metacharakterů (např. ., *, {} apod.) Příklad s <− c (”^ ab ” , ”ab ” , ” abc ” , ”abd ” , ” abe ” , ”ab 1 2 ” ) grep (”^ ab ” , s , value = TRUE ) ## [ 1 ] ”ab” ” abc ” ”abd” ” abe ” ”ab 12” grep (”\\^ ab ” , s , value = TRUE ) ## [ 1 ] ”^ab” 28 Operátory Specifikace pozice vzoru v rámci řetězce. | - operátor ”or” (nebo) Příklad s <− c (”^ ab ” , ”ab ” , ” abc ” , ”abd ” , ” abe ” , ”ab 1 2 ” ) grep ( ” abc|abd ” , s , value = TRUE ) ## [ 1 ] ” abc ” ”abd” 29 Operátory Specifikace pozice vzoru v rámci řetězce. (...) - seskupení regulárních výrazů, na jednotlivé skupiny se lze odkazovat pomocí \\N, kde N je pořadí konkrétní (...) Příklad s <− c (”^ ab ” , ”ab ” , ” abc ” , ”abd ” , ” abe ” , ”ab 1 2 ” ) gsub ( ” ( ab ) 1 2 ” , ”\\1 34” , st rings ) ## [ 1 ] ”^ab” ”ab” ” abc ” ”abd” ” abe ” ## [ 2 ] ”ab 34” 30 Třídy • [:digits:] nebo \d: - nahrazuje libovolnou číslici (ekvivalent [0-9]) • \D: - nahrazuje libovolnou znak mimo číslici (ekvivalent [^0-9]) • [:lower:] - nahrazuje libovolné malé písmeno (ekvivalent [a-z]) • [:upper:] - nahrazuje libovolné velké písmeno (ekvivalent [A-Z]) • [:alpha:] - nahrazuje libovolné písmeno (ekvivalent [A-z] nebo [[:lower:][:upper:]]) • [:alnum:] - nahrazuje libovolné písmeno nebo číslo (ekvivalent [A-z0-9] nebo [[:alpha:][:digits:]]) • \s - mezera 31 Podmínka Pokud je ? uvnitř (...), má jinou úlohu, než na co jsme zvyklý. V tomto případě se jedná o podmínku. Příklad s <− ” I l i k e chocolate and chocolate ice cream . ” gsub ( ” chocolate ” , ” v a n i l l a ” , s ) ## [ 1 ] ” I l i k e v a n i l l a and v a n i l l a ice cream . ” s t r i n g r : : str_replace_all ( s , ” chocolate (?=\\ sice ) ” , ” v a n i l l a ” ) ## [ 1 ] ” I l i k e chocolate and v a n i l l a ice cream . ” https://regex101.com 32 Sbírání dat Sbírání dat Na cvičení se podíváme, jak převést data do eRka z: • z PDF • z webové stránky (Wikipedie) 33