% ============================================================================ %
% Encoding: UTF-8 (žluťoučký kůň úpěl ďábelšké ódy)
% ============================================================================ %

% ============================================================================ %
\nn{Úvod}
Člověk se učí porozumění textu již od prvních školních dní, kdy se nejprve učí skládat souhlásky a samohlásky, následně celé slova, poté věty a souvětí. Po získání základu tvorby vět a souvětí se dále rozvíjí slovotvorba, větný rozbor a mnoho dalšího. Tady tyto všechny části jazyka se člověk učí a zdokonaluje se v~nich po celou dobu základní školní docházky.

Počítač sám o~sobě takovou schopnost porozumění textu nemá, rozumí pouze binárním hodnotám. I~přes toto omezení lze naučit počítač chápat text, k~tomu můžeme využít například strojového učení, které nám umožní na základě vzorů chápat význam slov a jejich kontext.

Tato diplomová práce se zabývá vytvořením nástroje, který umožní co nejlépe porozumět vyhledávacím dotazům, které nějakým způsobem obsahují čas. Pod takovým dotazem si můžeme představit například vyhledávání jízdních řádů v~časovém rozmezí, předpovědi počasí na další dny, aktuální epidemiologickou situace a podobně. Nemusí se přitom jednat pouze o~dotazy, kde je přímo specifikovaný čas a datum -- tedy jednoznačný časový údaj, ale také o~dotazy, které obsahují relativní časový údaj -- například "lidl slevy od pondělí", "Brno počasí dnes". V~takovém případě se pracuje s~časem relativně. Jako časový kontext se bere čas, kdy byl dotaz vyhledán a od toho se odvíjí kontextové zařazení časového údaje. 

V~případě, že nástroj detekuje v~dotazu časové údaje, vytváří metadata\footnote{Data poskytující informace o~jiných datech.}, která co nejpřesněji popisují nalezené časové entity. Výstup z~nástroje lze pak dále využívat v~dalších nástrojích, které ke své funkcionalitě mohou využívat časový kontext dotazu. V~případě, že se jedná o~dotaz na počasí -- například "počasí na tento týden", tak nástroj zabývající se poskytováním informací o~počasí může využít časových informací a tím pak dodat mnohem přesnější předpověď, když bude mít informace, v~jakém časovém horizontu má předpověď počasí provést.

Další možné využití je ve fulltextovém vyhledávání. Nástroj převede časový údaj z~dotazu do standardizované formy, která je nezávislá na tom, jaká formulace časového údaje přesně byla v~dotazu. Podobná detekce může proběhnout také na webové stránce. Díky tomu uživatel na dotaz "nehoda jihlava včera"{} může najít i webovou stránku, kde místo "včera"{} bude uvedeno konkrétní včerejší datum.


V~práci je popsán návrh a popis realizace nástroje pro detekci časových údajů v~textu -- konkrétně ve vyhledávacím dotazu. 
Nástroj by měl být schopen detekovat časový údaj, a co nejjednoznačněji takový časový údaj popsat v~metadatech, aby s~takovými informacemi mohly pracovat další nástroje (např. v~rámci internetového vyhledávače). 
Možných přístupů k~řešení tohoto problému je vícero. V~této práci bude popsáno řešení, kdy  za pomocí neuronové sítě bude vyhodnocen kontext dotazu, regulární výrazy budou použity pro detekci časových údajů a pravidlové vyhodnocení bude určovat o~jaký časový údaj se jedná.

V~\it{teoretické části} jsou popsány pojmy z~oblasti strojového učení, neuronová síť Electra a regulární výrazy. Tyto pojmy budou dále rozvíjeny v~praktické části práce.

V~\it{praktické části} je nejprve definována časová entita a její typy. Dále je popsán způsob, jak byly vybrány dotazy, které potenciálně obsahovaly časovou entitu za účelem vytvoření datasetu pro učení neuronové sítě. Následně jsou popsány hlavní komponenty nástroje -- zpracování textu pomocí regulárních výrazů a klasifikace textu pomocí neuronové sítě Electra. Poté jsou vyhodnoceny dosažené výsledky a je nastíněn další možný vývoj nástroje.


% ============================================================================ %
\cast{Teoretická část}

\section{Strojové učení}
Strojové učení je podoblastí umělé inteligence, která se zabývá postupy umožňující počítačovému systému se samostatně rozhodovat podle jeho předchozích znalostí a~automaticky se zlepšovat na základě zkušeností. Smyslem strojového učení je tedy vytvořit takový program, který zvládne vyřešit problém, na který nebyl explicitně naprogramován. 
Strojové učení hraje důležitou roli v~našich každodenních životech, v~roce 2021 pracovalo 31 \% firem s~umělou inteligencí v~produkčním prostředí \cite{web:ai_01}. 

Díky strojovému učení můžeme využívat kvalitní internetové vyhledávače, rozpoznávání textu, rozpoznání hlasu, spamové filtry v~e--mailech a mnohé další nástroje. Existují různé typy strojového učení, každý typ má své charakteristické úlohy, na které je právě vhodný. Mezi nejznámější a také hodně využívané metody patří rozhodovací stromy, algoritmus k--means, neuronové sítě a další \cite{web:feec-skripta}.

\noindent V~terminologii strojového učení se objevují tyto pojmy:
\begin{itemize}
\item \textit{Dataset} -- Obecná množina strukturovaných dat použitá pro práci s~modelem.

\item \textit{Trénovací množina} -- Jedná se o~množinu dat, která je použita v~průběhu učení modelu. Množinu vytváří expert na danou oblast. Správná volba obsahu množiny zajišťuje výslednou kvalitu modelu. 

\item \textit{Testovací množina} -- Množina, která se také využívá v~průběhu učení modelu. Slouží ke kalibraci modelu.

\item \textit{Validační množina} -- Jedná se o~nezávislou část datasetu, která v~ideálním případě obsahuje odlišná data oproti trénovací a testovací množině. Využívá se k~vyhnutí se přeučení modelu. 

\item \textit{Features} -- Nebo také \textit{atributy}. Jedná se vstupní hodnoty, které nějakým způsobem ovlivňují výstup -- tedy jsou relevantní k~řešenému problému. Je velmi důležité zvolit správné \textit{features}, na které bude aplikován algoritmus strojového učení, neboť tyto hodnoty mají hlavní dopad na kvalitu výsledného modelu. Volba nerelevatních \textit{features} značně ovlivní výsledné predikce. Hledání správných \textit{features} je označována jako \textit{feature engineering} \cite{web:feature_engineering}.  

\item \textit{Labels} -- Přidaná informace ke vstupním datům, která poskytuje algoritmu strojového učení nějaký datový kontext, který napomáhá učení modelu. Využívá se u strojového učení s učitelem (více popsáno zde \ref{supervised_learning}). Někdy jsou \textit{labels} označovány jako anotace. Například, jestli se jedná, či nejedná o~dotaz s~časovým údajem. 

\item \textit{Model} -- Výstup algoritmu strojového učení. Jedná se o~matematickou reprezentaci rysů v~datech. V~průběhu učení jsou ve vstupních datech nalezeny vazby, které jsou následně formalizovány do pravidel. Na základě těchto pravidel je poté prováděna predikce (inference\footnote{Inference -- Vyvozování závěrů z~faktických, pozorovatelných skutečností.}) nad novými daty.

\item \textit{Ztrátová funkce} -- Nebo také \textit{chybová funkce}\footnote{Anglicky: \textit{Loss function}}. Udává míru rozdílu mezi predikcí modelu a skutečnou hodnotou. Ztrátová funkce se využívá v~průběhu učení modelu, kdy se určuje, jak kvalitní je predikce modelu. Existuje více druhů ztrátových funkcí, každá ztrátová funkce je vhodná pro jiný typ úlohy strojového učení. \newline Mezi nejznámější ztrátové funkce patří: mean absolute error (MAE), mean squared error (MSE) \cite{web:loss_functions}.

\item \textit{Epocha} -- Značí počet průchodů datasetu algoritmem strojového učení. Určení počtu epoch je předmětem zkoumání u~každého vytvářeného modelu, neboť určení tohoto čísla spočívá na mnoha parametrech -- vstupní data, očekávaná kvalita modelu.

\item \textit{Přeučení (overfitting)} -- Jedná se o~stav, kdy je model příliš spjat s~konkrétními daty, a proto nemůže spolehlivě provádět predikce nad novými daty. Pro tuto situaci je typické, že predikce na učící množině jsou téměř bezchybné, zatímco na validační množině dosahují vysoké chybovosti. Existuje více způsobů jak předejít přeučení, může se například jednat o~přidání dalších dat, přidání dalších features apod.

\item \textit{Podučení (underfitting)} -- Stav, kdy model není dostatečně naučen. Predikce modelu nejsou kvalitní pro všechny typy množin, a proto jej lze poměrně jednoduše detekovat. Řešením je tedy dále pokračovat v~procesu učení modelu.
\end{itemize}

\newpage
\subsection{Typy strojového učení}
V následující části jsou popsány tyto vybrané typy strojového učení:učení s učitelem, učení bez učitele, učení s poloučitelem. Existují i další typy strojového učení, o kterých lze získat informace zde \cite{web:ml_types}. 

\subsubsection{Supervised learning -- učení s~učitelem}
\label{supervised_learning}
Učení s~učitelem je typ strojového učení, kdy učící dataset obsahuje i \textit{labels}. Algoritmus má tedy na svém vstupu i informaci o~tom, jak by měl správně vypadat výstup, proto je jeho cílem nalézt vztahy, které vstupní atributy jak ovlivňují výslednou výstupní hodnotu. Následně je snaha vytvořit co nejpřesnější aproximaci mapovací funkce ze vstupních atributů na výstupní hodnotu. Proces učení probíhá tak, že algoritmus provádí predikce nad učícími daty a tato predikce je následně porovnána se správnou hodnotou získanou z~\textit{labels}. Po dosažení určité míry přesnosti predikce je proces učení ukončen.

\noindent Typické úlohy, kde se využívá učení s~učitelem je klasifikace a regrese. 

\obr{Schéma strojového učení s~učitelem.}{fig:supervised}{1.0}{images/supervised-ml_1.drawio.pdf}


\newpage
\paragraph{Klasifikace} Klasifikace je proces, který provádí aproximaci mapovací funkce, která mapuje vstupní atributy na výstupní třídy\footnote{Množina dat, které mají podobné (stejné) rysy.}. Aby model vytvářel kvalitní predikce, je nutné zajistit dostatečné množství dat. Tato data by měla obsahovat jak typické prvky dané třídy, tak i dostatečné množství mezních prvků. Zde platí pravidlo čím více dat, tím lépe. 

\noindent Klasifikaci dále můžeme dělit na:

\begin{itemize}

\item \textbf{Binární klasifikace} -- Výstup klasifikátoru patří do jedné ze dvou tříd. Tyto třídy se značí jako normální stav a abnormální stav.\newline Normálnímu stavu je přiřazena hodnota 0 a abnormálnímu stavu hodnota 1. Typickým příkladem binární klasifikace může být spamový filtr\footnote{Nástroj pro detekci nevyžádaných e-mailů.} u~e-mailů. V~tomto případě je brán normální stav jako e-mail, který není spam. Abnormální stav je pak e-mail, který obsahuje spam. 

Mezi nejpoužívanější algoritmy binární klasifikace patří: Logistická regrese, k--NN, Rozhodovací stromy, Support vector machines a Naivní Bayesovský klasifikátor \cite{web:binary_multiclass_classification}.

\obr{Binární klasifikace.}{fig:bin_class}{0.8}{images/figure_binary.png}



