\chapter{Implementácia programu}

\label{kap:program} % id kapitoly pre prikaz ref

V tejto kapitole popíšeme ako sme využili knižnicu \cite{kniznicaPDF} na analýzu a interpretáciu textu zo vstupného súboru formátu PDF.

\section{Načítanie PDF súboru a extrakcia textu po znakoch}
Pri načítavaní využívame knižničné súbory \texttt{fontbox-3.0.4.jar} a \texttt{pdfbox-app-3.0.4.jar}. Načítavanie celého pdf súboru má na starosti trieda \texttt{GetRawTextFromPDF}, ktorá (ako už aj samotný jej názov hovorí) načíta text zo vstupného súboru \texttt{.pdf} po jednotlivých znakoch. V konštruktore tejto triedy sú nasledovné parametre:
\begin{itemize}
    \item Parameter \texttt{path} typu \texttt{String}, ktorý určuje odkiaľ sa súbor číta, resp. priamo súbor typu \texttt{File}.
    \item Parameter \texttt{pageFrom} typu \texttt{Integer}, ktorý určuje, od ktorej strany sa súbor číta. Tento parameter slúži na preskočenie obsahu a iného sprievodného textu, ktorý je pre analýzu v rámci tejto práce nežiadúci.
    \item Parameter \texttt{ignoreWords} typu \texttt{List<String>} (pole stringov), ktorý určuje, ktoré slovo (slová) sa majú preskočiť, pretože sú tiež pre pre analýzu v rámci tejto práce nežiadúce (ide napríklad o hlavičky a päty strán, teda názov diela/kapitoly, resp. o autora)
\end{itemize}

V konštruktore sa načíta súbor do objektu PDDocument, z ktorého sa následne pomocou triedy \texttt{PDFTextStripper} extrahuje text po jednotlivých znakoch. Do \texttt{PDFStripper}a sa ešte nastaví, odkiaľ sa má začať súbor čítať (preskočenie obsahu a iného sprievodného textu). Do premennej \texttt{text} typu \texttt{String} sa následne uloží celý extrahovaný text zo súboru.

Táto trieda obsahuje metódu \texttt{getText()}, ktorá vráti extrahovaný text (\texttt{String}) zo súboru bez nežiadúcich slov.

