REszta zrobiona. Robiny jest anotator.
This commit is contained in:
parent
ae41d0ccb7
commit
e0e7165f83
@ -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>
|
BIN
img/crawler.png
BIN
img/crawler.png
Binary file not shown.
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
163
rozdzial_3.tex
163
rozdzial_3.tex
@ -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}
|
||||||
|
Loading…
Reference in New Issue
Block a user