\item \textbf{Klasifikace do více tříd} -- Používá se v~případě, kdy je nutné rozlišit více než dvě~třídy. Výstupem klasifikátoru je pravděpodobnost zařazení dat do jednotlivých~tříd. Pro klasifikaci do více tříd lze využít také algoritmy pro binární klasifikaci, je ale nutné určit jakým stylem bude mapováno více tříd na dvě třídy. Mezi typické úlohy pro klasifikaci do více tříd patří rozpoznání obličeje, klasifikace druhu rostliny a nebo rozpoznání textu.

Ke klasifikaci do více tříd lze využít tyto algoritmy: k--NN, Rozhodovací stromy, Naivní Bayesovský klasifikátor. Z~algoritmů pro binární klasifikaci lze pro klasifikaci do více tříd využít tyto: Logistická regrese, Support vector machines.

\obr{Klasifikace do více tříd.}{fig:multi_class}{0.8}{images/figure_multi_class.png}


\item \textbf{Klasifikace více labelů} -- Jedná se o~zobecnění klasifikace do více tříd, kdy v~tomto případě může prvek patřit do více tříd současně. Pro každou třídu existuje predikce s~jakou pravděpodobností do dané třídy prvek spadá. Tento typ klasifikace se využívá například pro predikci žánru filmu podle jeho příběhu.

Pro tuto klasifikaci je nutné využívat přímo k~tomu určené algoritmy, například více labelová verze rozhodovacích stromů.  


\item \textbf{Nevyvážená klasifikace} -- Tento případ klasifikace nastává poměrně často, kdy nemáme stejný počet dat pro všechny klasifikované třídy. Jedná se zpravidla o~binární klasifikaci, kdy většinu datasetu tvoří data normálního stavu, abnormální stav je zde zastoupen minimálně. Je nutné dbát na správnou interpretaci výsledků kvality modelu. Více popsáno zde \ref{model_quality}.
\end{itemize}

\newpage
\paragraph{Regrese}
Jedná se o~techniku, která zkoumá vztah mezi nezávislými vstupními proměnnými (features) a spojitou závislou proměnnou (výstup). Postup učení je zde stejný jako v~případě učení modelu pro klasifikaci. Na základě znalosti vstupních proměnných a očekávané výstupní proměnné jsou predikce postupně zdokonalovány. Regrese se využívá pro vytváření predikcí, tento přístup lze tedy aplikovat na různé oblasti -- predikce ceny domu, predikce prodejnosti výrobku, předpověď počasí. 

Jako nejednodušší použití regrese je lineární regrese. Jedná se o~přístup, kdy je mezi vstupní body umístěna přímka a algoritmus se snaží minimalizovat chybu mezi přímkou a jednotlivými body. V~tomto případě se předpokládá, že vztah mezi vstupem a výstupem je lineární \cite{web:ml_regression}.


\subsubsection{Unsupervised learning -- učení bez učitele}
Jak již název napovídá, tak toto učení je bez přidané informace o~správné výsledné hodnotě, tedy učící množina dat neobsahuje \textit{labels}. Algoritmus strojového učení si nejprve sám musí udělat vnitřní reprezentaci dat a poté nad touto reprezentací provádět další operace -- hledání skrytých vzorů. Mezi typické úlohy patří shlukování\footnote{Anglicky clustering}, kdy se hledají skupiny dat s~podobnými rysy. Dalším typem úlohy může být odhad hustoty\footnote{Anglicky density estimation}, kdy se hledá rozdělení vstupů v~nějakém prostoru.

\obr{Schéma strojového učení bez~učitele.}{fig:unsupervised}{1.0}{images/unsupervised-ml.drawio.pdf}

Výhodou tohoto typu strojového učení je, že jej můžeme použít na více komplexnější úlohy než v~případě strojového učení s~učitelem \cite{web:ml_unsupervised_3} -- není nutné anotovat vstupní data. Dimenze  vstupních dat může být mnohem vyšší oproti datům použitým při učení s~učitelem. 

Nevýhodou pak je, že ihned nemáme představu o~tom, jestli jsou pro nás výsledky~relevantní. Je nutné, aby tyto výsledky zkontroloval expert v~dané oblasti.

Tato metoda strojového učení lze také využít pro \textit{feature engineering}.

Mezi algoritmy strojového učení bez učitele patří K--means, Fuzzy K--means, neuronové sítě \cite{web:ml_unsupervised_1}, \cite{web:ml_unsupervised_2}.




\subsubsection{Semisupervised learning -- učení s~poloučitelem}
Jedná se o~kombinaci strojového učení s~učitelem a strojového učení bez učitele, kdy anotovaná data jsou v~datasetu zastoupena v~malém počtu. Zbytek datasetu obsahuje data bez anotací. Výhodou v~tomto případě je, že se při přípravě datasetu nemusíme zabývat velkým počtem dat, které je potřeba anotovat \cite{web:ml_semi_supervised}.

\vspace{5mm}
\noindent\textbf{Princip učení s~poloučitelem}
\begin{enumerate}
    \item Naučení modelu nad anotovanou částí datasetu.
    \item Využití naučeného modelu k~provedení predikcí nad neanotovanou částí datasetu -- vzniknou \textit{pseudo-labels}.
    \item Spojení \textit{labels} z~anotované části datasetu a predikovaných \textit{pseudo-labels}.
    \item Spojení vstupních dat z~anotované části datasetu s~neanotovanou částí datasetu.
    \item Znovu naučení modelu s~využitím celého datasetu.
\end{enumerate}


\newpage
\subsection{Hodnocení kvality modelu}
\label{model_quality}
Po dokončení procesu strojového učení je nutné nějakým způsobem vyhodnotit dosažené výsledky -- jak kvalitní predikce je model schopen provádět nad novými (neznámými) daty. Sledování pouze jednoho ukazatele může být zavádějící v~případě, že v~datasetu nejsou všechny třídy zastoupeny rovnoměrně.

Abychom získali ucelenější přehled o~kvalitě modelu, tak využíváme tyto metriky: 
\begin{itemize}
    \item Konfúzní matice (confusion matrix)\footnote{Nebo také matice záměn}.
    \item Správnost (accuracy).
    \item Přesnost (precision).
    \item Pokrytí (recall).
    \item F1-score.
\end{itemize}

\subsubsection{Konfúzní matice}
Jedná se o~matici o~velikosti N x N, kde N je počet výstupních tříd. Matice dává do~souvislosti očekávané hodnoty s~těmi, které byly predikovany modelem. Tato souvislost nám dává vhled, jak kvalitní predikce model provádí a jaké chyby dělá. V~případě binární klasifikace je konfúzní matice o~velikosti 2 x 2.


