219 lines
9.5 KiB
TeX
219 lines
9.5 KiB
TeX
|
||
\chapter{Ekstrakcja godzin rozpoczęcia mszy świętych}
|
||
\section{Ogólny zarys systemu}
|
||
System zaczyna działanie od zebrania jak największej ilości danych (nazwa parafii, adres, diecezja
|
||
itd.) o polskich parafiach ze strony deon.pl. Następnie odpytuje api Google'a w
|
||
celu znalezienia adresów internetowych parafii.
|
||
Dla każdej parafii dla której udało się znaleźć adres url pobierane są wszystkie
|
||
podstrony w odległości (sieć to graf) conajwyżej 3 od strony startowej.
|
||
|
||
Z dużej liczby stron parafialnych, za pomocą prostych reguł wyodrębnione zostają
|
||
te na których z dużym prawdopodbieństwem znajdują się godziny mszy świętych.
|
||
Każda godzina wraz z kontekstem w jakim się znajduje trafia do \textit{systemu
|
||
crowdsourcing'owego}, gdzie jest annotowana jako poprawna lub niepoprawna godzina mszy świętej.
|
||
Do zannotowanych danych zostają dołączone poprawne godziny mszy świętych
|
||
znalezione przez
|
||
regułowy ekstraktor mszy świętych o bardzo wysokiej precyzji. Dodatkowo w celu wyrównania
|
||
klas z nieodfiltrowanego zbioru stron parafialnych wylosowane zostają niepoprawne godziny mszy świętych.
|
||
Zebrane dane zostają użyte do wytrenowania klasyfikatora godzin opartego na
|
||
płytkich sieciach neuronowych.
|
||
|
||
Finalny ekstraktor godzin mszy świętych utworzony zostaje z połączenia
|
||
ekstraktora regułowego z ekstraktorem opartym na uczeniu maszynowym.
|
||
% \bigskip
|
||
|
||
% \newpage
|
||
\begin{figure}[tbh!]
|
||
\center
|
||
\includegraphics[width=1\hsize]{struktura_wyszukiwarki.png}
|
||
\caption{Struktura ekstraktora godzin mszy świętych.}
|
||
\label{struktura_pic}
|
||
\end{figure}
|
||
|
||
|
||
\newpage
|
||
\section{Zbieranie informacji o parafiach}
|
||
|
||
\begin{figure}[tbh!]
|
||
\center
|
||
\includegraphics[width=0.7\hsize]{crawler_adresow_trans.png}
|
||
\label{crawler_adresow_pic}
|
||
\end{figure}
|
||
Dane zostały zebrane z serwisu internetowego deon.pl, który zawiera 10130 parafii.
|
||
Warto zauważyć, że deon.pl posiada większość polskich parafii, ponieważ według
|
||
danych statystycznych GUS z 2016 roku w Polsce było
|
||
10255 parafii.
|
||
|
||
Dla każdej parafii zebrano:
|
||
\begin{itemize}
|
||
\item nazwę parafii,
|
||
\item miejscowość w której się znajduje,
|
||
\item województwo w którym się znajduje,
|
||
\item dokładny adres,
|
||
\item nazwę dekanatu do którego należy,
|
||
\item nazwę diecezji do której przynależy.
|
||
\end{itemize}
|
||
Do wydobycia danych został użyty skrypt w pythonie, który korzystał z parsera
|
||
html z biblioteki BeautifulSoup. Przy wysyłaniu zapytań do serwisu deon.pl zastosowano
|
||
algorym \textit{Expotential Backoff} REF, który prezentuje się następująco:
|
||
\begin{enumerate}
|
||
\item Wyślij zapytanie do serwisu.
|
||
\item Jeśli zapytanie się powiodło wróć do punktu nr 1, jeśli nie poczekaj 1.5s i wyślij kolejne zapytanie.
|
||
\item Jeśli zapytanie znów się nie powiodło odczekaj 2.25s i wyślij kolejne
|
||
zapytanie
|
||
\item W ogólności czekaj $1.5^t$ sekund zanim wyślesz kolejne zapytanie, gdzie
|
||
$t$ to liczba następujących po sobie nieudanych zapytań.
|
||
\end{enumerate}
|
||
Powyższy algorytm uodparnia skrypt na przejściowe problemy z połączeniem i
|
||
zapobiega zbyt częstemu odpytywaniu serwisu kiedy ten nie daje sobie rady ze
|
||
zbyt dużą liczbą zapytań.
|
||
|
||
\begin{table}
|
||
\centering
|
||
\def\arraystretch{1.1}
|
||
\begin{tabular}{ l l l l l l }
|
||
\textbf{Parafia} & \textbf{Miejscowość} & \textbf{Adres} & \textbf{Diecezja} & \textbf{Dekanat} & \textbf{Województwo} \\
|
||
\hline \\ [-2ex]
|
||
Bożego Ciała & Hel & ul. Gdań... & gdańska & Morski & pomorskie \\
|
||
Ducha Św. & Śrem & ul. Prym... & poznańska & Śrem & wielkopolskie\\
|
||
Św. Trójcy & Paszowice & Paszowic... & legnicka & Jawor & dolnośląskie\\
|
||
\\ [-1.5ex]
|
||
\end{tabular}
|
||
\caption{Fragment zebranych danych.}
|
||
\end{table}
|
||
|
||
\section{Wyszukiwanie stron internetowych parafii}
|
||
\begin{figure}[tbh!]
|
||
\center
|
||
\includegraphics[width=0.7\hsize]{crawler_url_trans.png}
|
||
\label{crawler_url_pic}
|
||
\end{figure}
|
||
\subsubsection{Pierwsze próby}
|
||
Do wyszukiwania adresów url parafii próbowano wykorzystać wyszukiwarki takie jak
|
||
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 robots.txt Google zabrania
|
||
korzystania z pająków na ich wyszukiwarce.
|
||
DuckDuckGo nie blokowało adresu ip, ale zabraniało \textit{crawlowania} w robots.txt i słabo radziło 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.
|
||
\subsubsection{Rozwiązanie}
|
||
Po wieleokrotnych próbach poszukiwań znaleziono klucz do rozwiązania problemu
|
||
wyszukiwania adresów url jakim jest
|
||
\textit{Google Places Api} REF. Serwis \textit{Text Search} REF pozwala na wyszukanie miejsca
|
||
danego obiektu na
|
||
podstawie jego nazwy. Ponadto mając już wyszukany dany obiekt i jego
|
||
identyfikator można odpytać serwis \textit{Place Detail} REF, aby wyciągnąć więcej
|
||
szczegółów o danym miejscu. Między innymi można otrzymać adres url danego obiektu.
|
||
|
||
Jedynym minusem jest ograniczenie liczby zapytań do 1000 na 24 godziny. W
|
||
dodatku każde zapytanie do serwisu \textit{Text Search} traktowane jest jak 10
|
||
zapytań. Podając swoją kartę płatniczą można zwiększyć limit
|
||
zapytań do 150 000 na 24 godziny. Karta płatnicza jest potrzebna Google'owi do
|
||
identyfikacji osoby. Żadna opłata nie jest pobierana za korzystanie z 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
|
||
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 \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.
|
||
|
||
Powyższą metodą udało się zebrać adresy url dla ok. 5600 parafii.
|
||
|
||
|
||
\begin{figure}[tbh]
|
||
\center
|
||
\includegraphics[width=1\hsize]{amb_text_search.png}
|
||
\caption{Przykład dwóch obiektów zwróconych przez \textit{Text Search}, które
|
||
mają ten sam adres internetowy.}
|
||
\label{text_search_pic}
|
||
\end{figure}
|
||
|
||
|
||
|
||
\section{\textit{Crawlowanie} stron parafialnych}
|
||
|
||
\begin{figure}[tbh]
|
||
\center
|
||
\includegraphics[width=0.7\hsize]{crawler_parafii_general.png}
|
||
\label{crawler_parafii_general_pic}
|
||
\end{figure}
|
||
Crawler został napisany przy użyciu biblioteki Scrapy.
|
||
Punktem startowym jest pojedynczy adres url parafii podawany na wejście
|
||
programu. Z początkowego adresu url wydobywana jest domena w obrębie której
|
||
porusza się pająk. Oznacza to, że jedna instancja pająka zajmuje się ściąganiem
|
||
tylko jedenej parafii. W ramach jednej parafii pająk jest w stanie
|
||
asynchronicznie wysłać wiele zapytań do serwera i odbierać wiele odpowiedzi od serwera.
|
||
|
||
\subsubsection{Komponenty crawler'a}
|
||
\subsubsection{Przepływ danych}
|
||
|
||
Przepływ danych kontrolowany jest przez
|
||
silnik i prezentuje się następująco:
|
||
|
||
\begin{figure}[tbh]
|
||
\center
|
||
\includegraphics[width=0.7\hsize]{scrapy_data_flow.png}
|
||
% \caption{100 crawlerów pracujących jednocześnie}
|
||
\label{scrapy_data_flow_pic}
|
||
\end{figure}
|
||
|
||
\begin{enumerate}
|
||
\item Silnik otrzymuje od pająka żądanie pobrania początkowej strony danej
|
||
parafii (najczęściej jest to strona główna parafii).
|
||
\item Silnik oddaje żądania dyspozytorowi, który kolejkuje je do dalszego
|
||
przetwarzania oraz pyta dyspozytora o żądania gotowe do przekazania downloader'owi.
|
||
\item Dyspozytor zwraca silnikowi następne żądania.
|
||
\item Silnik wysyła żądania do downloader'a. Zanim żądania dotrą do
|
||
downloader'a przetwarzane są przez middleware'y downloader'a.
|
||
\item Downloader ściąga stronę parafialną i umieszcza ją w odpowiedzi, którą
|
||
przesyła silnikowi. Zanim odpowiedź dotrze do silnka przetwarzana jest przez
|
||
middleware'y downloader'a.
|
||
\item Silnik otrzymuje odpowiedź od downloader'a i przekazuje ją pająkowi do
|
||
dalszego przetwarzania. Zanim odpowiedź trafi do pająka przetwarzana jest
|
||
przez middleware'y pająka.
|
||
\item Pająk przerabia odpowiedź i zwraca dane strony parafialnej silnikowi. Zanim dane
|
||
trafią do silnika przechodzą przez middleware'y pająka. Dodatkowo pająk
|
||
wysła żądania z nowymi stronami parafialnymi do pobrania.
|
||
\item Silnik wysyła zebrane dane do przetwarzacza danych, który zapisuje je w
|
||
pliku jsonline. Następnie przekazuje nowe żądania do zakolejkowania
|
||
dyspozytorowi.
|
||
\end{enumerate}
|
||
\vspace*{-20mm}
|
||
Cały proces trwa dopóty, dopóki są nowe żądania do przetworzenia.
|
||
|
||
|
||
\vspace*{20mm}
|
||
Z pomocą GNU parallel crawlowane jest jednocześnie 100 parafii.
|
||
|
||
\begin{figure}[tbh]
|
||
\center
|
||
\includegraphics[width=0.7\hsize]{crawler.png}
|
||
\caption{100 crawlerów pracujących jednocześnie}
|
||
\label{crawler_pic}
|
||
\end{figure}
|
||
|
||
\section{Organizacja danych} % może zbyt inżynierskieby
|
||
\section{Ekstrakcja godzin rozpoczęcia mszy świętych}
|
||
\subsection{Ogólny zarys}
|
||
\subsection{Named entity recognition}
|
||
\subsection{Słowa kluczowe}
|
||
\subsection{Reguły}
|
||
\subsection{Bootstraping}
|
||
\subsection{Otoczenia słów (ang. word embeddings)}
|
||
|
||
\chapter{Rezultaty}
|
||
\section{Wyrażenia regularne}
|
||
\section{Bootstraping}
|
||
\section{Autorska metoda}
|
||
|
||
\subsection{Ewaluacja wewnętrzna} %F1 score
|
||
\subsection{Ewaluacja zewnętrzna} % w systemie webowym, użytkownicy
|
||
\chapter{Wnioski}
|
||
\chapter{Perspektywy na przyszłość}
|