\section{Analýza získaného textu a rozobratie textu na jednotlivé tokeny}
Získaný text zo súboru (pomocou metódy \texttt{getText()}) sa následne analyzuje v triede \texttt{TypeSplitter}, ktorú si tu opíšeme. Táto trieda má v konštruktore ako argument text (\texttt{String}), ktorý sa bude analyzovať. Pre prechádzanie textu sme zvolili \texttt{StringBuilder}.
Budeme hľadať jednotlivé \emph{tokeny}, základné jednotky textu, ktoré budeme analyzovať. Budeme rozlišovať tieto tokeny:
\begin{itemize}
    \item \texttt{OTHER(0)} - ostatné znaky, ktoré nespadajú do žiadnej z nasledujúcich kategórií (napr. netypické symboly).
    \item \texttt{WORD(1)} - slová zložené z písmen (vrátane diakritiky).
    \item \texttt{NUMBER(2)} - číselné sekvencie (číslice).
    \item \texttt{SPACE(3)} - medzery, tabulátory a znaky nového riadku.
    \item \texttt{BRACKETS(4)} - zátvorky typu \uv{\texttt{()}}, \uv{\texttt{[]}}, \uv{\texttt{\{\}}} a pod.
    \item \texttt{COMMA(5)} - čiarka \uv{\texttt{,}}.
    \item \texttt{SEMICOLON(6)} - bodkočiarka \uv{\texttt{;}}.
    \item \texttt{DOT(7)} - bodka \uv{\texttt{.}}.
    \item \texttt{COLON(8)} - dvojbodka \uv{\texttt{:}}.
    \item \texttt{APOSTROPH(9)} - apostrof \uv{'} alebo jednoduchá úvodzovka \uv{\texttt{’}}.
    \item \texttt{QUOTATION\_MARK(10)} - úvodzovky (dvojité \texttt{\string"} alebo slovenské \texttt{„“}).
    \item \texttt{DASH(11)} - pomlčka alebo spojovník (napr. \uv{\texttt{-}}, \uv{\texttt{--}}).
    \item \texttt{ELLIPSIS(12)} - výpustka (tri bodky \uv{\texttt{...}} alebo ekvivalent).
    \item \texttt{EXCLAMATION\_MARK(13)} - výkričník \uv{\texttt{!}}.
    \item \texttt{QUESTION\_MARK(14)} - otáznik \uv{\texttt{?}}.
\end{itemize}
Tieto tokeny sú reprezentované pomocou enum (vymenovanie možností) triedy \texttt{TokenType}.
Tokeny sa vytvárajú nasledovným spôsobom (s využitím triedy \texttt{CreateToken}): postupne sa prechádza celý text a podľa jednotlivých znakov sa vytvárajú tokeny. Napríklad ak sa narazí na písmeno, začne sa vytvárať token typu \texttt{WORD}, ktorý bude obsahovať všetky nasledujúce písmená, až kým sa nenarazí na znak, ktorý už nie je písmenom (napr. medzera alebo interpunkčný znak). Podobne sa postupuje pre ostatné typy tokenov.

V triede \texttt{TypeSplitter} sa ukladajú 2 štatistiky:
\begin{itemize}
    \item Počet výskytov jednotlivých tokenov, ktoré sú uložené v zozname \texttt{List<Integer> tokenTypesCount}, kde index zodpovedá hodnote enum triedy \texttt{TokenType}.
    \item Počet výskytov jednotlivých slov, ktoré sú uložené v mape \texttt{Map<String, Integer> wordCount}.
\end{itemize}

Ďalšie trieda, ktorú využívame na analýzu viet ako celkov je trieda \texttt{Sentence}. Táto trieda má v konštruktore ako argument zoznam tokenov (typu \texttt{List<Token>}), ktoré sa budú analyzovať a poradie v texte (id) typu \texttt{Integer}. Táto trieda obsahuje celkový počet tokenov ako aj počet interpunkčných tokenov. V tejto triede je ďalej naprogramovaný aj komparátor na zoraďovanie viet podľa ich dĺžky (počtu tokenov vo vete), ak je zhoda tak podľa počtu interpunkčných tokenov vo vete.

\section{Vyrábanie potrebných štruktúr}
Trieda \texttt{TypeSplitter} poskytuje nasledovné metódy:
\begin{itemize}

    \item Metódu \texttt{printTokensCountSorted()}, ktorá vráti mapu so tokenmi a ich počtom výskytov, zoradenú podľa počtu výskytov zostupne.
    \item Metódu \texttt{printWhiteTokensCountSorted()}, ktorá vráti mapu so bielymi\footnote{Medzery, tabulátory, znaky nového riadku, ... ak ich nasleduje viac za sebou, tak sa spoja do jedného tokenu} tokenmi a ich počtom výskytov, zoradenú podľa počtu výskytov zostupne.
    \item Metódu \texttt{printTokensTypesCountSorted()}, ktorá vráti mapu so výskytmi jednotlivých typov tokenov, zoradenú podľa počtu výskytov zostupne.
    \item Metódu \texttt{printNeighborCountSortedByValue()}, ktorá vráti mapu s dvojicami slov a s počtom výskytov týchto dvojíc, zoradenú podľa počtu výskytov zostupne. Táto metóda teda slúži na analýzu opakovania postupnosti istých slov, napr. po akom slove sa používa slovo \uv{and}, resp. čo nasleduje po ňom. Metóda ako parameter očakáva zoznam tokenov (slov) z pôvodného textu, ktoré sa majú analyzovať.
    \item Metódu \texttt{printSentenceStatistic()}, ktorá vráti štatistiky o jednotlivých vetách. Vety sú zoradené zostupne podľa ich dĺžky (počtu slov (tokenov) vo vete), ak je zhoda tak ktorá veta má menej interpunkčných tokenov.
\end{itemize}

\section{Interpretácia (grafových) štruktúr}
V priečinku \texttt{litertúra} sa nachádzajú podpriečinky podľa autorov, v nich sú podpriečinky podľa diel a v podpriečinkoch diel sa nachádzajú konečné podpriečinky podľa jazykov, v ktorých sú diela napísané. V týchto podpriečinkoch sa nachádzajú samotné \texttt{PDF} súbory s textami diel a súbory \texttt{.txt} ktoré vytvorí program, ktorý spustíme na danom \texttt{PDF} súbore. Cesta k samotnému priečinku s dielom a jeho analýzov má teda tvar: \uv{\texttt{/literatura/<autor>/<dielo>/<jazyk>/<dielo v .PDF a súbory, ktoré vygeneroval program>}}. Pri každom diele sa vygenerujú 4 súbory, ktoré budeme neskôr využívať pri analýze:
\begin{itemize}
    \item \texttt{<jazyk>\_sentences.txt} - údaje o dĺžke jednotlivých viet.
    \item \texttt{<jazyk>\_tokenCount.txt} - počet výskytov jednotlivých tokenov.
    \item \texttt{<jazyk>\_tokenCountWhite.txt} - počet výskytov jednotlivých bielych tokenov.
    \item \texttt{<jazyk>\_tokenTypesCount.txt} - počet výskytov jednotlivých typov tokenov.
    \item \texttt{<jazyk>\_tokenNeighbors.txt} - počet výskytov jednotlivých dvojíc slov (susedov).
\end{itemize}

\section{Vizualizácia dát pomocou knižnice XChart}
Na vizualizáciu získaných štatistík z analýzy textov využívame knižnicu \cite{kniznicaGrafov}. Táto knižnica poskytuje jednoduchý a flexibilný spôsob tvorby rôznych typov grafov a diagramov bez potreby zložitej konfigurácie.

V našej implementácii sme knižnicu XChart využili na grafické znázornenie počtu výskytov prvých 50 slov (tokenov) podľa ich frekvencie, ako aj na zobrazenie ďalších štatistík získaných z analýzy textov. Konkrétne sme vytvorili nasledujúce typy grafov:
\begin{itemize}
    \item Stĺpcové grafy znázorňujúce počet výskytov jednotlivých tokenov a ich typov.
\end{itemize}

Tieto grafy sú generované ako obrázkové súbory formátu \texttt{.png} a ukládané do príslušných adresárov diel pre ďalšiu analýzu a porovnávanie textov z rôznych autorov a jazykov.

\section{Skúmanie susednosti grafov pomocou knižnice Gephi}

Na skúmanie a analýzu grafov susedností sme využili grafickú knižnicu Gephi \cite{gephi}, ktorá je určená na vizualizáciu a analýzu veľkých sietí a grafov. Gephi poskytuje množstvo nástrojov na prácu s grafmi, vrátane rôznych algoritmov na analýzu štruktúry grafov, vizualizačných techník a možností exportu výsledkov.