\begin{table}[h]
	\captionsetup{width=1.0\linewidth}
	\caption{Schéma konfúzní matice pro binární klasifikaci.}
	\label{tab:confusion_matrix}
	\renewcommand{\arraystretch}{2.5}
	\begin{center}
		\centering
		\catcode`\-=12
		\begin{tabular}{|c|c|c|}
			\hline
            & \multicolumn{2}{|c|}{Predikované hodnoty} \\
            \hline
            \multirow{2}{4em}{Skutečné hodnoty} & True positive & False positive \\ \cline{2-3}
            & False positive & True negative \\
            \hline
    
		\end{tabular}
	\end{center}
\end{table}



% \tab{Schéma konfúzní matice}{tab:confusion_matrix}{1.0}{|c|c|}
% {
% \hline
% True Positive & False Positive \\ \hline
% False Negative & True Negative \\ \hline
% }
\newpage
\paragraph{Prvky konfúzní matice}
\paragraph{Pravdivě pozitivní -- True positive (TP)}
\begin{itemize}
    \item Predikce se shoduje s~očekávanou hodnotou.
    \item Predikovaná hodnota je pozitivní, očekávaná hodnota je také pozitvní.
\end{itemize}

\paragraph{Pravdivě negativní -- True negative (TN)} 
\begin{itemize}
    \item Predikce se shoduje s~očekávanou hodnotou.
    \item Predikovaná hodnota je negativní, očekávaná hodnota je také negativní. 
\end{itemize}

\paragraph{Falešně pozitivní -- False positive (FP)}
\begin{itemize}
    \item Predikce se neshoduje s~očekávanou hodnotou.
    \item Predikovaná hodnota je pozitivní, očekávaná hodnota je však negativní.
    \item Označován jako \textit{Type 1 Error} \cite{web:ml_confusion_matrix_1}.
\end{itemize}

\paragraph{Falešně negativní -- False negative (FN)}
\begin{itemize}
    \item Predikce se neshoduje s~očekávanou hodnotou.
    \item Predikovaná hodnota je negativní, očekávaná hodnota je však pozitivní.
    \item Označován jako \textit{Type 2 Error} \cite{web:ml_confusion_matrix_1}.
\end{itemize}

\newpage
\paragraph{Popis metrik}
\paragraph{Správnost -- Accuracy}
\begin{itemize}
    \item Udává poměr správně predikovaných hodnot. Jak pozitvních, tak negativních.
    \item Správnost by měla mít, co nejvyšší hodnotu.
    \item Vyjadřuje: kolik je toho predikováno správně.
\end{itemize}
\begin{equation*}
Accuracy = \frac{TP + TN}{TP + FP + TN + FN}
\end{equation*}

\paragraph{Přesnost -- Precision}
\begin{itemize}
    \item Tato hodnota říká: ze všech případů, které byly predikovány pozitivně, kolik jich je opravdu pozitivních. 
    \item Přesnost by měla mít, co nejvyšší hodnotu.
    \item Vyjadřuje: důvěryhodnost predikcí.
\end{itemize}

\begin{equation*}
Precision = \frac{TP}{TP + FP}
\end{equation*}

\paragraph{Pokrytí -- Recall}
\begin{itemize}
    \item Udává kolik bylo správně klasifikovaných pozitivních případů ze všech pozitivních případů.
    \item Pokrytí by mělo mít, co nejvyšší hodnotu.
    \item Vyjadřuje: poměr odhalených pozitivních případů 
\end{itemize}
\begin{equation*}
Recall = \frac{TP}{TP + FN}
\end{equation*}


\paragraph{F1--score}
\begin{itemize}
    \item Jedná se o~harmonický průměr přesnosti a pokrytí.
    \item Jednou hodnotou vyjadřuje kvalitu modelu z~pohledu přesnosti a pokrytí.
    \begin{itemize}
        \item Vysoké hodnoty přesnosti a pokrytí $\implies$ vysoká hodnota F1-score
        \item Nízké hodnoty přesnosti a pokrytí $\implies$ nízká hodnota F1-score
        \item Jedna z~hodnot přesnosti nebo pokrytí je vysoká, druhá nízká $\implies$ střední hodnota F1-score
    \end{itemize}
\end{itemize}
\begin{equation*}
F1\textnormal{-}score = \frac{2 * Recall * Precision}{Recall + Precision}
\end{equation*}

Informace o~metrikách čerpány z~\cite{web:ml_confusion_matrix_2} a z~\cite{web:ml_f1_score}.


\section{Jazykový model Electra}
Vychází z~jazykového modelu BERT (Bidirectional Encoder Representations from Transformers)\footnote{Více zde: \href{https://www.techtarget.com/searchenterpriseai/definition/BERT-language-model}{https://www.techtarget.com/searchenterpriseai/definition/BERT-language-model}}. Ten je postaven na architektuře neuronové sítě, která obsahuje dvě hlavní komponenty -- enkodér a dekodér. Od modelu BERT se liší pouze v~principu učení.

Model Electra je dostupný ve třech verzích. V~rámci této diplomové práce se využívá verze Electra--Small. Další verze jsou Electra--Base, Electra--Large. Verze se liší počtem vrstev a parametry \cite{web:electra_github}.

\subsection{Princip učení}
Model BERT se učí tak, že ve vstupním textu jsou některé tokeny\footnote{Token -- Posloupnost nedělitelných znaků -- zpravidla slovo.} maskovány (masked language modeling) a model se následně učí určit původní tokeny. Tento styl učení dosahuje kvalitních výsledků, ale vyžaduje velké množství výpočetního výkonu.

Jazykový model Electra namísto maskování některých tokenů, tyto tokeny nahrazuje jinými a model v~průběhu učení predikuje, jestli byl token nahrazen jiným, či nikoliv. Tento přístup k~učení modelu je mnohem efektivnější než maskování tokenů \cite{web:electra_paper}.



\subsection{Algoritmus Wordpiece}
Model není schopen zpracovávat text v~čitelné podobě, a proto je potřeba každé slovo převést na token (nebo na více tokenů) a ty pak nějakým způsobem číselně reprezentovat, aby mohly být zpracovány modelem. Electra k~tomu využívá algoritmus \textit{Wordpiece}. Principem tohoto algoritmu je rozdělení každého slova na jeden nebo více tokenů \cite{web:wordpiece}.
Například slovo "prvního"{} může být rozděleno na tokeny \texttt{první} a \texttt{\#\#ho}. Znaky \texttt{\#\#} značí, že danému tokenu předchází jiný token. 

Algoritmus sám o~sobě nepracuje s~bílými znaky jako s~tokeny, tudíž ze spojení "počasí zítra"{} algoritmus \textit{Wordpiece} vytvoří tyto tokeny: \texttt{["počasí"{}, "zítra"{}]}. Aby~bylo možné z takto vytvořených tokenů zpětně sestavit původní text, tak algoritmus na svém výstupu obsahuje informaci o tom, kde se vzniklý token nachází v původním textu. Pomocí tohoto mapování lze poté zjistit, mezi kterými tokeny je mezera, a nebo jiný bílý znak.


\vspace{5mm}
\noindent Učení jazykového modelu Electra má dvě fáze:
\paragraph{Pre--training fáze} V~první řadě je potřeba naučit jazykový model chápat jazyk. Model tak získá představu představu o~jazyce, na kterém pak bude probíhat~\textit{fine--tuning}~(druhá fáze). Modelu jsou předkládány věty, ve kterých byly modifikovány některá slova a model odhaduje jestli bylo slovo změněno. V~této fázi učení je potřeba velké množství dat, aby model získal co největší přehled o~daném jazyce. V~\textit{pre--tuning} fázi se jedná o~strojové učení bez učitele -- neuronová síť se učí sama.

\paragraph{Fine--tuning fáze} V~této fázi dochází k~doučení modelu na konkrétní typ úlohy. Koncová část sítě je nahrazena takovou, která je vhodná pro daný typ úlohy. Jedná se o~fázi, kdy je použito strojové učení s~učitelem. Pro tuto fázi není nutné mít tolik dat jako v~případě \textit{pre--training fáze}.

\subsection{Použití modelu Electra v~českém jazyce}
Aby bylo možné využívat jazykový model v~českém jazyce, musela být provedena \textit{pre--training} fáze s~českým textem. V~případě diplomové práce nebylo nutné provádět tuto fázi, neboť existuje model Electry, který už byl předučen na český jazyk. 
Tento~model byl předučen ve firmě Seznam.cz a je pojmenován Small-E-Czech (Smolíček), jeho předučení probíhalo za použití 250GB textu a trvalo asi 20 dní na jedné grafické kartě \cite{web:smolicek}.

\section{ONNX formát (Open Neural Network Exchange)}
Jedná se o open source formát od Microsoftu pro sdílení neuronových sítí. Různé frameworky vytváří různé typy datových grafů, které reprezentují neuronovou síť. Cílem tohoto formátu je usnadnit interoperabilitu mezi frameworky. Vývojáři se poté mohou soustředit přímo na vývoj neuronové sítě a nemusí se zabývat kompatibilitou s~jinými frameworky \cite{web:onnx_format}. Tento formát je dále využíván k~inferenci, kde je možnost volby mezi inferencí na CPU\footnote{Centrální procesorová jednotka (anglicky central processing unit) -- Základní elektronická součást počítače, která umí vykonávat strojové instrukce, ze kterých je tvořen počítačový program. } a nebo GPU\footnote{Grafický procesor (anglicky graphics processing unit) -- Mikroprocesor uvnitř počítače, který zajišťuje rychlé grafické výpočty a změny obsahu videopaměti, které jsou posléze zobrazovány na monitoru.} \cite{web:onnx_runtime}. Volba inference na CPU nebo GPU by měla být zvolena až po provedení experimentů, neboť záleží na povaze úlohy strojového učení. Provádění inference na CPU zpravidla vyžaduje určitou kvantizaci modelu (popsáno dále), aby byla snížena doba inference za cenu poklesu kvality predikce. GPU umožňuje provádět rychlé paralelní výpočty, které mohou být při inferenci použity. Dále není nutné model kvantizovat, neboť GPU pracuje s~čísly s~plovoucí desetinnou čárkou \cite{web:gpu_cpu_inference}.

\section{Kvantizace modelu}
\label{model_quantization}
Kvantizace modelu je technika, která snižuje velikost modelu a dobu inference za cenu nižší kvality modelu. Rozdíl mezi kvantizovaným a nekvantizovaným modelem je ten, že nekvantizovaný model provádí operace s~tensory\footnote{Tensor -- Vícedimenzionální pole} v~číslech s~desetinnou čárkou (\texttt{FP32}), zatímco kvantizovaný model v~celých~číslech (\texttt{UINT8}). Tento přístup umožňuje provádět některé vektorové operace přímo na hardware. Provedením kvantizace PyTorch\footnote{Více zde: \url{https://pytorch.org/}.} modelu z~\texttt{FP32} na \texttt{UINT8} dojde ke čtyřnásobnému zmenšení velikosti modelu a potřebné paměťové náročnosti. Provádění výpočtů je v~tomto případě typicky 2x až 4x rychlejší oproti variantě s~\texttt{FP32} \cite{web:quantization}.






\newpage
\section{Regulární výrazy}
Regulární výrazy vycházejí z~oblasti teoretické informatiky, kde jsou konkrétněji zařazeny do teorie automatů a~formálních jazyků. Tato oblast se zabývá popisem jazyka a~jeho ohodnocením.

Regulární výrazy se využívají pro práci s~textem, můžeme je využít při vyhledávání, při editaci, ale také při validaci různých dat. Oproti vyhledávání pevně stanovené fráze,  mají regulární výrazy velkou výhodu v~tom, že můžeme vyhledávat pouze řetězce, které splňují určité vlastnosti -- slova pouze na začátku řádku, slova začínající pouze daným písmenem a různé další vlastnosti. Umožňují nám také snadno definovat validační podmínky, které bychom jinak museli pracně programovat.



V~unixovém prostředí se s~nimi můžeme setkat při použití nástrojů \texttt{grep}, \texttt{sed}, \texttt{less}, \texttt{vim} a v~mnoha dalších. 

Jsou také hojně zastoupeny v~aktuálně využívaných programovacích jazycích jako jsou například: \texttt{C++}, \texttt{Javascript}, \texttt{Python} a další.



\subsection{Složení regulárního výrazu}
Obsah regulárního výrazu se může skládat z~běžných znaků a metaznaků. Běžné znaky jsou klasické znaky -- písmena, číslice mají svůj původní význam. V~případě metaznaků se jedná o~skupinu znaků, která má v~rámci regulárního výrazu jiný význam, tyto metaznaky budou dále popsány.

Mezi metaznaky patří tyto znaky: \texttt{\^}, \texttt{\$}, \texttt{*}, \texttt{(}, \texttt{)}, \texttt{[}, \texttt{]}, \texttt{.}, \texttt{?}.

Pro použití metaznaků v~původním významu, je nutné  tyto metaznaky v~regulárním výrazu potlačit. Toho se dosáhne přidáním zpětného lomítka \texttt{\textbackslash} před metaznak, čímž získá původní význam.

\subsubsection{Tečka}
Metaznak tečka (\texttt{.}) v~regulárním výrazu zastupuje právě jeden jakýkoliv znak. Znak který nemůže být zastoupen tečkou je znak konec řádku. 

\subsubsection{Skupina znaků}
Využívá se v~případě, že je potřeba definovat pouze určitou skupinu znaků. Skupina je definována pomocí hranatých závorek \texttt{[]}. Rozsah znaků je definován pomocí pomlčky~\texttt{-}. Jestliže potřebujeme definovat pouze číslice od 1 do 8, tak takový regulární výraz může být zapsán následovně: \texttt{[1-8]}.

\subsubsection{Zástupné skupiny znaků}
Tyto skupiny znaků lze zapsat zkráceně, neboť se jedná o~často využívané skupiny znaků. Použití těchto zástupných znaků velkou mírou přispívá k~výsledné přehlednosti regulárního výrazu. 

\begin{table}[h!]
	\captionsetup{width=1.0\linewidth}
	\caption{Popis zástupných skupin znaků.}
	\label{tab:kvantifikatory}
	\begin{center}
		\centering
		\catcode`\-=12
		\begin{tabular}{|c|l|l|}
			\hline
		    \textbf{Zástupný znak} & \multicolumn{1}{c|}{\textbf{Význam}} & \multicolumn{1}{c|}{\textbf{Ekvivalent}} \\ \hline
            \texttt{\textbackslash s} & Bílé znaky & \texttt{[ \textbackslash t\textbackslash n\textbackslash r\textbackslash f]} \\ \hline
            \texttt{\textbackslash S} & Jakýkoliv znak kromě bílého & \texttt{[\^{} \textbackslash t\textbackslash n\textbackslash r\textbackslash f]} \\ \hline
            \texttt{\textbackslash w} & Alfanumerické znaky & \texttt{[a-zA-Z0-9]} \\ \hline
            \texttt{\textbackslash W} & Jakýkoliv znak kromě alfanumerického znaku & \texttt{[\^{}a-zA-Z0-9]} \\ \hline
            \texttt{\textbackslash d} & Numerické znaky & \texttt{[0-9]} \\ \hline
            \texttt{\textbackslash D} & Jakýkoliv znak kromě numerického znaku & \texttt{[\^{}0-9]} \\ \hline

		\end{tabular}
	\end{center}
\end{table}


\subsubsection{Kvantifikátory}
Tato skupina metaznaků nějakým způsobem modifikuje předcházející znak. V~případě, že by měl být opakován více než jeden předchozí znak, tak je potřeba sekvenci znaků uzavřít do kulatých závorek -- například \texttt{(abc)}.

