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}
|
||||
\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}
|
||||
|
Loading…
Reference in New Issue
Block a user