REszta zrobiona. Robiny jest anotator.

This commit is contained in:
siulkilulki 2018-06-17 18:54:39 +02:00
parent ae41d0ccb7
commit e0e7165f83
3 changed files with 112 additions and 53 deletions

View File

@ -1 +1 @@
<mxfile userAgent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36" version="8.7.6" editor="www.draw.io" type="device"><diagram id="625b897b-bc36-6d92-01ce-cd687e325a73" name="Page-1">7Vldj9soFP01kboPiWyDvx4n02b6sLuqNKq6fSSY2KjYuJiMk/n1CzGOP0imSZpO06rzkIELBnzO4V64noD7fPMgUJn9wxPCJp6TbCbg7cTzXBiG6p+2bBtLGAaNIRU0MZ06wyN9JsboGOuaJqQadJScM0nLoRHzoiBYDmxICF4Pu604G85aopRYhkeMmG39RBOZNdbIdzr7e0LTrJ3ZdUzLEuEvqeDrwsw38cBq99c056gdy/SvMpTwumcC7ybgXnAum1K+uSdMY9vC1jy3ONK6X7cghTzlAa954AmxtXl1lAhSbZVtLVgzFFpRalYrty1Cu3ckehRnAuZ1RiV5LBHWrbXShLJlMmeq5qriijJ2zxkXu2c1Ih7Gyl5Jwb+QXksSLAM/UC32e5hXeyJCkk3PZN7rgfCcSKEXblo9aDDettoy9bpj1G15yHpsBsaGjIjS/dAdkKpgsDyMK7Bwffj3o4GTMb1brohngki0OohngCOyXF0HTzDCc6/h18ATWnhigWpGxC8IJPyZwvQtIC0ESZHcaR+qapihqqJ4CBrZUPmfxnfmm9rntqVQq+k16epnw8RR4Cq+FpgM3JFEIiVysJNIMvDYNrg98PwD2LU2QRiS9Gno5w8Bamb4wKla71GnAuIRJ83bmKf6jnc8UDwaCI4GajCwBlLMoG2vW6k7VMcXDJyR2GLnxXXBl/urQrOCTmx7Dk7SX3CW/gpekGuITw25oHpNp0sR3roUgRPPIj90oWd+h7z5zswDkRP75hdeplM4miUexoBwNMsP0bB/YxoOjwejgCmS50tdSnXpTV3XM8SWKjg8p1ygWcn+snv9gkHM9Y/4r9cIYtGZBFT1FBXF7wP++Cj2quDHZ4L/vEQ1xZSwGRfp74G/D34i/u0d+UaPcMCOm+FNxc2x54LxhaHRG4UZCEcDXSn8jcMZcF8Of3uFHO7/3eHPtZMGNy7A6LYFGF56hxgL0BsNdESAl3BuJzTO5/wSZvs0xjdF43hbetGFNMLxftVH996ZG4CbcCv++MZ6bbdi53gsiVUZKnWR5rsEbl9dOnpTjNgdo2mhbJKXPevfaEnYB15RSbluXXIpea46MN0w32dth1lKnbcF891kd1XZJJq1WlFbWdGNPqjMzXreZlLqDPWdRsVb4KSAM4p5saLqQCNmWM3oLRIkkfqn7YqdBakqpXmK2BSV5VSpcOEGuheX05wLMs1JsZ5mNCFT14tmZZEe3SpnpEaj0FKcSQz19g6I7b3T2r7rAHNCDuoP0VchGrbfXTqiX41m74RzakszXgu2nQvFjvb13zrzdxeEpiaRIXsavxhLzrhgRUNf54Y2bvBQaBlH4IuAcw8A19yaVnznkTsEg69r3jZMq913NKVJx4Xlpmtsb1q7RHMzkFpDM1Z7B/vmrUwhJ4c0DK9YJlXXv48ZEzIbFSs+1C3R3sE5TRI9zUHeh7fBa3AbDnNYENqu7xC3F1Crqt2nvCYkdt9Lwbv/AQ==</diagram></mxfile>
<mxfile userAgent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36" version="8.8.1" editor="www.draw.io" type="device"><diagram id="625b897b-bc36-6d92-01ce-cd687e325a73" name="Page-1">7Vldc5s4FP01ntl9sIcPgeHRduv0obuT2Uxnt48yyKCNQKyQg51fvxIIAwKnsUNdp9M8ONKVkMQ5R7q6l4m9SvZ3DGbxHzREZGIZ4X5if5hYlmcZ4lcaDpXBdUFliBgOK5PZGB7wM1JG9Vy0wyHKOx05pYTjrGsMaJqigHdskDFadLttKenOmsEI9QwPASR969845LF6Lcdo7J8QjuJ6ZtNQLRsYPEaM7lI138Syt+Vf1ZzAeizVP49hSIuWyf44sVeMUl6Vkv0KEQltDVv13PpE63HdDKX8NQ9Y1QNPkOzUq8OQofwgbF/++lwNBbcYq9XyQ41Q+Y5IjmJM7GURY44eMhjI1kJIQthinhBRM0VxiwlZUUJZ+axExAoCYc85o4+o1RK6G9dxRUv/PdSrPSHG0b5lUu91h2iCOJMLV60WUBgfam2petEwatY8xC02XWWDSkTRcegGSFFQWA7javdwvfvzi4KTELlZRsQzhMjbDuLpBh7abEVLCPO4HN1UlXvIOWJpabEMcxzIbQ3yo8yvATnoQZ7BfycrMPGcx2vDPQKW4EfK1+lh2UMQpeFCnrSiFhCY5zjogob2mP8j8Z05qva1bknFalpNsvpVMfEWneZ0xwLUOdc4ZBHinS2Jws7R38e/ha8zAG9tY4hAjp+6DmMIczXDPcVivSdPJ9vXaKveRj3VPsH1gXxtIKANVGHQG0iQBw+tbpnskJ9esG1oevSNF9cFXu4vCtUKGj0eOXiVRN2zJJrSFI2hTzHkGss1japWcOtqtQ1/5jlzE1jqt0utY8ws2zN8R/2Cy6QMtFn8rjOZa7N8F5k7Nybz+YtezSWC5+WGiVIkS78VRTGDZCO8zHNEGZxl5Pd+r3foDU3nxCl3DW/onc9BXkxhmv48+Os3u6vi75+P//MGFjjAiMwoi34OChz7B1JQB+bv90Zo933s/KZ8rH7EAf9CN2ppLgkAbaCRXKXu+mzzZVd5FNFw/ze7SrOfzHj/GvVuW6PzS6MWXaOWNtAJjV4ii34u5nxZfCfy20z7N8W0vrkt70Kmgb7rZbDQuuXb9k0cTo4eRo99OPXTUz0V5jHMZBEnZXq6LUB5TcABJAuCI6ksTrOW9TPcIHJPc8wxla0byjlNRAciG5bHnHQ3Byuz0vaynGyRZ1UaXQoa1pUt3kthL9V6PsScy/z7QqJirYMwBTMc0HSLxc2JzQIxo7UOIYfin7QLdtYoz4XmMSRTmGVTocK16cpelE8TytA0QeluGuMQTU3Lm2VpdHKrnJH49eY9xamEVmvv2H5/79S2N92UXpE7+0X0KESDuasTfTWarVdciGuagx0jhyUT7Miz/lvBRROJVDUOFdlT3xgpmPO6Z5057+MGhlyL7qQvAs4cAK4Kz7a0PJEbBN3/drRumOblV8KFdKkg2zeNdUhXJsirgcQaqrHqYO+b4Z9Ajndp6MZyKn/YDvyUCaqNGgg+EBvYwQkOQznNIO/dsHMMbufdrBkA/aNviNsLqBXV5kNl5RKbj8H2x/8B</diagram></mxfile>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