\begin{table}[h]
	\captionsetup{width=1.0\linewidth}
	\caption{Význam kvantifikátorů.}
	\label{tab:kvantifikatory}
	\begin{center}
		\centering
		\catcode`\-=12
		\begin{tabular}{|c|c|c|}
			\hline
		    \textbf{Kvantifikátor} & \textbf{Od} & \textbf{Do} \\ \hline
            \texttt{*} & 0 & $\infty$ \\ \hline
            \texttt{+} & 1 & $\infty$ \\ \hline
            \texttt{?} & 0 & 1 \\ \hline
            \texttt{\{N\}} & N & N \\ \hline
            \texttt{\{N,\}} & N & $\infty$ \\ \hline
            \texttt{\{,M\}} & 0 & M \\ \hline
            \texttt{\{N, M\}} & N & M \\ \hline
		\end{tabular}
	\end{center}
\end{table}


\paragraph{Greedy hledání} Pokud je v~regulárním výrazu použit kvantifikátor \texttt{*}, tak se jedná o~tzv.~"greedy"{} hledání. To znamená, že se regulárnímu výrazu bude odpovídat, co nejdelší řetězec. 

Pokud bychom měli regulární výraz \texttt{"abc.*"{}}, tak takový regulární výraz přijme každý řetězec, který začíná sekvencí znaků \texttt{abc}, tedy přijímaný řetězec může být libovolně dlouhý -- například \texttt{abcdefgh}.

\paragraph{Non--greedy hledání} Pokud by měl regulární výraz přijímat co nejkratší část řetězce, která odpovídá regulárnímu výrazu, tak se jedná o~tzv.~"non--greedy"{} hledání. Vytvoření regulárního výrazu pro tento typ hledání je snadné -- za modifikátor \texttt{*} je umístěn modifikátor \texttt{?}.

Pokud bychom v~tomto případě měli regulární výraz \texttt{"abc.*?"{}}, tak nyní regulání výraz přijímá pouze sekvenci znaků \texttt{abc} a následující znaky již nejsou přijaty.


\subsubsection{Hranice}
Častým případem při využití regulárních výrazů je vyhledávání podřetězce, který se nachází na specifické pozici v~rámci řádku či slova. Regulární výrazy umožňují tyto hranice specifikovat. Využití těchto hranic i v~případě, kdy je zřejmé, kde se hledaný podřetězec nachází, přispívá k~výsledné přehlednosti regulárního výrazu, kdy si další osoba studující daný regulární výraz může snáze udělat ucelenější přehled o~podřetězcích, které regulární výraz umožňuje nalézt. 

\begin{table}[h]
	\captionsetup{width=1.0\linewidth}
	\caption{Význam metaznaků hranice.}
	\label{tab:hranice}
	\begin{center}
		\centering
		\catcode`\-=12
		\begin{tabular}{|c|l|}
			\hline
		    \textbf{Metaznak} & \multicolumn{1}{c|}{\textbf{Význam}} \\ \hline
            \texttt{\^} & Začátek řádku \\ \hline
            \texttt{\$} &  Konec řádku \\ \hline
            \texttt{\textbackslash b} & Hranice slova (začátek i konec) \\ \hline
            \texttt{\textbackslash B} & Mimo hranici slova \\ \hline
		\end{tabular}
	\end{center}
\end{table}

\subsubsection{Závorky}
Závorky jsou užitečnou konstrukcí v~regulárních výrazech, využívají se například při sdružení více znaků pro kvantifikátory, pro vytvoření více variant hledaného spojení (alternace) a nebo pro zapamatování si řetězce -- více popsáno zde \ref{regex:memory}.

\paragraph{Sdružení více znaků} V~případě spojení více znaků dohromady se využívají kulaté závorky \texttt{(} a \texttt{)}, do kterých se celá posloupnost znaků uzavře. Regulární výraz \texttt{(abc)+} poté může hledat řetezce složené z~jednoho a nebo více opakování dané sekvence, v~tomto případě tento regulární výraz může najít tyto sekvence \texttt{abc}, \texttt{abcabc} a další.

\paragraph{Alternace} Aby regulární výraz hledal různé varianty podřetězce, tak je možné tyto varianty specifikovat také do kulatých závorek, jako oddělovač jednotlivých variant je pak použita pipe (\texttt{|}). Regulární výraz \texttt{(okno|podlaha)} odpovídá právě jednomu z~výrazů. Varianty~mohou být kombinovány s~dalšími výrazy, \texttt{kol(o|a)} poté odpovídá buď výrazu \texttt{kolo} a nebo výrazu \texttt{kola}.

\subsubsection{Paměť v~regulárním výrazu}
\label{regex:memory}
Jsou situace, kdy je potřeba s~nalezenou části řetězce dále pracovat, k~tomu v~rámci regulárních výrazů slouží mechanismus zapamatování. 

\paragraph{Nepojmenované zapamatování} Část řetězce, která má být uložena je umístěna do kulatých závorek -- například \texttt{"rok: ([0-9]\{4\})"{}} . Pozdější odkazování na zapamatovanou část se provádí pomocí zpětného lomítka a indexu\footnote{Anglicky backreference}. Indexace začíná od čísla 1, odkaz na dříve zapamatovanou část řetězce může poté vypadat takto \texttt{\textbackslash 1}. V~rámci regulárního výrazu není omezen počet zapamatovatelných částí řetězce.

\paragraph{Pojmenované zapamatování} Využívá se pro zvýšení přehlednosti a usnadnění následující práce se zapamatovanými částmi. Vycházejí ze stejného principu jako nepojmenované zapamatování, ale s~rozdílem, že na zapamatovanou část je odkazováno pomocí zvoleného pojmenování. Definování pojmenovaných uložení se liší v~závislosti na zvoleném jazyce či dialektu regulárních výrazů. 
Zde bude uvedena syntaxe, která k~definici využívá takový zápis \texttt{(?P<name>(pattern))}. Na zapamatovanou část se poté odkazuje pomocí syntaxe \texttt{\textbackslash k<name>}\footnote{Anglicky named backreference}.

\subsubsection{Lookaround -- rozhlížení se okolo}
V~některých případech použití regulárního výrazu je cílem přijímat pouze takový textový řetězec, okolo kterého je určitá sekvence znaků, s~tím že okolní sekvence znaků nejsou zařazeny do výsledku. Zjednodušeně to lze popsat tak, že se provádí kontrola okolí přijímaného řetězce a v~případě, že kontrola skončí úspěšně, tak je řetězec přijat.

Jedná se o~tzv. "zero-length assertions"{}, to znamená, že kontrolují okolní znaky, ale nemění pozici kurzoru právě hledaného řetězce v~případě shody.

Rozlišuje se mezi dvěma směry: dopředné vyhledávání a zpětné vyhledávání. Každé vyhledávání se pak dělí na pozitivní a negativní.

\paragraph{Princip dopředného vyhledávání}
Název napovídá, že vyhledávání bude probíhat v~následujících znacích v~textu. Nejprve je nalezena pozice posledního znaku před aplikací dopředného vyhledávání. Poté se začíná procházet sekvence znaků v~dopředném vyhledávání. V~případě že je nalezena celá sekvence znaků, je vyhledávání prohlášeno za úspěšné.  

Pokud bychom měli text \texttt{"hospoda"{}} a chtěli bychom vyhledat pouze řetězec \texttt{"hospo"{}}, který musí být následovaný řetězcem \texttt{"da"{}}, tak je nejprve nalezen řetězec \texttt{"hospo"{}}, kdy kurzor označující poslední znak vyhledávaného řetězce je \texttt{"o"{}}. Následně se procházejí další znaky a kontroluje se zda odpovídají řetězci \texttt{"da"{}}.

\paragraph{Princip zpětného vyhledávání}
Vyhledávání probíhá v~předcházejících znacích přijímaného řetězce. Prochází se celá sekvence textu dokud není možné provést zpětné vyhledávání\footnote{I v~případě čtení prvního znaku textu se provádí zpětné vyhledávání, které končí neúspěšně pokud vyhledávání obsahuje neprázdnou sekvenci znaků.}, které skončí úspěšně. Následně se přechází na první znak přijímaného řetězce, pokud znak odpovídá znaku v~regulárním výrazu, tak se pokračuje na další znak. Pokud ne, tak se postoupí na další znak a znovu je prováděno zpětné vyhledávání. Takto se to opakuje až do doby, dokud není přijat celý řetězec.

Pokud bychom měli text \texttt{"úskok"{}} a chtěli bychom vyhledat pouze řetězec \texttt{"skok"{}}, kterému musí předcházet řetězec \texttt{"ú"{}}, tak proces hledání bude následovný: V~případě prvního znaku (\texttt{ú}) není možné provést zpětné vyhledávání. Postupuje se v~sekvenci na další znak (\texttt{s}). Zde je možné provést zpětné hledání, v~tomto případě skončí zpětné vyhledávání úspěšně. Je možné se tedy posunout na kontrolu, zda aktuální znak odpovídá prvnímu znaku přijímaného řetězce. Následně se pokračuje na další znaky až do konce sekvence znaků uvnitř regulárního výrazu.

\paragraph{Pozitivní dopředné vyhledávání} 
Je zapisováno následovně: \texttt{(?=seq)}, kde \texttt{seq} je sekvence znaků, která musí následovat za přijímaným řetězcem.

Pokud bychom měli text \texttt{"quit"{}} a regulární výraz \texttt{"qu(?=i)"{}} (přijmi všechny řetězce obsahující sekvenci \texttt{qu}, za kterými následuje znak \texttt{i}), tak je tento text regulárním výrazem přijat, neboť za znakem \texttt{u} následuje znak \texttt{i}. V~případě textu \texttt{"quote"{}} a aplikace stejného regulárního výrazu nebude tento text regulárním výrazem přijat, protože pozitivní dopředné vyhledávání skončí neúspěchem.

\paragraph{Negativní dopředné vyhledávání}
Zapisováno takto: \texttt{(?!seq)}, kde \texttt{seq} je sekvence znaků, která nesmí následovat za přijímaným řetězcem.

Pokud bychom měli text \texttt{"qu"{}} a regulární výraz \texttt{"q(?!i)"{}} (přijmi všechny řetězce obsahující znak \texttt{q}, za kterými nenásleduje znak \texttt{i}), tak je tento text regulárním výrazem přijat, neboť za znakem \texttt{q} nenásleduje znak \texttt{i}. V~případě textu \texttt{"qi"{}} a aplikace stejného regulárního výrazu, nebude tento text regulárním výrazem přijat, protože dopředné vyhledávání nalezne znak \texttt{i}, tedy skončí úspěšně, ale jelikož se jedná o~negativní dopředné vyhledávání, tak celkový výsledek je negován, tudíž končí neúspšně a řetězec tak není přijat.

\paragraph{Pozitivní zpětné vyhledávání}
Zápis pozitivního zpětného vyhledávání: \texttt{(?<=seq)}, kde \texttt{seq} je sekvence znaků, která musí předcházet přijímanému řetězci.

Mějme text \texttt{"cat"{}} a regulární výraz \texttt{"(?<=a)t"{}} (přijmi všechny řetězce obsahující znak \texttt{t}, kterému předchází znak \texttt{a}), tak je tento text regulární výrazem přijat právě když je znak \texttt{a} před znakem \texttt{t}. 

\paragraph{Negativní zpětné vyhledávání}
Zapisováno: \texttt{(?<!seq)}, kde \texttt{seq} je sekvence znaků, která nesmí předcházet přijímanému řetězci.

V~případě textu \texttt{"bet"{}} a regulárního výrazu \texttt{"(?<!a)t"{}} (přijmi všechny řetězce obsahující znak \texttt{t}, kterému nepředchází znak \texttt{a}), tak je tento text regulárním výrazem přijat právě když není znak \texttt{e} před znakem \texttt{t}.

Informace k~této sekci byly čerpány z~\cite{web:regular_expression} a z~\cite{web:regex_bc}.


\cast{Praktická část}

\section{Časová entita}
\label{time_entity}
V~rámci této diplomové práce je časová entita chápána jako jeden souvislý nepřerušovaný interval na časové ose, který může být z~jedné strany otevřený. 

