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} \chapter{Ekstrakcja godzin rozpoczęcia mszy świętych}
\section{Ogólny zarys systemu} \section{Ogólny zarys systemu}
Architektura systemu ekstrakcji godzin rozpoczęcia mszy świętych została 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 Zebrane dane zostają użyte do wytrenowania klasyfikatora godzin opartego na
płytkich sieciach neuronowych. 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: znalezionych przez ekstraktor godzin do następujących klas:
\begin{itemize} \begin{itemize}
\item poprawne godziny mszy świętych, \item poprawne godziny mszy świętych,
@ -96,7 +96,7 @@ Dla każdej parafii zebrano:
\end{table} \end{table}
Do wydobycia danych użyto skryptu w języku Python, który korzystał z parsera 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 algorytm \textit{Expotential Backoff}\cite{expotential_backoff}, który
przedstawia się następująco: 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, 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ń. że dany serwis jest obciążony i nie daje sobie rady z przetwarzaniem zapytań.
Wtedy algorytm \textit{Expotential Backoff} przy każdym kolejnym niepowodzeniu 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. będzie niepotrzebnie obciążał serwisu.
\section{Wyszukiwanie adresów URL parafii} \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 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 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 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. 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 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ł rozwiązania -- z wielu wyników wyszukiwania trzeba było wybrać ten, który zawierał
adres URL parafii. 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 identyfikacji osoby. Żadna opłata nie jest pobierana za korzystanie z interfejsu
API. API.
Dla każdej parafii wykonywane jest zapytanie do serwisu \textit{Text Search} 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 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 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 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. 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 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}. 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. ciężko przedstawić w przejrzystej postaci.
Dla Dla
czytelności na rysunku \ref{pic:text_search} pokazano zrzuty z wyszukiwarki \textit{Google Maps}, czytelności na rysunku \ref{pic:text_search} pokazano zrzuty ekranu z wyszukiwarki \textit{Google Maps},
które odpowiadają rezultatowi jaki otrzymanoby korzystając z serwisu które odpowiadają rezultatowi, jaki otrzymano by, korzystając z serwisu
\textit{Text Search}. \textit{Text Search}.
\noindent Powyższą metodą udało się zebrać adresy URL dla ok. 5600 parafii. \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ą \item \textit{Downloader} pobiera stronę parafialną i umieszcza ją w odpowiedzi, którą
przesyła silnikowi. Zanim odpowiedź dotrze do silnika, przetwarzana jest przez przesyła silnikowi. Zanim odpowiedź dotrze do silnika, przetwarzana jest przez
\textit{downloader middleware}. \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 dalszego przetwarzania. Zanim odpowiedź trafi, do \textit{spider'a} przetwarzana jest
przez \textit{spider middleware}. przez \textit{spider middleware}.
\item \textit{Spider} przerabia odpowiedź i zwraca dane strony parafialnej silnikowi. Zanim dane \item \textit{Spider} przerabia odpowiedź i zwraca dane strony parafialnej silnikowi. Zanim dane
trafią, do silnika przechodzą przez \textit{spider middleware}. Dodatkowo \textit{spider} trafią, do silnika przechodzą przez \textit{spider middleware}. Dodatkowo \textit{spider}
wysyła żądania z nowymi stronami parafialnymi do pobrania. wysyła żądania z nowymi stronami parafialnymi do pobrania.
\item Silnik wysyła zebrane dane do procesora danych, który zapisuje je do \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. dyspozytorowi.
\end{enumerate} \end{enumerate}
% \vspace*{-20mm} % \vspace*{-20mm}
@ -297,15 +299,15 @@ i obrazy.
Biblioteka \textit{Scrapy} obsługuje rozpoznawanie typu zawartości odpowiedzi, bazując na Biblioteka \textit{Scrapy} obsługuje rozpoznawanie typu zawartości odpowiedzi, bazując na
następujących kryteriach: następujących kryteriach:
\begin{itemize} \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 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 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 \item obecności znaków kontrolnych w pierwszych 5000 bajtów odpowiedzi
(jeśli nie udało się (jeśli nie udało się
rozpoznać po nazwie pliku lub adresie URL). rozpoznać po nazwie pliku lub adresie URL).
\end{itemize} \end{itemize}
Powyższy schemat postępowania jest skuteczny, jeśli serwisy internetowe zwracają Powyższy schemat postępowania jest skuteczny, jeśli serwisy internetowe zwracają
poprawne odpowiedzi. Niestety niektóre strony parafialne potrafią zwracać 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} Dla przykładu strona potrafi zwrócić \mintinline{bash}{Content-Type: text/html}
w nagłówku, a w ciele binarną w nagłówku, a w ciele binarną
zawartość np. film. Tego rodzaju anomalie są wykrywane i eliminowane. zawartość np. film. Tego rodzaju anomalie są wykrywane i eliminowane.
@ -353,7 +355,7 @@ ciała odpowiedzi.
\end{algorithm} \end{algorithm}
Algorytm \ref{alg:binaryornot} analizuje zawartość ciała odpowiedzi w celu 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 W linii 6 za znaki kontrolne uznano
wszystkie znaki kontrolne ze zbioru C0\footnote{C0 to znaki kontrolne z kodu 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 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 Warto zwrócić uwagę na linię 10. Współczynnik
\mintinline{python}{control_char_ratio} \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ż 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 $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.} 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 ź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 binarnych. Natomiast współczynnik \mintinline{python}{high_ascii_ratio} oznacza
procent znaków EASCII\footnote{EASCII 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.} kodowania ISO 8859 lub UTF-8.}
o kodach od 160 do 255. o kodach od 160 do 255.
Reprezentacja tych znaków zależy od rozszerzenia ASCII. Najczęściej jednak są to Reprezentacja tych znaków zależy od rozszerzenia ASCII. Najczęściej jednak są to
znaki drukowalne, które rzadko występują w tekście. 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. 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} \begin{enumerate}
\item Zdarzają się pliki binarne, które mają dużo znaków \item Zdarzają się pliki binarne, które mają dużo znaków
\mintinline{python}{high_ascii}. Przykładem jest plik z katalogu \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. 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 \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 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. informacji parafialnych.
\end{enumerate} \end{enumerate}
\subsection{Automatyczna regulacja częstości zapytań} \subsection{Automatyczna regulacja częstości zapytań}
Biblioteka \textit{Scrapy} zawiera przydatne rozszerzenie, które potrafi automatycznie 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. automatycznie reguluje częstość zapytań. Idea algorytmu jest następująca.
Załóżmy, że serwer potrzebuje Załóżmy, że serwer potrzebuje
\mintinline{python}{latency}\footnote{Zmienna \mintinline{python}{latency} \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 zdefiniowana w algorytmie \ref{alg:throttling}.} sekund, aby odpowiedzieć pająkowi. Jeśli pająk chce
mieć przetworzone równolegle mieć przetworzone równolegle
\mintinline{python}{target_concurrency}\footnote{Stała \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} wysyłać każde zapytanie co \mintinline{python}{latency/target_concurrency}
sekund. sekund.
@ -507,17 +509,18 @@ maksymalnie wykorzystać łącze internetowe, które było wąskim gardłem w pr
indeksowania stron parafialnych. indeksowania stron parafialnych.
\subsection{Organizacja danych} \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 \enlargethispage{1\baselineskip}
znajduje się poprawny obiekt \textit{json}. 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 Dla
każdej parafii pobrane dane zapisywane są w oddzielnym pliku. W każdej linii każdej parafii pobrane dane zapisywane są w oddzielnym pliku. W każdej linii
pliku znajduje się strona parafialna zapisana w formacie \textit{json}. pliku znajduje się strona parafialna zapisana w formacie JSON.
Zapis w formacie \textit{JSON Lines} i traktowanie każdej linii jako strony parafialnej niesie szereg korzyści takich jak: Taki sposób organizacji danych przynosi szereg korzyści takich jak:
\begin{enumerate} \begin{enumerate}
\item wygodne przetwarzanie równoległe, \item wygodne przetwarzanie równoległe,
\item łatwa obróbka danych za pomocą narzędzi Unixowych, \item łatwa obróbka danych za pomocą narzędzi Uniksowych,
\item mniejszy rozmiar pliku w porównaniu do zwykłego formatu \textit{json}. \item mniejszy rozmiar pliku w porównaniu do zwykłego formatu \textit{JSON}.
\end{enumerate} \end{enumerate}
\noindent Dla każdej strony parafialnej zapisywane są następujące informacje: \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ę. bardzo wysoką wartość pokrycia, ale już niekoniecznie wysoką precyzję.
Celem jest, Celem jest,
aby w zbiorze wyekstrahowanych godzin znalazło się jak najwięcej godzin 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 rozpoczęcia mszy, bez względu na to, jak duży jest ten zbiór.
ze znalezioną godziną zapisuje kontekst w jakim ta godzina się znalazła.
Do osiągnięcia tego celu zastosowano następujące reguły. 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 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ę \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}{')'}. \mintinline{python}{'('}, to znak po \mintinline{bash}{hour} jest różny od \mintinline{bash}{')'}.
\end{enumerate} \end{enumerate}
Ekstraktor wraz
ze znalezioną godziną zapisuje kontekst, w jakim ta godzina się znalazła.
\section{Filtrowanie stron} \section{Filtrowanie stron}
\begin{figure}[tbh!] \begin{figure}[tbh!]
@ -601,16 +605,17 @@ zajdzie każdy z poniższych warunków:
Na rysunku \ref{pic:filtrowanie} został przedstawiony fragment architektury Na rysunku \ref{pic:filtrowanie} został przedstawiony fragment architektury
systemu z rysunku \ref{pic:architektura}, który zostanie omówiony w tym podrozdziale. 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 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 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 znalazłby ponad 3 miliony godzin. Po zaaplikowaniu filtru stron i przetworzeniu
ich przez ekstraktor godzin otrzymano 10920 godzin. Później godziny wraz z 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 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}. algorytmie \ref{alg:has_mass}.
\begin{algorithm} \begin{algorithm}
\setstretch{1.2} \setstretch{1.2}
@ -621,7 +626,7 @@ algorytmie \ref{alg:has_mass}.
if}{\nl else}{\nl end if}% if}{\nl else}{\nl end if}%
\SetKwIF{If}{ElseIf}{Else}{if}{then}{else if}{else}{\nl end if}% \SetKwIF{If}{ElseIf}{Else}{if}{then}{else if}{else}{\nl end if}%
\SetAlgoLined \SetAlgoLined
\SetKwData{url}{url} \SetKwData{link}{url}
\SetKwData{bText}{btn\_text} \SetKwData{bText}{btn\_text}
\SetKwData{False}{False} \SetKwData{False}{False}
\SetKwData{True}{True} \SetKwData{True}{True}
@ -629,7 +634,7 @@ algorytmie \ref{alg:has_mass}.
\SetKwInput{kwOutput}{Wyjście} \SetKwInput{kwOutput}{Wyjście}
\kwInput{\\ \kwInput{\\
\vspace{-0.5mm} \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 \bText $\leftarrow$ tekst na przycisku, który doprowadził do
analizowanej \phantom{\bText $\leftarrow$} strony. analizowanej \phantom{\bText $\leftarrow$} strony.
} }
@ -657,7 +662,7 @@ algorytmie \ref{alg:has_mass}.
\nl $\badreg \leftarrow$ \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)'} \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\uIfM{\begin{tabular}{@{\hspace*{-3.8pt}}l@{}}
\nl \hspace*{1.2em} \nl \hspace*{1.2em}
@ -671,31 +676,85 @@ algorytmie \ref{alg:has_mass}.
} }
\end{algorithm} \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 \mintinline{text}{ok_regex} i \mintinline{text}{bad_regex}. Wyrażenie
regularne \mintinline{text}{ok_regex} ma za zadanie dopasować się do słów, 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 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 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ą 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. się tam wyrażenia takie jak nabożeństwa czerwcowe czy nabożeństwa maryjne.
\section{Anotator danych} \section{Anotator danych}
\begin{figure}[tbh!] \begin{figure}[tbh!]
\center \center
\includegraphics[width=0.6\hsize]{annotator.png} \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} \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 Anotator danych został stworzony w celu zebrania jak największej ilości
danych dla klasyfikatora przewidującego czy zaznaczony fragment jest godziną danych dla klasyfikatora przewidującego czy zaznaczony fragment jest godziną
rozpoczęcia mszy świętej, czy nie. 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 Do napisania
\section{Ekstraktor godzin mszy oparty na uczeniu maszynowym} \section{Klasyfikacja godzin}
Do napisania Do napisania
\subsection{Model teoretyczny} \subsection{Model teoretyczny}
\subsection{FastText} \subsection{FastText}