View File

@ -1,4 +1,4 @@
\chapter{Podstawy teoretyczne/spis pojęć}
\chapter{Podstawy teoretyczne i/lub spis pojęć}
\chapter{Ekstrakcja godzin rozpoczęcia mszy świętych}
\section{Ogólny zarys systemu}
Architektura systemu ekstrakcji godzin rozpoczęcia mszy świętych została
@ -30,7 +30,7 @@ klas z nieodfiltrowanego zbioru stron parafialnych wylosowane zostają niepopraw
Zebrane dane zostają użyte do wytrenowania klasyfikatora godzin opartego na
płytkich sieciach neuronowych.
Klasyfikator używany jest do klasyfikacji godzin
Klasyfikator używany jest do przyporządkowania godzin
znalezionych przez ekstraktor godzin do następujących klas:
\begin{itemize}
\item poprawne godziny mszy świętych,
@ -96,7 +96,7 @@ Dla każdej parafii zebrano:
\end{table}
Do wydobycia danych użyto skryptu w języku Python, który korzystał z parsera
HTML z biblioteki \textit{BeautifulSoup}\cite{beautiful_soup}. Przy wysyłaniu zapytań do serwisu deon.pl zastosowano
HTML z biblioteki \textit{Beautiful Soup}\cite{beautiful_soup}. Przy wysyłaniu zapytań do serwisu deon.pl zastosowano
algorytm \textit{Expotential Backoff}\cite{expotential_backoff}, który
przedstawia się następująco:
@ -140,7 +140,7 @@ Dla każdej parafii zebrano:
zapobiega zbyt częstemu wysyłaniu zapytań do serwisu. Dla przykładu załóżmy,
że dany serwis jest obciążony i nie daje sobie rady z przetwarzaniem zapytań.
Wtedy algorytm \textit{Expotential Backoff} przy każdym kolejnym niepowodzeniu
będzie czekał coraz dłużej zanim wyśle kolejne zapytanie. W ten sposób nie
będzie czekał coraz dłużej, zanim wyśle kolejne zapytanie. W ten sposób nie
będzie niepotrzebnie obciążał serwisu.
\section{Wyszukiwanie adresów URL parafii}
@ -160,9 +160,9 @@ Do wyszukiwania adresów URL parafii próbowano wykorzystać wyszukiwarki takie
Google i DuckDuckGo. Automatycznie wysyłano zapytanie złożone z konkatenacji
nazwy parafii, jej miejscowości i ulicy, na której się znajduje. Wyszukiwarka Google dawała
zadowalające wyniki, jednak po kilkunastu zapytaniach blokowała adres IP. W
dodatku w warunkach użytkowania serwisu i w pliku robots.txt Google zabrania
dodatku w warunkach użytkowania serwisu i w pliku \textit{robots.txt} Google zabrania
korzystania z pająków na ich wyszukiwarce.
Wyszukiwarka DuckDuckGo nie blokowała adresu IP, ale zabraniała indeksowania w pliku robots.txt i słaba radziła sobie z polskimi
Wyszukiwarka DuckDuckGo nie blokowała adresu IP, ale zabraniała indeksowania w pliku \textit{robots.txt} i słabo radziła sobie z polskimi
zapytaniami. W obu przypadkach powyższa metoda stwarzała kolejny problem do
rozwiązania -- z wielu wyników wyszukiwania trzeba było wybrać ten, który zawierał
adres URL parafii.
@ -182,19 +182,21 @@ zapytań do 150 000 na 24 godziny. Karta płatnicza jest potrzebna Google do
identyfikacji osoby. Żadna opłata nie jest pobierana za korzystanie z interfejsu
API.
Dla każdej parafii wykonywane jest zapytanie do serwisu \textit{Text Search}
składające się z konkatenacji nazwy, parafii, jej miejscowości i ulicy, na której
Dla każdej parafii wykonywane jest zapytanie do serwisu \textit{Text Search}.
Składa się ono z konkatenacji nazwy parafii, jej miejscowości i ulicy, na której
się znajduje. Jeśli nie zostanie znaleziony żaden obiekt, wysyłane jest powtórne
zapytanie, lecz tym razem składające się tylko z nazwy parafii i jej
miejscowości. Zdarza się, że serwis \textit{Text Search} zwraca kilka obiektów. W takim
miejscowości.
Zdarza się, że serwis \textit{Text Search} zwraca kilka obiektów. W takim
przypadku brany jest adres URL pierwszego obiektu z listy wyników.
Najczęściej jednak oba obiekty należą do tej samej parafii, więc mają taki sam
adres internetowy. Taki przypadek przedstawia rysunek \ref{pic:text_search}.
Serwis \textit{Text Search} zwraca dużo danych w formacie \textit{json}, które
Serwis \textit{Text Search} zwraca dużo danych w formacie JSON, które
ciężko przedstawić w przejrzystej postaci.
Dla
czytelności na rysunku \ref{pic:text_search} pokazano zrzuty z wyszukiwarki \textit{Google Maps},
które odpowiadają rezultatowi jaki otrzymanoby korzystając z serwisu
czytelności na rysunku \ref{pic:text_search} pokazano zrzuty ekranu z wyszukiwarki \textit{Google Maps},
które odpowiadają rezultatowi, jaki otrzymano by, korzystając z serwisu
\textit{Text Search}.
\noindent Powyższą metodą udało się zebrać adresy URL dla ok. 5600 parafii.
@ -275,14 +277,14 @@ silnik i wygląda następująco\footnote{Diagram i opis wzorowany jest na
\item \textit{Downloader} pobiera stronę parafialną i umieszcza ją w odpowiedzi, którą
przesyła silnikowi. Zanim odpowiedź dotrze do silnika, przetwarzana jest przez
\textit{downloader middleware}.
\item Silnik otrzymuje odpowiedź od \textit{downloader'a}i przekazuje ją \textit{spider'owi} do
\item Silnik otrzymuje odpowiedź od \textit{downloader'a} i przekazuje ją \textit{spider'owi} do
dalszego przetwarzania. Zanim odpowiedź trafi, do \textit{spider'a} przetwarzana jest
przez \textit{spider middleware}.
\item \textit{Spider} przerabia odpowiedź i zwraca dane strony parafialnej silnikowi. Zanim dane
trafią, do silnika przechodzą przez \textit{spider middleware}. Dodatkowo \textit{spider}
wysyła żądania z nowymi stronami parafialnymi do pobrania.
\item Silnik wysyła zebrane dane do procesora danych, który zapisuje je do
pliku.. Następnie przekazuje nowe żądania do zakolejkowania
pliku. Następnie przekazuje nowe żądania do zakolejkowania
dyspozytorowi.
\end{enumerate}
% \vspace*{-20mm}
@ -297,15 +299,15 @@ i obrazy.
Biblioteka \textit{Scrapy} obsługuje rozpoznawanie typu zawartości odpowiedzi, bazując na
następujących kryteriach:
\begin{itemize}
\item wartości \mintinline{bash}{Content-type}\cite{RFC2045}, \mintinline{bash}{Content-Encoding}\cite{RFC7231} i \mintinline{bash}{Content-Disposition}\cite{RFC6266} w nagłówku odpowiedzi,
\item nazwie pliku lub adresie URL (jeśli nie udało się rozpoznać po nagłówku),
\item wartości \mintinline{bash}{Content-type}\cite{RFC2045}, \mintinline{bash}{Content-Encoding}\cite{RFC7231} i \mintinline{bash}{Content-Disposition}\cite{RFC6266} w nagłówku odpowiedzi;
\item nazwie pliku lub adresie URL (jeśli nie udało się rozpoznać po nagłówku);
\item obecności znaków kontrolnych w pierwszych 5000 bajtów odpowiedzi
(jeśli nie udało się
rozpoznać po nazwie pliku lub adresie URL).
\end{itemize}
Powyższy schemat postępowania jest skuteczny, jeśli serwisy internetowe zwracają
poprawne odpowiedzi. Niestety niektóre strony parafialne potrafią zwracać
odpowiedzi, które nie są zgodne z rozdziałem 3.1 z RFC7231\cite{RFC7231}.
odpowiedzi, które nie są zgodne z rozdziałem 3.1 z dokumentu RFC7231\cite{RFC7231}.
Dla przykładu strona potrafi zwrócić \mintinline{bash}{Content-Type: text/html}
w nagłówku, a w ciele binarną
zawartość np. film. Tego rodzaju anomalie są wykrywane i eliminowane.
@ -353,7 +355,7 @@ ciała odpowiedzi.
\end{algorithm}
Algorytm \ref{alg:binaryornot} analizuje zawartość ciała odpowiedzi w celu
stwierdzenia czy jest ona binarna czy nie.
stwierdzenia czy jest ona binarna, czy nie.
W linii 6 za znaki kontrolne uznano
wszystkie znaki kontrolne ze zbioru C0\footnote{C0 to znaki kontrolne z kodu
ASCII o kodach od 0 do 32 i o kodzie 127.} i C1\footnote{C1 to znaki kontrolne
@ -373,21 +375,21 @@ Powyższe znaki zostały wykluczone, ponieważ często występują w plikach tek
Warto zwrócić uwagę na linię 10. Współczynnik
\mintinline{python}{control_char_ratio}
oznacza procent znaków kontrolnych w pierszych 1024 bajtach pliku.
oznacza procent znaków kontrolnych w pierwszych 1024 bajtach pliku.
Jeśli współczynnik \mintinline{python}{control_char_ratio} jest większy niż
$0.3$ to plik jest uznawany za binarny. Wartość $0.3$ została wzięta z
kodu\footnote{Kod znajduje się pod linkiem \url{https://github.com/Perl/perl5/blob/v5.27.11/pp\_sys.c\#L3605-L3665}. Wartość 0.3 występuje w linii 3661.}
$0,3$, to plik jest uznawany za binarny. Wartość $0,3$ została wzięta z
kodu\footnote{Kod znajduje się pod linkiem \url{https://github.com/Perl/perl5/blob/v5.27.11/pp\_sys.c\#L3605-L3665}. Wartość 0,3 występuje w linii 3661.}
źródłowego języka Perl, który między innymi zajmuje się rozpoznawaniem plików
binarnych. Natomiast współczynnik \mintinline{python}{high_ascii_ratio} oznacza
procent znaków EASCII\footnote{EASCII
oznacza rozszerzone kodowanie ASCII. Przykładowe rozszrzenia to systemy
oznacza rozszerzone kodowanie ASCII. Przykładowe rozszerzenia to systemy
kodowania ISO 8859 lub UTF-8.}
o kodach od 160 do 255.
Reprezentacja tych znaków zależy od rozszerzenia ASCII. Najczęściej jednak są to
znaki drukowalne, które rzadko występują w tekście.
Jeśli współczynnik \mintinline{python}{high_ascii_ratio} jest większy niż $0.7$
Jeśli współczynnik \mintinline{python}{high_ascii_ratio} jest większy niż $0,7$,
to plik jest uznawany za binarny.
Wartośc $0.7$ została dobrana na podstawie następujących obserwacji:
Wartość $0,7$ została dobrana na podstawie następujących obserwacji:
\begin{enumerate}
\item Zdarzają się pliki binarne, które mają dużo znaków
\mintinline{python}{high_ascii}. Przykładem jest plik z katalogu
@ -396,15 +398,15 @@ Wartośc $0.7$ została dobrana na podstawie następujących obserwacji:
zawiera bardzo dużo znaków o kodzie 255 w początkowych bajtach.
\item Mało prawdopodobne jest, aby plik tekstowy miał w pierwszych 1024 bajtach
więcej niż 70\% znaków \mintinline{python}{high_ascii}. Nawet jeśli pająk
natrafiłby na taki plik to z dużym prawdopodbieństwem nie zawierałby on
natrafiłby na taki plik, to z dużym prawdopodobieństwem nie zawierałby on
informacji parafialnych.
\end{enumerate}
\subsection{Automatyczna regulacja częstości zapytań}
Biblioteka \textit{Scrapy} zawiera przydatne rozszerzenie, które potrafi automatycznie
regulować częstość zapytań w zależności od obciążenia pająka i strony internetowej.
regulować częstość zapytań w zależności od obciążenia pająka i serwera.
Algorytm \ref{alg:throttling} przedstawia sposób postępowania w jaki pająk
Algorytm \ref{alg:throttling} przedstawia sposób postępowania, w jaki pająk
automatycznie reguluje częstość zapytań. Idea algorytmu jest następująca.
Załóżmy, że serwer potrzebuje
\mintinline{python}{latency}\footnote{Zmienna \mintinline{python}{latency}
@ -412,7 +414,7 @@ Załóżmy, że serwer potrzebuje
zdefiniowana w algorytmie \ref{alg:throttling}.} sekund, aby odpowiedzieć pająkowi. Jeśli pająk chce
mieć przetworzone równolegle
\mintinline{python}{target_concurrency}\footnote{Stała
\mintinline{python}{target_concurrency} została zdefiniowana w algorytmie \ref{alg:throttling}.}zapytań to powinnien
\mintinline{python}{target_concurrency} została zdefiniowana w algorytmie \ref{alg:throttling}.}zapytań to powinien
wysyłać każde zapytanie co \mintinline{python}{latency/target_concurrency}
sekund.
@ -507,17 +509,18 @@ maksymalnie wykorzystać łącze internetowe, które było wąskim gardłem w pr
indeksowania stron parafialnych.
\subsection{Organizacja danych}
Dane zbierane przez pająka zapisywane są do pliku w formacie \textit{JSON
Lines}. Format \textit{JSON Lines} charakteryzuje się tym, że w każdej linii pliku
znajduje się poprawny obiekt \textit{json}.
\enlargethispage{1\baselineskip}
Dane zbierane przez pająka zapisywane są do pliku w formacie JSONL. Format JSONL charakteryzuje się tym, że w każdej linii pliku
znajduje się poprawny obiekt JSON.
Dla
każdej parafii pobrane dane zapisywane są w oddzielnym pliku. W każdej linii
pliku znajduje się strona parafialna zapisana w formacie \textit{json}.
Zapis w formacie \textit{JSON Lines} i traktowanie każdej linii jako strony parafialnej niesie szereg korzyści takich jak:
pliku znajduje się strona parafialna zapisana w formacie JSON.
Taki sposób organizacji danych przynosi szereg korzyści takich jak:
\begin{enumerate}
\item wygodne przetwarzanie równoległe,
\item łatwa obróbka danych za pomocą narzędzi Unixowych,
\item mniejszy rozmiar pliku w porównaniu do zwykłego formatu \textit{json}.
\item łatwa obróbka danych za pomocą narzędzi Uniksowych,
\item mniejszy rozmiar pliku w porównaniu do zwykłego formatu \textit{JSON}.
\end{enumerate}
\noindent Dla każdej strony parafialnej zapisywane są następujące informacje:
@ -574,8 +577,7 @@ być godzinami rozpoczęcia mszy świętych. Został napisany z myślą, aby mia
bardzo wysoką wartość pokrycia, ale już niekoniecznie wysoką precyzję.
Celem jest,
aby w zbiorze wyekstrahowanych godzin znalazło się jak najwięcej godzin
rozpoczęcia mszy, bez względu na to, jak duży jest ten zbiór. Ekstraktor wraz
ze znalezioną godziną zapisuje kontekst w jakim ta godzina się znalazła.
rozpoczęcia mszy, bez względu na to, jak duży jest ten zbiór.
Do osiągnięcia tego celu zastosowano następujące reguły.
Ciąg znaków oznaczony jako \mintinline{bash}{hour} zostanie wyekstrahowany, jeśli
@ -589,6 +591,8 @@ zajdzie każdy z poniższych warunków:
\item Jeśli znak przed \mintinline{bash}{hour} równa się
\mintinline{python}{'('}, to znak po \mintinline{bash}{hour} jest różny od \mintinline{bash}{')'}.
\end{enumerate}
Ekstraktor wraz
ze znalezioną godziną zapisuje kontekst, w jakim ta godzina się znalazła.
\section{Filtrowanie stron}
\begin{figure}[tbh!]
@ -601,16 +605,17 @@ zajdzie każdy z poniższych warunków:
Na rysunku \ref{pic:filtrowanie} został przedstawiony fragment architektury
systemu z rysunku \ref{pic:architektura}, który zostanie omówiony w tym podrozdziale.
Filtr stron parafialnych ma za zadanie odnaleźć strony parafialne na których z
Filtr stron parafialnych ma za zadanie odnaleźć strony parafialne, na których z
dużym prawdopodobieństwem znajdują się godziny mszy świętych. Taki zabieg jest
potrzebny, aby ograniczyć liczbę godzin, które trafią do anotatora. Gdyby nie zastosowano
filtru stron parafialnych ekstraktor godzin wśród wszystkich stron parafialnych
filtru stron parafialnych, ekstraktor godzin wśród wszystkich stron parafialnych
znalazłby ponad 3 miliony godzin. Po zaaplikowaniu filtru stron i przetworzeniu
ich przez ekstraktor godzin otrzymano 10920 godzin. Później godziny wraz z
kontekstami poddawane są anotacji. Etap ten będzie dokładniej opisany w kolejnym podrozdziale.
kontekstami poddawane są anotacji. Etap ten będzie dokładniej opisany w
podrozdziale \ref{sec:anotator}.
Reguły zastosowane do zadecydowania czy dana strona zawiera godziny mszy
świętych zostały przedstawione w
świętych, zostały przedstawione w
algorytmie \ref{alg:has_mass}.
\begin{algorithm}
\setstretch{1.2}
@ -621,7 +626,7 @@ algorytmie \ref{alg:has_mass}.
if}{\nl else}{\nl end if}%
\SetKwIF{If}{ElseIf}{Else}{if}{then}{else if}{else}{\nl end if}%
\SetAlgoLined
\SetKwData{url}{url}
\SetKwData{link}{url}
\SetKwData{bText}{btn\_text}
\SetKwData{False}{False}
\SetKwData{True}{True}
@ -629,7 +634,7 @@ algorytmie \ref{alg:has_mass}.
\SetKwInput{kwOutput}{Wyjście}
\kwInput{\\
\vspace{-0.5mm}
\Indp\url $\leftarrow$ adres internetowy analizowanej strony,\\
\Indp\link $\leftarrow$ adres internetowy analizowanej strony,\\
\bText $\leftarrow$ tekst na przycisku, który doprowadził do
analizowanej \phantom{\bText $\leftarrow$} strony.
}
@ -657,7 +662,7 @@ algorytmie \ref{alg:has_mass}.
\nl $\badreg \leftarrow$
\mintinline[breaklines]{python}{'nabo[zż]e[nń]stwa.(majowe|wielk|czerwcowe |maryjne|pasyjne|pokutne|fatimskie|do|ro[żz]a|czterdzie|w.wielk)'}
\nl$\suf \leftarrow$ ciąg znaków w \url po ostatnim wystąpieniu \slash\;
\nl$\suf \leftarrow$ ciąg znaków w \link po ostatnim wystąpieniu \slash\;
\nl\uIfM{\begin{tabular}{@{\hspace*{-3.8pt}}l@{}}
\nl \hspace*{1.2em}
@ -671,31 +676,85 @@ algorytmie \ref{alg:has_mass}.
}
\end{algorithm}
W algorytmie \ref{alg:has_mass} warto zwórcić uwagę na wyrażenia regularne
W algorytmie \ref{alg:has_mass} warto zwrócić uwagę na wyrażenia regularne
\mintinline{text}{ok_regex} i \mintinline{text}{bad_regex}. Wyrażenie
regularne \mintinline{text}{ok_regex} ma za zadanie dopasować się do słów,
które są powiązane z porządkiem mszy świętych. Stąd też pojawiają się tam
wyrażenia takiej jak rozkład mszy lub porządek liturgii.
wyrażenia takie jak rozkład mszy lub porządek liturgii.
Wyrażenie regularne \mintinline{text}{bad_regex} ma za zadanie dopasować się do
słów, które są powiązane z innymi nabożeństami niż msze święte. Stąd pojawiają
się tam wyrażenia takie jak nabożeństwa czerwcowe czy nabożeństwa maryjne.
słów, które są powiązane z innymi nabożeństwami niż msze święte. Stąd pojawiają
się tam wyrażenia takie jak nabożeństwa czerwcowe czy nabożeństwa maryjne.
\section{Anotator danych}
\begin{figure}[tbh!]
\center
\includegraphics[width=0.6\hsize]{annotator.png}
\label{anotator_pic}
\caption{Fragment architektury systemu przedstawiający komponent odpowiedzialny
za anotację danych.}
\label{pic:anotator}
\end{figure}
Na rysunku \ref{pic:anotator} został przedstawiony fragment architektury
systemu z rysunku \ref{pic:architektura}, który zostanie omówiony w tym podrozdziale.
\subsection{Ogólny zarys}
Anotator danych został stworzony w celu zebrania jak największej ilości
danych dla klasyfikatora przewidującego czy zaznaczony fragment jest godziną
rozpoczęcia mszy świętej, czy nie.
Aby osiągnąć zamierzony cel anotator został zaprojektowany w ten sposób aby:
\begin{itemize}
\item był szybki,
\item był dostępny na urządzeniach mobilnych i stacjonarnych,
\item był prosty i wygodny w użyciu,
\item umożliwiał wykrywanie oszustów (osób intencjonalnie źle anotujących).
\end{itemize}
Do dokończenia
\noindent Anotator jest dostępny jako aplikacja internetowa pod adresem \url{msze.nsupdate.info}. Aplikacja jest
responsywna, więc można z niej wygodnie korzystać na każdym urządzeniu
wyposażonym w co najmniej 4 calowy wyświetlacz. Interfejs jest przejrzysty i
został pokazany na rysunku X. Jedyne akcje jakie może wykonać użytkownik to:
\begin{itemize}
\item kliknąć „Tak” jeśli zaznaczono godzinę rozpoczęcia mszy,
\item kliknąć „Nie” jeśli zaznaczono inną godzinę,
\item cofnąć się do poprzedniej anotacji,
\item wyświetlić instrukcję obsługi.
\end{itemize}
Po naciśnięciu przycisku „Tak” lub „Nie” ekran jest automatycznie przewijany na
sam dół. Taka operacja zapewnia łatwy dostęp do przycisków odpowiedzialnych za anotację. Dzięki
temu znajdują się one również zawsze w tym samym miejscu co ułatwia szybką
anotację.
Po naciśnięciu przycisku „Cofnij” ekran nie jest już przewijany na sam dół. W
ten sposób zapewniono wygodny dostęp do przycisku „Cofnij”. Jest to szczególnie
istotne w przypadku gdy
użytkownik zamierza cofać się wiele razy.
\section{Regułowy ekstraktor godzin mszy}
Aby zapewnić odpowiednią jakość anotacji przy pierwszym urchomieniu wyświetlana
jest instrukcja obsługi. Opisuje ona sposób w jaki należy anotować godziny oraz
przedstawia przykłady poprawnie zanotowanych godzin. Intrukcję można zamknąć
dopiero po przewinięciu jej na sam dół.
Aplikacja nie wymaga logowania. Taka
decyzja została podjęta ze względu na fakt, że anotatorami są wolontariusze.
Wymóg rejestracji i logowania spowodowałby zmniejszenie liczby osób chętnych do
anotacji. Takie podejście wiąże się jednak z problemem identyfikacji
użytkowników. Identyfikacja jest niezbędna do prawidłowego funkcjonawania
antotora. Chcielibyśmy wiedzieć, które godziny zostały zanotowane przez danego
użytkownika, aby między innymi nie dać mu tych samych godzin do anotacji.
\subsection{Identyfikacja urządzeń}
Skuteczną identyfikację można przeprowadzić używając
\subsection{Architektura anotatora}
Architektura
\subsection{Podsumowanie}
\section{Regułowa ekstrakcja godzin mszy}
Do napisania
\section{Ekstraktor godzin mszy oparty na uczeniu maszynowym}
\section{Klasyfikacja godzin}
Do napisania
\subsection{Model teoretyczny}
\subsection{FastText}