V~textu si časovou entitu můžeme představit následovně:
\begin{itemize}
    \item Datum (den, měsíc, rok) a jeho variace.
    \item Hodiny -- číselně i slovně (například "12 hodin"{}).
    \item Dny v~týdnu.
    \item Měsíce.
    \item Část týdne -- víkend.
    \item Část dne -- ráno, odpoledne, večer.
    \item Časový rozsah (například "na 14 dní"{}, "na 2 měsíce"{}) 
\end{itemize}


Součástí časové entity by také měl být i případný modifikátor. Modifikátorem jsou zde myšleny tokeny: "minulý"{}, "další"{}, "tento"{} a další, které mají nějaký význam ve spojení s~danou časovou entitou. Dále by měly být součástí i předložky, které nějakým způsobem modifikují časový interval definovaný časovou entitou. Mezi tyto předložky patří: "v"{}, "od"{}, "do"{} a další, které dávají smysl ve spojení s~časovou entitou. 


\subsection{Definice časové entity}
 Obecně může být časová entita označena jako jakékoliv slovní spojení, které je nějakým způsobem vázáno na čas a nebo nějak pojednává o~časovém úseku.

Pokud bude časová entita chápána tímto stylem, tak je zřejmé, že je zde velmi tenká hranice mezi tím, co můžeme chápat jako časovou entitu a co už ne. Abychom byli schopni jednoznačně určit, že se jedná o~časovou entitu v~rámci dotazu, tak jej nejprve musíme celý pochopit, uvést do kontextu. Až poté je možné provést vyhodnocení obsahu dotazu.

Mějme tedy například hypotetický dotaz "víkendové pobyty"{} a čas položení dotazu je středa~11.~5.~2022. Slovo "víkendové"{} evokuje, že by se mohlo jednat o~časovou entitu, která představuje víkend. Pokud~bychom ale z~takové časové entity chtěli vytvořit nějaký konkrétní časový interval na časové ose, tak zjistíme, že nevíme o~jaké časové intervaly se v~rámci dotazu jedná. Respektive muselo by jich být více, což nesplňuje zadání, že časový interval musí být jeden souvislý celek. V tomto případě se jedná o~obecný zlidovělý název druhu pobytu. Tudíž tento dotaz neobsahuje časovou entitu.

Na druhou stranu, pokud budeme mít další hypotetický dotaz  "jaké bude víkendové počasí"{} a čas položení dotazu je také středa~11.~5.~2022. Tak zde máme stejné slovo, možnou stejnou časovou entitu. V~tomto případě jsme ale schopni vytvořit jeden konkrétní časový interval na časové ose, proto tento dotaz obsahuje časovou entitu. Nyní ale nastává důležitá otázka o~jaký konkrétní časový interval se jedná -- tedy který víkend má uživatel na mysli. Je zřejmé, že uživatel položil dotaz, aby se dozvěděl předpověď počasí na následující víkend, časový interval tedy bude označovat následující víkend~--~14.-15.~5.~2022.


V~následující tabulce jsou uvedeny příklady dotazů a k~nim vyhodnocení zda se jedná či nejedná o~časový údaj.

\begin{table}[h]
	\captionsetup{width=1.0\linewidth}
	\caption{Příklady časových údajů.}
	\label{tab:hranice}
	\begin{center}
		\centering
		\catcode`\-=12
		\begin{tabular}{|l|c|}
			\hline
		    \textbf{Text} & \multicolumn{1}{c|}{\textbf{Jedná se o~časový údaj}} \\ \hline
            Televizní program dnes večer & Ano \\ \hline
            Horoskop na březen & Ano \\ \hline
            Nehoda Blansko včera & Ano \\ \hline
            Počasí únor & Ano \\ \hline
            Počasí na víkend & Ano \\ \hline
            Denní menu & Ano \\ \hline
            Počasí Rejvíz na 14 dní & Ano \\ \hline
            sms vánoční přání &  Ne \\ \hline
            Pranostiky na únor & Ne \\ \hline
            Bohemians 1905 & Ne \\ \hline
            Víkendové pobyty na horách & Ne \\ \hline
            vinotéka 17 listopadu Říčany u~Prahy & Ne \\ \hline
		\end{tabular}
	\end{center}
\end{table}

\newpage
\subsection{Anotace}
Pro práci s daty je bylo nutné anotovat. Anotace byly provedeny externě ve firmě Seznam.cz a autor diplomové práce je získal pro další experimentování. Popis procesu anotování je mimo rozsah diplomové práce.

\noindent Pro úplnost jsou zde uvedeny pouze úkoly pro anotátory:

\begin{itemize}
    \item Vyznačení části dotazu, která obsahuje časový údaj a s~ním spojené spojky a předložky.
    \item Vyznačení časového intervalu, o~kterém časový údaj pojednává. Data obsahovaly přesný čas, kdy byl dotaz položen. Tato informace sloužila anotátorům k získání kontextu, kdy byl dotaz položen.
    
\end{itemize}

Interval časového údaje je v~tomto případě definován jako zleva uzavřený interval. Interval pro 12. hodinu tedy bude: od 12:00 do 13:00, interval pro jeden den je definován jako 00:00 daného dne až 00:00 dalšího dne.

% \newpage
\begin{table}[h]
	\captionsetup{width=1.0\linewidth}
	\caption{Ukázka anotací.}
	\label{tab:hranice}
	\begin{center}
		\centering
		\catcode`\-=12
		\begin{tabular}{|l|c|c|c|}
			\hline
		    \multicolumn{1}{|c|}{\textbf{Dotaz}} & \multicolumn{1}{c|}{\textbf{Časové tokeny}} & \textbf{Od} & \textbf{Do} \\ \hline
            www slavnosti dřeva volary 2020 & 2020 & 1.1.2020 & 1.1.2021 \\ \hline
            vlk vyl na měsíc & -- & -- & -- \\ \hline
            tvoje tvar má známý hlas 21.9.2020 & 21.9.2020 & 21.9.2020 & 22.9.2020 \\ \hline
            jiří šídlo šťastné pondělí & -- & -- & -- \\ \hline
		\end{tabular}
	\end{center}
\end{table}

V~dalších částech diplomové práce bude na token obsahující časový údaj odkazováno jako na časový token. Pojmem časová entita může být vyjádřena posloupnost časových tokenů.



\newpage
\section{Předzpracování dat}
\label{preprocessing}
Pro vytvoření datasetu pro učení modelu byl dostupný dataset s~náhodnými dotazy, kterých bylo 500~000\footnote{Celkový počet dotazů byl ale vyšší, neboť každý dotaz obsahoval i informaci o~své četnosti.}. Tento dataset ale bylo nejprve nutné připravit pro anotační úlohu a dále pak vytvořit dataset, který bude využit algoritmem strojového učení. 

Před samotným procesem zpracování byla data doplněna o diakritiku. A~dále byla data unifikována -- po doplnění diakritiky se může stát, že se v~datech objeví dva stejné dotazy, které byly před doplněním diakritiky rozdílné. Například "tvoje tvar ma znamy hlas"{} a "tvoje tvář má známý hlas"{} jsou po doplnění diakritiky stejné a proto mohou být ve výsledném datasetu uloženy pouze jednou s~četností 2.

\vspace{5mm}
\noindent Předzpracování dat se skládá z~následujících bodů:
\begin{itemize}
    \item Nalezení dotazů s~potenciálními časovými entitami.
    \item Příprava dat pro anotační úlohu.
    \item Vytvoření datasetu pro algoritmus strojového učení.
\end{itemize}

\newpage
\subsection{Filtrování potenciální dotazů s~časovými entitami}
Aby bylo dosaženo co největšího pokrytí dotazů s~časovými entitami, tak filtrování probíhalo pomocí dvou nástrojů. V~případě snahy, o~co největší pokrytí dotazů se ale dostáváme do stavu, kdy přesnost takového filtrování je poměrně nízká a vyfiltrovaný dataset tak obsahuje mnoho falešně pozitivních dotazů. Vyšší počet falešně pozitivních dotazů je v~tomto případě přípustný, neboť falešně pozitivní dotazy budou odfiltrovány anotátory.

\subsubsection{Filtrování pomocí regulárních výrazů}
Tento typ filtrování byl zvolen zejména z~důvodu snadné a rychlé implementace nástroje, který by takové filtrování prováděl. Při vytváření regulárních výrazů tedy nebyl kladen takový důraz na přesnost regulárního výrazu. 

Pro lepší konfigurovatelnost jsou regulární výrazy umístěny v~souboru JSON\footnote{JSON -- Javascript object notation.}, kde je možné ke každému regulárnímu výrazu specifikovat jakým stylem se má s~daným regulárním výrazem zacházet. Jestli jej lze použít samostatně, a nebo se na něj musí ještě aplikovat hranice slova a případné další modifikace.
Takto zapsané regulární výrazy jsou pak čteny Python skriptem, ten sestaví všechny regulární výrazy s~danou konfigurací. Následně se na každý dotaz aplikují všechny regulární výrazy. V~případě, že je uvnitř dotazu nalezena shoda s~regulárním výrazem, tak je dotaz uložen a následně zapsán do souboru.

\subsubsection{Filtrování pomocí aktuální detekce časových entit}
Dotazy byly také analyzovány aktuální detekcí časových entit, která je popsána v sekci, která pojednává o aktuálním stavu detekce časových entit (\ref{actual_state}). Motivací pro takové filtrování bylo zejména zvýšit přesnost filtrovaných dotazů a také případně pokrytí. Tato analýza sloužila zejména pro zjištění, zda v~regulárních výrazech nebyl opomenut nějaký formát časové entity. 

\subsection{Příprava datasetu pro anotační úlohu}
Popis průběhu anotací a formátu anotační úlohy jsou nad rámec této diplomové práce. Přípravu dat pro anotační úlohu je možné shrnout tak, že dataset byl zpracován do jiného formátu JSONu, který byl definovaný anotačním rozhraním.

V~případě práce s~daty došlo k~provedení tokenizace dotazu na základě bílých znaků\footnote{Mezera, tabulátor apod.}.

\subsubsection{Statistika datasetu}
V~tabulce \ref{tab:dataset_stat} jsou uvedeny počty dotazů a jejich zařazení. Časovým dotazem je zde myšlen dotaz, který byl anotován jako dotaz obsahující časovou entitu. Z~tabulky lze vyčíst, že nesouhlasí součet unikátních dotazů s~celkovým počtem dotazů uvedeným na začátku této sekce (474 557 vs. 500 000). Tento nesoulad je dán tím, že v~původním datasetu nebyla všem dotazům doplněna diakritika a dotazy nebyly následně unifikovány.

\begin{table}[h]
	\captionsetup{width=1.0\linewidth}
	\caption{Statistika datasetu.}
	\label{tab:dataset_stat}
	\begin{center}
		\centering
		\catcode`\-=12
		\begin{tabular}{|l|c|c|}
			\hline
		    \multicolumn{1}{|c|}{\textbf{Typ dotazu}} & \multicolumn{1}{c|}{\textbf{Počet unikátních dotazů}} & \textbf{Počet dotazů s~četností} \\ \hline
            Časový dotaz & 12 912 & 18 713 \\ \hline
            Klasický dotaz & 461 645 & 784 088 \\ \hline
		\end{tabular}
	\end{center}
\end{table}

Celkově dataset obsahuje 474 557 dotazů, v~případě započítání četnosti dotazů, dataset obsahuje 802 801 dotazů.


\subsection{Příprava datasetu pro strojové učení}
\label{ml_dataset}
% "has_time\tquery\ttokens\tweight\tannotations\ttimestamp\n"
Příprava datasetu spočívá ve spojení všech anotovaných datasetů s~datasety bez anotací v~jeden ucelený dataset. Jednotlivé datasety jsou uloženy ve formátu JSON, další zpracování však pracuje s~daty ve formát CSV\footnote{CSV -- Comma separated values. Jedná se o~strukturovaný formát dat, kdy v~rámci jednoho souboru je použit pouze jeden typ oddělovače. Zpravidla se jedná buď o~čárku nebo tabulátor.}. Proto bylo nutné spojený výsledný dataset přetransformovat do tohoto formátu.

Může se stát, že dotaz je v~datasetech zastoupen více než jednou -- tato situace nastává v~případě, že je dotaz v~anotovaném datasetu a zároveň je také v~neanotovaném datasetu. V~takové situaci bylo nutné zvolit logiku, která by tyto duplicity odstranila a ponechala pouze variantu s~anotací. 

Tato kolize je způsobena dodatečným provedením anotací. Je běžné, že se v~neanotovaném datasetu nalezne jistý případ formátu časové entity, který by měl být také pokryt. Dojde tedy k~provedení anotací a poté nastává tento duplicitní stav.

Preference dotazu s~anotací v~případě duplicit je zřejmá. Duplicitní dotaz je v~původním datasetu ponechán z~důvodu usnadnění práce s~datasety. Ruční úpravy datasetu mohou být prostorem ke vzniku nekonzistence v~datech.

\newpage
\subsubsection{Dataset ve formátu CSV}
K~dalšímu zpracování byly zvoleny následující datové entity, které budou uloženy v~datasetu ve formátu CSV. Jednotlivé sloupce jsou od sebe odděleny tabulátorem\footnote{\textttt{<TAB>} -- ASCII znak \texttt{0x09}.}. Pro přehlednost je také v~CSV souboru umístěna hlavička, která popisuje jednotlivé sloupce.

Následující tabulka popisuje sloupce ve sloučeném datasetu:

\begin{table}[h]
	\captionsetup{width=1.0\linewidth}
	\caption{Popis CSV datasetu.}
	\label{tab:dataset_stat}
	\begin{center}
		\centering
		\catcode`\-=12
		\begin{tabular}{|l|l|}
			\hline
		    \multicolumn{1}{|c|}{\textbf{Název sloupce}} & \multicolumn{1}{c|}{\textbf{Popis}} \\ \hline
            \texttt{has\_time} & Predikát zda dotaz obsahuje časovou entitu\\ \hline
            \texttt{query} & Samotný dotaz \\ \hline
            \texttt{tokens} & Tokeny dotazu \\ \hline
            \texttt{weight} & Četnost dotazu v~datasetu \\ \hline
            \texttt{annotations} & Anotace dotazu \\ \hline
            \texttt{timestamp} & Časová značka, kdy byl dotaz položen \\ \hline
		\end{tabular}
	\end{center}
\end{table}

Anotace dotazu je v~tomto případě provedena na základě tokenů -- každý token obsahuje anotaci o~tom, jestli je součástí časové entity v~dotazu. 

% \vspace{3mm}
\noindent Příklady anotací: 



\begin{table}[h]
	\captionsetup{width=1.0\linewidth}
		\catcode`\-=12
		\hspace*{2.0cm}
		\begin{tabular}{l | l }
		    Původní dotaz & \texttt{zbiroh 2020}  \\
		    Tokeny dotazu & \texttt{["zbiroh"{}, "{ }"{}, "2020"{}]} \\
		    Anotace tokenů & \texttt{[false, false, true]} \\
		\end{tabular}
\end{table}

\begin{table}[h]
	\captionsetup{width=1.0\linewidth}
		\catcode`\-=12
		\hspace*{2.0cm}
		\begin{tabular}{l | l  }
		    Původní dotaz &  \texttt{výloha cz} \\
		    Tokeny dotazu &  \texttt{["výloha"{}, "{ }"{}, "cz"{}]} \\
		    Anotace tokenů & \texttt{[false, false, false]} \\

		\end{tabular}
\end{table}

\begin{table}[h!]
	\captionsetup{width=1.0\linewidth}
		\catcode`\-=12
		\hspace*{2.0cm}
		\begin{tabular}{l | l  }
		    Původní dotaz &  \texttt{počasí od pondělí} \\
		    Tokeny dotazu &  \texttt{["počasí", "{ }"{}, "od", "{ }"{}, "pondělí"]} \\
		    Anotace tokenů & \texttt{[false, false, true, true, true]} \\

		\end{tabular}
\end{table}

\newpage
\section{Aktuální stav detekce časových entit}
\label{actual_state}
Aktuální nástroj pro detekci časových entit obsahuje veškerou funkcionalitu, která byla požadována při jeho implementaci. Princip detekce je postaven na konečném automatu\footnote{Anglicky finite state machine. Více \href{https://gamedevelopment.tutsplus.com/tutorials/finite-state-machines-theory-and-implementation--gamedev-11867}{zde}.}, kdy stavy konečného automatu představují určité fáze zpracování časových tokenů. Stavy konečného automatu provádějí vyhodnocení o~jaký token se jedná a případně modifikují vnitřní reprezentaci časové entity. Konečný automat obsahuje celkem 44 stavů. V~počátečním stavu se provádí prvotní vyhodnocení o~jaký token se~jedná. Z~počátečního stavu je tedy možný přechod do jednoho z~16 následujících stavů. Při~průchodu konečným automatem se zaznamenávají detekované tokeny do bitové masky, která představuje kontext. Při průběhu zpracování časové entity může nastat stav, že token není aktuálním stavem přijímán (např. jedná se o~nevalidní token). V~takovém případě probíhá uložení aktuální časové entity a konečný automat přechází do počátečního stavu, kdy na vstupu je právě nepřijatý token a probíhá vytváření nové časové entity -- lze tedy přijmout pouze částečně validní časovou entitu. 

\subsection{Princip zpracování časové entity}
Zpracování jedné časové entity je provedeno průchodem konečného automatu z~počátečního stavu až do stavu koncového. V~každém relevantním stavu pro časovou entitu je~nastavována bitová maska, která slouží jako záznam průchodu konečným automatem, což představuje i kontext pro aktuální stav konečného automatu. Ve stavu je provedena také analýza aktuálního tokenu a dále jsou provedeny další kroky -- modifikace vnitřní reprezentace časové entity a nastavení následujícího stavu. Některé časové tokeny jsou zpracovávány ve více stavech, ale v~rozdílném kontextu. 


\subsection{Možnosti rozšíření nástroje} Rozšíření nástroje o~detekci dalších časových entit jsou omezené, zejména časově náročné a mohou být poteciálním zdrojem případných chyb. 

Omezená rozšířitelnost nástroje je dána použitým konečným automatem, kde v~případě přidání zpracování další časové entity je nutné provést editaci zdrojového kódu na více místech -- je nutné provést změny více stavů konečného automatu, které by měly zpracovávat novou časovou entitu. 

Dále je potřeba upravit logiku v~případě, že daný token není v~některém stavu přijímán. Případně přidat nové stavy, pokud by aktuální stavy nevyhovovaly zpracování nové časové entity. Takovou úpravou je možné narušit funkcionalitu zbylých částí konečného automatu a případně opomenout užití časové entity v~nějakém kontextu.

Jako značné omezení možnosti rozšíření je zde postupné nebo úplné nepřijmutí nevalidních tokenů, kdy konečný automat přechází zpátky do počátečního stavu a analýza tokenů probíhá znovu od začátku. 

Časová náročnost úpravy je zde hodnocena z~hlediska pochopení funkcionality původního zdrojového kódu a získání povědomí o~tom, jakým stylem je možné provádět úpravy v~původním zdrojovém kódu. A~následným vyhodnocením, jestli je chtěné rozšíření v~mezích původního zdrojového kódu vůbec proveditelné a~případně, o~jak velké zásahy by se jednalo.

Takto provedené úpravy je nutné opatřit testy pro prokázání správnosti detekce. Zde je kladen důraz na pokrytí testů v~případě původních detekcí časových entit, aby bylo prokázané, že nová funkcionalita nenaruší fungování stávajících detekcí.




\newpage
\section{Návrh nástroje pro detekci časových entit}
Hlavní důraz při návrhu nového nástroje je kladen na vyvarování se nedostatkům, které se v~průběhu let objevily u~aktuálního nástroje. 

Z~popisu aktuálního nástroje pro detekci časových entit můžeme vyhodnotit, že hlavními nedostatky aktuálního řešení jsou možnosti snadného rozšíření nástroje o~detekci dalších časových entit a zpracování časové entity v~rámci různých kontextů. Další komplikací při rozšiřování je neintuitivní vypořádání se s~nevalidními tokeny, které činí složitější celý průběh detekce.

Návrh nového nástroje by měl zejména počítat se snadnou rozšířitelností nástroje o~další detekci časových entit při zachování kvality detekce stávajících variant časových entit. Nový nástroj by měl také brát v~potaz kontext celého dotazu a~s~tím odstínit i~případné falešně pozitivní případy detekce.

Zpracování jednotlivých časových enit by se mělo provádět odděleně, aby bylo možné takové zpracování lehce otestovat a vyhodnotit jeho přesnost a pokrytí. Tímto přístupem by však nemělo dojít k~omezení možností snadného rozšíření již implementovaných zpracování časových entit.

\vspace{3mm}
\nointent Zde jsou shrnuty požadavky na nový nástroj pro detekci časových entit:
\begin{itemize}
    \item Snadná rozšířitelnost.
    \item Snadná udržitelnost.
    \item Možnost testovat jednotlivé detekce časových entit odděleně.
    \item Kontextové porozumění dotazu.
\end{itemize}

\subsection{Kontextové porozumění dotazu}
Jak již bylo uvedeno v~sekci o~časové entitě (\ref{time_entity}), tak nelze jednoduchými pravidly vyhodnotit, zda dotaz obsahuje časovou entitu. Zde se přímo nabízí využití strojově učeného modelu pro vyhodnocení časových entit uvnitř dotazu. Vyhodnocení časové entity je zde bráno jako klasifikace jednotlivých tokenů dotazu. Jedná se o~binární klasifikaci, kdy je pro každý token provedena predikce, zda je součástí časové entity. 

\newpage
\subsubsection{Model Electra}
Model je postaven na předtrénovaném modelu \textit{Small-E-Czech}, který je naučený na~český jazyk. V~rámci \textit{fine-tuning} fáze byl model doučen na datasetu, který byl vytvořen pro detekci časových entit (popsáno v~\ref{ml_dataset}).

Aby bylo dosaženo, co největší pokrytí modelu, tak použitý dataset byl rozdělen pouze na dvě části, a~to na část trénovací a testovací. Validační část datasetu tak byla vynechána. Dataset byl rozdělen tak, aby trénovací množina obsahovala větší počet dotazů oproti množině testovací. Trénovací dataset je tedy složen ze $\frac{3}{4}$ celkového počtu všech dotazů. Testovací dataset je složen z~$\frac{1}{4}$ dotazů z~celkového počtu dotazů.


K~učení modelu byl využit framework Transformers \cite{web:transformers_trainer}, kdy k učení modelu byly využity 4 epochy -- zde je jistý prostor pro experimentaci, neboť by mohlo být možné dosáhnout podobné kvality modelu i v~případě nižšího počtu epoch. Vyhodnocení modelu proběhlo na obou částech datasetu.


% \newpage
\subsubsection{Vyhodnocení modelu}
Pro získání většího přehledu o~modelu byl model vyhodnocen i na trénovacím datasetu. V~takovém případě lze očekávat velmi kvalitní výsledky všech metrik (tabulka \ref{tab:confusion_matrix_train}). Je zřejmé, že metriky v~případě vyhodnocení na trénovací množině nebudou směrodatné, ale dávají nám jistý vhled do kvality modelu.

Vyhodnocení modelu na testovacím datasetu má mnohem vyšší informační hodnotu o~kvalitě modelu (tabulka \ref{tab:confusion_matrix_test}). 

% \newpage
\obr{Graf ztrátové funkce v průběhu učení modelu.}{fig:loss_function}{1.0}{images/loss_function_graph.png}

% Jak lze z grafu ztrátové funkce vyčíst, tak model dosáhl kvalitních predikcí už po prvním průchodu celým datasetem -- 1 epocha.


\begin{table}[h!]
	\captionsetup{width=1.0\linewidth}
	\caption{Konfúzní matice modelu -- trénovací dataset.}
	\label{tab:confusion_matrix_train}
	\renewcommand{\arraystretch}{2.5}
	\begin{center}
		\centering
		\catcode`\-=12
		\begin{tabular}{|c|c|c|}
			\hline
            Trénovací dataset & \multicolumn{2}{|c|}{Predikované hodnoty} \\
            \hline
            \multirow{2}{4em}{Skutečné hodnoty} & 13 933 & 256 \\ \cline{2-3}
            & 61 & 587 850 \\
            \hline
		\end{tabular}
	\end{center}
\end{table}

\begin{table}[h!]
	\captionsetup{width=1.0\linewidth}
	\caption{Konfúzní matice modelu -- testovací dataset.}
	\label{tab:confusion_matrix_test}
	\renewcommand{\arraystretch}{2.5}
	\begin{center}
		\centering
		\catcode`\-=12
		\begin{tabular}{|c|c|c|}
			\hline
            Testovací dataset & \multicolumn{2}{|c|}{Predikované hodnoty} \\
            \hline
            \multirow{2}{4em}{Skutečné hodnoty} & 4 484 & 198 \\ \cline{2-3}
            & 76 & 195 943 \\
            \hline
		\end{tabular}
	\end{center}
\end{table}


\begin{table}[h!]
	\captionsetup{width=1.0\linewidth}
	\caption{Srovnání metrik -- trénovací a testovací dataset.}
	\label{tab:metrics_compare}
	\begin{center}
		\catcode`\-=12
		\begin{tabular}{l | l  | l | l  }
		    \textbf{Typ datasetu} & \textbf{Přesnost} & \textbf{Pokrytí} & \textbf{F1--score} \\ \hline
		    Trénovací & 98,2\% & 99,6\% & 98,9\% \\ \hline
		    Testovací & 95,8\% & 98,3\% & 97,0\% \\
		\end{tabular}
	\end{center}
\end{table}

\noindent Jak je ze~srovnání metrik (tabulka \ref{tab:metrics_compare})  a z~konfúzních matic (tabulka \ref{tab:confusion_matrix_train} a~tabulka~\ref{tab:confusion_matrix_test}) zřejmé, tak model je naučen velmi dobře. U~falešně pozivních a falešně negativních dotazů je nutno podotknout, že skript provádějící vyhodnocení kvality modelu porovnává predikce modelu s~očekávanými hodnotami a~je v~tomto případě striktní. To znamená, že za správnou klasifikaci je považována pouze ta, jejíž predikované časové tokeny se shodují s~časovými tokeny z~anotací. Falešně pozitivní a falešně negativní tokeny jsou pak vyhodnoceny, jestli model predikoval více či méně časových tokenů. 

\clearpage
\subsubsection{Kvantizace modelu}
Pro další práci s~modelem a jeho budoucí produkční využítí musel být tento model převeden do ONNX formátu. Při tomto převodu se provedla také částečná kvantizace modelu. U~modelu byla zvolená částečná kvantizace z~důvodu zachování vyšší kvality modelu při zvýšení rychlosti vyhodnocení predikce. Úroveň kvantizace je odstupňována podle toho kolik vrstev neuronové sítě je vynecháno z~procesu kvantizace.

\begin{table}[h]
	\captionsetup{width=1.0\linewidth}
	\caption{Porovnání kvality modelů po kvantizaci.}
	\label{tab:model_quantization_cmp}
% 	\renewcommand{\arraystretch}{2}
	\begin{center}
		\centering
		\catcode`\-=12
		\begin{tabular}{l | l  | l | l  }
			\textbf{Typ modelu} & \textbf{Přesnost} & \textbf{Pokrytí} & \textbf{F1--score} \\ \hline
			FP32 & 95,8 \% & 98,3 \% & 97,0 \% \\
			UINT8 & 94.6 \% & 98.4 \% & 96.5 \% \\
			
            \hline
		\end{tabular}
	\end{center}
\end{table}

V~případě použití kompletní kvantizace je snížení F--1 score o~0,5 \%, což není až tak velký pokles, ale pokud je cílem dosáhnout co nejvyšší kvality modelu, tak jde o~citelný pokles. Běžně však můžeme očekávat mnohem vyšší pokles kvality modelu při kompletní kvantizaci. 

\begin{table}[h]
	\captionsetup{width=1.0\linewidth}
	\caption{Metriky částečně kvantizovaného modelu.}
	\label{tab:model_quantization_list}
	\begin{center}
		\centering
		\catcode`\-=12
		\begin{tabular}{l | c  | c | c  }
			\textbf{Úroveň kvantizace} & \textbf{Přesnost} & \textbf{Pokrytí} & \textbf{F1--score} \\ \hline
			Kompletní kvantizace & 94,6\% & 98,4\% & 96,5\% \\
			Bez kvantizace výstupu  1. vrstvy & 94.7\% & 98.7\% & 96.6\% \\
            Bez kvantizace výstupu  2. vrstvy & 94.8\% & 98.4\% & 96.6\% \\
            Bez kvantizace výstupu  3. vrstvy & 94.4\% & 98.5\% & 96,4\% \\
            Bez kvantizace výstupu  4. vrstvy & 94.5\% & 98.5\% & 96.5\% \\
            Bez kvantizace výstupu  5. vrstvy & 94.8\% & 98.6\% & 96.7\% \\
            Bez kvantizace výstupu  6. vrstvy & 94.8\% & 98.6\% & 96.7\% \\
            Bez kvantizace výstupu  7. vrstvy & 94.9\% & 98.6\% & 96.7\% \\
            Bez kvantizace výstupu  8. vrstvy & 94.9\% & 98.6\% & 96.7\% \\
            Bez kvantizace výstupu  9. vrstvy & 94.9\% & 98.6\% & 96.7\% \\
            Bez kvantizace výstupu  10. vrstvy & 94.9\% & 98.6\% & 96.7\% \\
            Bez kvantizace výstupu  11. vrstvy & 94.9\% & 98.6\% & 96.7\% \\
            \hline
		\end{tabular}
	\end{center}
\end{table}

% \newpage
Pomocí tabulky \ref{tab:model_quantization_list} můžeme zvolit úroveň kvantizace, která ještě stále zachovává dostatečnou míru kvality všech sledovaných metrik. V~tomto případě byl pro další použítí zvolen model, který nebyl kvantizován až do výstupu z~8. vrstvy.

\begin{table}[htb]
	\captionsetup{width=1.0\linewidth}
	\caption{Konfúzní matice zvoleného modelu -- testovací dataset.}
	\label{tab:confusion_matrix_test_quantized}
	\renewcommand{\arraystretch}{2.5}
	\begin{center}
		\centering
		\catcode`\-=12
		\begin{tabular}{|c|c|c|}
			\hline
            Testovací dataset & \multicolumn{2}{|c|}{Predikované hodnoty} \\
            \hline
            \multirow{2}{4em}{Skutečné hodnoty} & 4 483 & 242 \\ \cline{2-3}
            & 65 & 195 911 \\
            \hline
		\end{tabular}
	\end{center}
\end{table}

\newpage
\subsection{Detekce časových entit}
\label{time_entity_detection}
Detekce časových entit je prováděna pomocí regulárních výrazů. Regulární výrazy byly zvoleny proto, že umožňují jednoduše a přehledně definovat jednotlivé varianty časové entity. Pro snadnější práci s~regulárními výrazy byla nad nimi provedena abstrakce. Regulární výrazy pro jeden typ časové entity jsou umístěny v~jedné třídě. Tato třída provádí detekci a následné zpracování časové entity (vytvoření metadat). Takovým návrhem je dosaženo oddělení jednotlivých časových entit a nedochází k~vzájemnému ovlivnění  při zpracování. Dále bude třída obsahující regulární výrazy pro detekci časové entity nazývána jako třída \textit{Matcher}.

Třída \textit{Matcher} představuje jednu variantu časové entity, kterou je možné detekovat. Uvnitř třídy je definováno \textit{1} až \textit{N} regulárních výrazů, které jsou následně sestaveny do~jednoho regulárního výrazu. Takto vytvořený regulární výraz je pak aplikován na dotaz, v~případě přijmutí dotazu regulárním výrazem je vytvořená příslušná časová entita. Pokud je při vytváření časové entity potřeba i číselná hodnota, která se vyskytuje v~dotazu, tak je tato získána pomocí pojmenovaného zapamatování uvnitř regulárního výrazu. Například detekce časové entity v~podobě dne v~týdnu je provedena pomocí jedné třídy \textit{Matcher}, která obsahuje dny v~týdnu v~podobě regulárních výrazů -- základní tvar a jeho možné varianty, které jsou alternovány. Následné vytvoření časové entity spočívá v~tom, že se zjišťuje, který den v~týdnu byl detekován.

Pokud se vyhledává časová entita, která obsahuje i číslo, tak je toto číslo následně i~validováno, zda je v~daném kontextu použito správně.

Pro detekci komplexních časových entit je navržena další třída, která zapouzdřuje třídy \textit{Matcher}. Třída zapouzdřující další  \textit{Matchery} je pojmenována jako třída \textit{MultiMatcher}.
Tento návrh usnadňuje sestavení komplexní detekce ze základních detekcí.

\newpage
\noindent Pod komplexní  časovou entitou si můžeme představit následující časové entity:
\begin{itemize}
    \item Časová entita s~předložkou, která modifikuje časový interval. Časový interval definovaný časovou enitou "od pondělí"{} bude pouze zleva ohraničený (od pondělí do nekonečna).
    
    \item Časová entita složená z~více časových entit, například "březen 2020"{} -- časová entita se skládá ze dvou časových entit (z~měsíce a roku).
\end{itemize}

Při detekci komplexní časové entity je dotaz zpracován každou třídou \textit{Matcher}, která je umístěna v~\textit{MultiMatcher} třídě. Takto jsou aplikovány na dotaz všechny regulární výrazy, to má za následek, že časová entita je vlastně složena z~více výsledků třídy \textit{Matcher}.

Je zřejmé, že pokud jsou použity jak třídy \textit{Matcher} a \textit{MultiMatcher} v~rámci jedné detekce, tak může dojít k~vícenásobné detekci stejných časových entit, ale pokaždé v~jiném kontextu (nalezení jednoduché časové entity, která je součástí komplexní časové entity), proto je nutné tyto výsledky seřadit na základě pokrytí (časových) tokenů. Řazení výsledků je provedeno sestupně (od největšího pokrytí po nejmenší pokrytí), aby byla usnadněna další práce s~výsledky při vyhodnocení kontextové detekce. 

% \newpage
\subsection{Kontextová detekce časových entit}
Aby bylo možné provádět kontextovou detekci časových entit, tak je nutné provést kontextové vyhodnocení dotazu pomocí modelu Electra a detekovat časové tokeny, kterým je přiřazen časový údaj. Následně je potřeba provést celkové vyhodnocení detekce a~vytvoření výstupu nástroje.

\noindent Pořadí provádění jednotlivých kroků:
\begin{enumerate}
    \item Bezkontextová detekce časových tokenů a vytvoření časové entity.
    \item Kontextová analýza dotazu.
    \item Vyhodnocení detekce.
\end{enumerate}

Takto zvolené pořadí vyhodnocení analýz je zejména proto, že vyhodnocení modelu je časově řádově pomalejší než vyhodnocení regulárních výrazů (i v~případě velkého počtu regulárních výrazů). Pokud není regulárními výrazy detekována žádná časová entita, tak zbylé dva kroky nejsou provedeny.

Jestliže je výsledkem bezkontextové analýzy nějaká časová entita, tak je poté provedeno kontextové ověření, že se opravdu jedná o~tokeny reprezentující časovou entitu. Toto ověření spočívá v~tom, že jsou porovnány časové tokeny bezkontextové analýzy s~tokeny, které byly modelem Electra vyhodnoceny jako možné časové tokeny. Vyhodnocení je v~tomto případě striktní -- musí se shodovat časové tokeny bezkontextové analýzy s~predikovanými tokeny modelu Electra. Takové vyhodnocení bylo zvoleno záměrně, aby nenastala situace, že je výsledkem bezkontextové analýzy pouze část z~celkového počtu časových tokenů a nebo naopak.

Pořadí provádění analýzy dotazu je užitečné hlavně z~pohledu optimalizace, ale~mohlo by být omezující v~případě, že by kontextové vyhodnocení dotazu na svém výstupu nedodávalo jen predikce časových tokenů, ale další informace, které by následně mohly být použity v~případě bezkontextové detekce. Takovou informací může být například predikce typu časové entity. Například zařazení časové entity do určité třídy -- jestli časová entita představuje rok, měsíc, den a podobně.

\subsection{Možnosti budoucího vývoje}
Nástroj lze v~budoucnu rozvíjet v~těchto oblastech:
\begin{itemize}
    \item \textbf{Bezkontextová analýza} -- Zde mohou být provedeny optimalizace z~pohledu regulárních výrazů -- použití pokročilých konstruktů, optimalizace alternací na základě stejného prefixu u~více slov. Mohou být také doplněny další typy detekovaných časových entit. Jistou možností optimalizace by také mohla být paralelizace vyhodnocování skupiny regulárních výrazů, čímž by se mohlo dosáhnout snížení doby potřebné k~vyhodnocení všech regulárních výrazů. Dalším prostorem ke zlepšení jsou \textit{MutliMatchery} pro vytváření komplexních časových entit, které mohou být v~aktuální verzi možným zdrojem chyb, neboť zde neprobíhá žádné ověření jaký počet tříd \textit{Matcher} je uvnitř obsažen a mohlo by zde snadno dojít ke čtení za hranicemi pole, ve kterém jsou \textit{Matchery} uloženy.
    \item \textbf{Kontextová analýza} -- Tato oblast nabízí více možností. Pro učení modelu mohou být dodány další data -- tím lze dosáhnout většího pokrytí všech případů časových entit. Dále je možné experimentovat se samotným učením modelu, kdy lze měnit různé parametry související s~procesem učení. Následně je možné měnit parametry kvantizace modelu, kdy by mohlo dojít k~nalezení ideálního poměru mezi rychlostí inference a kvalitou modelu.
\end{itemize}

\newpage
\section{Vyhodnocení výsledků}
\label{compare_results}
Pro vyhodnocení kvality nástroje detekce časových entit je relevantní metrika pokrytí jednotlivých variant časových entit, přesnost a správnost vytvořené časové entity. Další~vyhodnocovaná metrika, vycházející z~použití nástroje v~praxi, je metrika latence, která určuje potřebnou dobu ke zpracování dotazu.



\paragraph{Metrika kvality detekce časových entit}
Vyhodnocení bylo provedeno na interním datasetu, který je přímo určený na vyhodnocení metrik kvality detekce času. Tento dataset obsahuje dostatečně velkou množinu všech typů časových entit, které mají být v~současnosti detekovány.

Interní dataset celkově obsahuje 19 419 unikátních dotazů, kdy rozdělení dotazů je~uvedeno v tabulce \ref{tab:dataset_validation}.
\begin{table}[h]
	\captionsetup{width=1.0\linewidth}
	\caption{Statistika validačního datasetu.}
	\label{tab:dataset_validation}
	\begin{center}
		\centering
		\catcode`\-=12
		\begin{tabular}{|l|c|}
			\hline
		    \multicolumn{1}{|c|}{\textbf{Typ dotazu}} & \multicolumn{1}{c|}{\textbf{Počet dotazů}} \\ \hline
            Časový dotaz & 430 \\ \hline
            Klasický dotaz & 18989 \\ \hline
		\end{tabular}
	\end{center}
\end{table}

\begin{table}[h]
	\captionsetup{width=1.0\linewidth}
	\caption{Metriky detekce časových entit -- původní nástroj.}
	\label{tab:metrics_old}
	\begin{center}
		\centering
		\catcode`\-=12
		\begin{tabular}{ c  | c | c  }
			\textbf{Přesnost} & \textbf{Správnost} & \textbf{Pokrytí}\\ \hline
            77,8 \% & 99,1 \% & 72,3 \%
            % \hline
		\end{tabular}
	\end{center}
\end{table}

\begin{table}[h]
	\captionsetup{width=1.0\linewidth}
	\caption{Metriky detekce časových entit -- nový nástroj.}
	\label{tab:metrics_new}
	\begin{center}
		\centering
		\catcode`\-=12
		\begin{tabular}{ c  | c | c  }
			\textbf{Přesnost} & \textbf{Správnost} & \textbf{Pokrytí}\\ \hline
            95,4 \% & 99,8 \% & 91,4 \%
            % \hline
		\end{tabular}
	\end{center}
\end{table}

Jak je z~metrik patrné, tak nástroj vypracovaný v~rámci této diplomové práce dosahuje mnohem lepších kvalit než původní nástroj. To je dáno tím, že do nástroje byly implementovány i takové typy časových entit, které nebylo možné v~původním nástroji z~důvodu složitosti provedení implementovat.

\newpage
\paragraph{Latence}
Další důležitou metrikou v~případě zpracování dotazu je doba, za kterou je provedena detekce časových entit. Měření metriky je velmi závislé na použitém hardwaru, zejména na typu procesoru, zda procesor podporuje či nepodporuje instrukční sadu pro práci s~neuronovými sítěmi.


Metrika latence je zde uváděna dvojího druhu: 
\begin{itemize}
    \item Průměrná latence -- Jedná se o~průměrnou dobu zpracování dotazu. Metrika~je~počítána z~celkového počtu zpracovaných dotazů.
    \item Kvantil $Q_{0.99}$ -- Určuje, že 99 \% všech dotazů bylo zpracováno za kratší dobu. 
\end{itemize}


\begin{table}[h]
	\captionsetup{width=1.0\linewidth}
	\caption{Latence -- původní nástroj.}
	\label{tab:latence_old}
	\begin{center}
		\centering
		\catcode`\-=12
		\begin{tabular}{ l  | c   }
			\textbf{Typ latence} & \textbf{Doba zpracování[ms]}\\ \hline
            Průměr & 0,116 \\ 
            $Q_{0.99}$ & 1,070 
            % \hline
		\end{tabular}
	\end{center}
\end{table}

\begin{table}[h]
	\captionsetup{width=1.0\linewidth}
	\caption{Latence -- nový nástroj.}
	\label{tab:latence_new}
	\begin{center}
		\centering
		\catcode`\-=12
		\begin{tabular}{ l  | c   }
			\textbf{Typ latence} & \textbf{Doba zpracování[ms]}\\ \hline
            Průměr & \phantom{1}2,250 \\ 
            $Q_{0.99}$ & 19,800 
            % \hline
		\end{tabular}
	\end{center}
\end{table}

Jak je z~hodnot metrik patrné, tak latence nového nástroje je výrazně vyšší. Nárůst~latence u~nového nástroje je dán přístupem ke zpracování dotazu, kdy můžeme odhadnout, že vyhodnocení modelu může trvat přibližně více než 50 \% z~celkové doby zpracování dotazu. Zbylý nárůst latence je dán vyhodnocením regulárních výrazů. U~průměrné latence je nárůst o~1 939 \%, u~latence $Q_{0.99}$ je nárůst o~1 850 \%. Jistý~nárůst latence u~nového nástroje bude vždy, což je dáno využitím jazykového modelu a mnohem více komplexnější detekce časových entit. Je zde velký prostor pro optimalizace, které umožní snížit latenci.






\nn{Závěr}
Cílem diplomové práce bylo navrhnout a implementovat nástroj pro detekci časových entit s~využitím strojového učení, kdy strojové učení bylo využito pro klasifikaci časových tokenů v~dotazu. Výstupem nástroje jsou odpovídající metadata k~nalezené časové entitě. Pro kontextovou analýzu dotazu -- klasifikaci tokenů, se využívá neuronová síť Electra, která je určená pro zpracování přirozeného jazyka. Využitý model vycházel z~předtrénovaného modelu \textit{Small-E-Czech} od firmy Seznam.cz. V~rámci diplomové práce byl model doučen pro klasifikaci časových tokenů. Dataset pro učení a~dataset pro vyhodnocení byl získán od stejné firmy. 


Při návrhu nástroje byl kladen důraz zejména na jednoduchou rozšířitelnost funkcionality v~budoucnu -- přidání dalších typů časových entit, a také na snadnou údržbu již existujících detekcí. Implementace se snažila co nejvíce držet filozofie clean code\footnote{Čistý kód -- Metodika pro psaní čitelného kódu. Více zde \url{https://garywoodfine.com/what-is-clean-code/}}, aby zdrojový kód byl snadný na pochopení.

V~praxi bude nástroj součástí platformy pro zpracování vyhledávacího dotazu, kde~nahradí původní detekci časových entit, která je postavena na zpracování časové entity pomocí konečného automatu Původní nástroj patří do skupiny algoritmů typu "white box"{}, tedy plně interpretovatelných, nicméně jsou zde nedostatky řešení, které obsahují značně komplikovaný systém "navracení se"{} v~situaci, kdy časová entita obsahuje nevalidní tokeny. Tento nástroj se tak stává náročným na údržbu a možné rozšíření nástoje o~další typy časových entit je značně komplikované.

Navržený nástroj pro detekci časových entit patří do skupiny "black box"{} modelů strojového učení, ale umožnil oproti stávajícímu řešení dosáhnout značných zlepšení kvality detekce. Co se týče metrik detekce, tak přesnost se zlepšila o 17,6 \%, správnost o 0,7 \% a pokrytí o 19,1 \%. U průměrné latence byl však nárůst o 1 939 \%. Zvýšení latence je způsobeno komplexností nové detekce časových entit, kdy se pracuje také s kontextem dotazu, aby byly odhaleny případné falešně pozitivní detekce.


% Jistou nevýhodou je poměrně velké zvýšení latence, kdy u průměrné latence byl nárůst o 1 939 \%. Nárůst je způsobený mnohem komplexnějším vyhodnocováním časových entit oproti stávajícímu stavu.


Na nástroji bude v~budoucnu pokračovat vývoj, kdy budou přidány další typy časových entit do bezkontextové analýzy. Ve stejné oblasti bude také vylepšen způsob zápisu zpracování složitých časových entit. Dále proběhne optimalizace vyhodnocení regulárních výrazů. V~případě kontextové analýzy a obecně modelu, bude pokračovat výzkum a experimenty při učení modelu. 

% ============================================================================ %

