tmp add desc
@ -33,4 +33,82 @@ Fourteenth International Conference on Computational Linguistics, Nantes, France
|
|||||||
pages={87--112},
|
pages={87--112},
|
||||||
year={1994},
|
year={1994},
|
||||||
publisher={Springer}
|
publisher={Springer}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@article{gus,
|
||||||
|
title={Rocznik statystyczny Rzeczypospolitej Polskiej 2017},
|
||||||
|
author={Dominik Rozkrut i in},
|
||||||
|
journal={GUS},
|
||||||
|
volume={T. LXXVII},
|
||||||
|
pages={194--195},
|
||||||
|
year={2016}
|
||||||
|
@Comment publisher={}
|
||||||
|
}
|
||||||
|
|
||||||
|
@misc{beautiful_soup,
|
||||||
|
title = {BeautifulSoup},
|
||||||
|
note = {Crummy.org},
|
||||||
|
key = {BeautifulSoup},
|
||||||
|
howpublished={\url{https://www.crummy.com/software/BeautifulSoup/}}
|
||||||
|
}
|
||||||
|
@misc{expotential_backoff}
|
||||||
|
@misc{google_api}
|
||||||
|
@misc{text_search}
|
||||||
|
@misc{place_detail}
|
||||||
|
@misc{jsonline}
|
||||||
|
@misc{binaryornot}
|
||||||
|
@misc{html2text}
|
||||||
|
@misc{markdown}
|
||||||
|
@article{parallel,
|
||||||
|
title = {GNU Parallel - The Command-Line Power Tool},
|
||||||
|
author = {O. Tange},
|
||||||
|
address = {Frederiksberg, Denmark},
|
||||||
|
journal = {;login: The USENIX Magazine},
|
||||||
|
month = {Feb},
|
||||||
|
number = {1},
|
||||||
|
volume = {36},
|
||||||
|
url = {http://www.gnu.org/s/parallel},
|
||||||
|
year = {2011},
|
||||||
|
pages = {42-47}
|
||||||
|
}
|
||||||
|
@techreport{RFC2045,
|
||||||
|
author = {Ned Freed and Nathaniel S. Borenstein},
|
||||||
|
title = {Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies},
|
||||||
|
howpublished = {Internet Requests for Comments},
|
||||||
|
type = {RFC},
|
||||||
|
number = {2045},
|
||||||
|
year = {1996},
|
||||||
|
month = {November},
|
||||||
|
issn = {2070-1721},
|
||||||
|
publisher = {RFC Editor},
|
||||||
|
institution = {RFC Editor},
|
||||||
|
url = {http://www.rfc-editor.org/rfc/rfc2045.txt},
|
||||||
|
note = {\url{http://www.rfc-editor.org/rfc/rfc2045.txt}},
|
||||||
|
}
|
||||||
|
@techreport{RFC7231,
|
||||||
|
author = {R. Fielding and J. Reschke},
|
||||||
|
title = {Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content},
|
||||||
|
howpublished = {Internet Requests for Comments},
|
||||||
|
type = {RFC},
|
||||||
|
number = {7231},
|
||||||
|
year = {2014},
|
||||||
|
month = {June},
|
||||||
|
issn = {2070-1721},
|
||||||
|
publisher = {RFC Editor},
|
||||||
|
institution = {RFC Editor},
|
||||||
|
url = {http://www.rfc-editor.org/rfc/rfc7231.txt},
|
||||||
|
note = {\url{http://www.rfc-editor.org/rfc/rfc7231.txt}},
|
||||||
|
}
|
||||||
|
@techreport{RFC6266,
|
||||||
|
author = {J. Reschke},
|
||||||
|
title = {Use of the Content-Disposition Header Field in the Hypertext Transfer Protocol (HTTP)},
|
||||||
|
howpublished = {Internet Requests for Comments},
|
||||||
|
type = {RFC},
|
||||||
|
number = {6266},
|
||||||
|
year = {2011},
|
||||||
|
month = {June},
|
||||||
|
issn = {2070-1721},
|
||||||
|
publisher = {RFC Editor},
|
||||||
|
institution = {RFC Editor},
|
||||||
}
|
}
|
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 7.9 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 5.6 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 13 KiB |
169
rozdzial_3.tex
@ -1,15 +1,18 @@
|
|||||||
|
\chapter{Podstawy teoretyczne}
|
||||||
\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}
|
||||||
System zaczyna działanie od zebrania jak największej ilości danych (nazwa parafii, adres, diecezja
|
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
|
itd.) o polskich parafiach ze strony deon.pl. Następnie odpytuje api Google'a w
|
||||||
celu znalezienia adresów internetowych parafii.
|
celu znalezienia adresów internetowych parafii.
|
||||||
Dla każdej parafii dla której udało się znaleźć adres url pobierane są wszystkie
|
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.
|
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ą
|
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.
|
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
|
Ciągi znaków przypominające godziny mszy świętych zostają wydobyte ekstraktorem
|
||||||
crowdsourcing'owego}, gdzie jest annotowana jako poprawna lub niepoprawna godzina mszy świętej.
|
o bardzo niskiej precyzji i bardzo wysokim \textit{recall}.
|
||||||
|
Każda godzina wraz z kontekstem w jakim się znajduje trafia do systemu
|
||||||
|
crowdsourcingowego, gdzie jest annotowana jako poprawna lub niepoprawna godzina mszy świętej.
|
||||||
Do zannotowanych danych zostają dołączone poprawne godziny mszy świętych
|
Do zannotowanych danych zostają dołączone poprawne godziny mszy świętych
|
||||||
znalezione przez
|
znalezione przez
|
||||||
regułowy ekstraktor mszy świętych o bardzo wysokiej precyzji. Dodatkowo w celu wyrównania
|
regułowy ekstraktor mszy świętych o bardzo wysokiej precyzji. Dodatkowo w celu wyrównania
|
||||||
@ -21,18 +24,16 @@ Finalny ekstraktor godzin mszy świętych utworzony zostaje z połączenia
|
|||||||
ekstraktora regułowego z ekstraktorem opartym na uczeniu maszynowym.
|
ekstraktora regułowego z ekstraktorem opartym na uczeniu maszynowym.
|
||||||
% \bigskip
|
% \bigskip
|
||||||
|
|
||||||
% \newpage
|
|
||||||
\begin{figure}[tbh!]
|
\begin{figure}[tbh!]
|
||||||
\center
|
\center
|
||||||
\includegraphics[width=1\hsize]{struktura_wyszukiwarki.png}
|
\includegraphics[width=1\hsize]{struktura_wyszukiwarki.png}
|
||||||
\caption{Struktura ekstraktora godzin mszy świętych.}
|
\caption{Architektura ekstraktora godzin mszy świętych.}
|
||||||
\label{struktura_pic}
|
\label{struktura_pic}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
|
|
||||||
\newpage
|
\newpage
|
||||||
\section{Zbieranie informacji o parafiach}
|
\section{Zbieranie informacji o parafiach}
|
||||||
|
|
||||||
\begin{figure}[tbh!]
|
\begin{figure}[tbh!]
|
||||||
\center
|
\center
|
||||||
\includegraphics[width=0.7\hsize]{crawler_adresow_trans.png}
|
\includegraphics[width=0.7\hsize]{crawler_adresow_trans.png}
|
||||||
@ -40,7 +41,7 @@ ekstraktora regułowego z ekstraktorem opartym na uczeniu maszynowym.
|
|||||||
\end{figure}
|
\end{figure}
|
||||||
Dane zostały zebrane z serwisu internetowego deon.pl, który zawiera 10130 parafii.
|
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
|
Warto zauważyć, że deon.pl posiada większość polskich parafii, ponieważ według
|
||||||
danych statystycznych GUS z 2016 roku w Polsce było
|
danych statystycznych GUS\cite{gus} z 2016 roku w Polsce było
|
||||||
10255 parafii.
|
10255 parafii.
|
||||||
|
|
||||||
Dla każdej parafii zebrano:
|
Dla każdej parafii zebrano:
|
||||||
@ -52,12 +53,12 @@ Dla każdej parafii zebrano:
|
|||||||
\item nazwę dekanatu do którego należy,
|
\item nazwę dekanatu do którego należy,
|
||||||
\item nazwę diecezji do której przynależy.
|
\item nazwę diecezji do której przynależy.
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
Do wydobycia danych został użyty skrypt w pythonie, który korzystał z parsera
|
Do wydobycia danych użyto skryptu w pythonie, który korzystał z parsera
|
||||||
html z biblioteki BeautifulSoup. Przy wysyłaniu zapytań do serwisu deon.pl zastosowano
|
html z biblioteki \textit{BeautifulSoup}\cite{beautiful_soup}. Przy wysyłaniu zapytań do serwisu deon.pl zastosowano
|
||||||
algorym \textit{Expotential Backoff} REF, który prezentuje się następująco:
|
algorytm \textit{Expotential Backoff}\cite{expotential_backoff}, który prezentuje się następująco:
|
||||||
\begin{enumerate}
|
\begin{enumerate}
|
||||||
\item Wyślij zapytanie do serwisu.
|
\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 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
|
\item Jeśli zapytanie znów się nie powiodło odczekaj 2.25s i wyślij kolejne
|
||||||
zapytanie
|
zapytanie
|
||||||
\item W ogólności czekaj $1.5^t$ sekund zanim wyślesz kolejne zapytanie, gdzie
|
\item W ogólności czekaj $1.5^t$ sekund zanim wyślesz kolejne zapytanie, gdzie
|
||||||
@ -67,7 +68,7 @@ Dla każdej parafii zebrano:
|
|||||||
zapobiega zbyt częstemu odpytywaniu serwisu kiedy ten nie daje sobie rady ze
|
zapobiega zbyt częstemu odpytywaniu serwisu kiedy ten nie daje sobie rady ze
|
||||||
zbyt dużą liczbą zapytań.
|
zbyt dużą liczbą zapytań.
|
||||||
|
|
||||||
\begin{table}
|
\begin{table}[H]
|
||||||
\centering
|
\centering
|
||||||
\def\arraystretch{1.1}
|
\def\arraystretch{1.1}
|
||||||
\begin{tabular}{ l l l l l l }
|
\begin{tabular}{ l l l l l l }
|
||||||
@ -94,17 +95,17 @@ nazwy parafii, jej miejscowości i ulicy na której się znajduje. Wyszukiwarka
|
|||||||
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 robots.txt Google zabrania
|
dodatku w warunkach użytkowania serwisu i w robots.txt Google zabrania
|
||||||
korzystania z pająków na ich wyszukiwarce.
|
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
|
DuckDuckGo nie blokowało adresu ip, ale zabraniało crawlowania w robots.txt i słabo radziło 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.
|
||||||
\subsubsection{Rozwiązanie}
|
\subsubsection{Rozwiązanie}
|
||||||
Po wieleokrotnych próbach poszukiwań znaleziono klucz do rozwiązania problemu
|
Po wieleokrotnych próbach poszukiwań znaleziono klucz do rozwiązania problemu
|
||||||
wyszukiwania adresów url jakim jest
|
wyszukiwania adresów url jakim jest
|
||||||
\textit{Google Places Api} REF. Serwis \textit{Text Search} REF pozwala na wyszukanie miejsca
|
\textit{Google Places Api}\cite{google_api}. Serwis \textit{Text Search}\cite{text_search} pozwala na wyszukanie miejsca
|
||||||
danego obiektu na
|
danego obiektu na
|
||||||
podstawie jego nazwy. Ponadto mając już wyszukany dany obiekt i jego
|
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
|
identyfikator można odpytać serwis \textit{Place Detail}\cite{place_detail}, aby wyciągnąć więcej
|
||||||
szczegółów o danym miejscu. Między innymi można otrzymać adres url danego obiektu.
|
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
|
Jedynym minusem jest ograniczenie liczby zapytań do 1000 na 24 godziny. W
|
||||||
@ -135,11 +136,11 @@ Powyższą metodą udało się zebrać adresy url dla ok. 5600 parafii.
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
\section{\textit{Crawlowanie} stron parafialnych}
|
\section{Crawlowanie stron parafialnych}
|
||||||
|
|
||||||
\begin{figure}[tbh]
|
\begin{figure}[tbh]
|
||||||
\center
|
\center
|
||||||
\includegraphics[width=0.7\hsize]{crawler_parafii_general.png}
|
\includegraphics[width=0.7\hsize]{crawler_parafii_general_trans.png}
|
||||||
\label{crawler_parafii_general_pic}
|
\label{crawler_parafii_general_pic}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
Crawler został napisany przy użyciu biblioteki Scrapy.
|
Crawler został napisany przy użyciu biblioteki Scrapy.
|
||||||
@ -151,21 +152,21 @@ asynchronicznie wysłać wiele zapytań do serwera i odbierać wiele odpowiedzi
|
|||||||
|
|
||||||
\subsection{Komponenty pająka}
|
\subsection{Komponenty pająka}
|
||||||
\begin{description}
|
\begin{description}
|
||||||
\item [Silnik] - odpowiada za kontrolę przepływu danych i komunikację między komponentami.
|
\item [Silnik] -- odpowiada za kontrolę przepływu danych i komunikację między komponentami.
|
||||||
\item [Dyspozytor] - otrzymuje żądania od silnika, kolejkuje je i na
|
\item [Dyspozytor] -- otrzymuje żądania od silnika, kolejkuje je i na
|
||||||
prośbę silnika odsyła z powrotem.
|
prośbę silnika odsyła z powrotem.
|
||||||
\item [Downloader] - jego zadniem jest ściąganie stron parafialnych i
|
\item [Downloader] -- jego zadniem jest ściąganie stron parafialnych i
|
||||||
przekazywanie ich silnikowi.
|
przekazywanie ich silnikowi.
|
||||||
\item [Przetwarzacz danych] - zajmuje się końcową obróbką i zapisem danych.
|
\item [Przetwarzacz danych] -- zajmuje się końcową obróbką i zapisem danych.
|
||||||
\item [Spider]\footnote{Użyto angielskiej nazwy, aby rozróżnić
|
\item [Spider]\footnote{Użyto angielskiej nazwy, aby rozróżnić
|
||||||
\textit{spider'a} (komponent pająka), od pająka (cały program
|
\textit{spider'a} (komponent pająka), od pająka (cały program
|
||||||
odpowiedzialny za crawlowanie stron parafialnych).}
|
odpowiedzialny za crawlowanie stron parafialnych).}
|
||||||
- definuje sposób w jaki ściągać dane, między innymi jak parsować stronę i za jakimi
|
- definuje sposób w jaki ściągać dane, między innymi jak parsować stronę i za jakimi
|
||||||
linkami podążać.
|
linkami podążać.
|
||||||
\item [Spider middleware] - programy pośredniczące między silnkiem, a
|
\item [Spider middleware] -- programy pośredniczące między silnkiem, a
|
||||||
spider'em. Odpowiedzialne są za dodatkowe przetwarzanie danych wyjściowych
|
spider'em. Odpowiedzialne są za dodatkowe przetwarzanie danych wyjściowych
|
||||||
(dane parafialne i żądania) i wejściowych (odpowiedzi) spider'a.
|
(dane parafialne i żądania) i wejściowych (odpowiedzi) spider'a.
|
||||||
\item [Downloader middleware] - programy pośredniczące między silnikiem, a
|
\item [Downloader middleware] -- programy pośredniczące między silnikiem, a
|
||||||
downloader'em. Zajmują się dodatkowym przetwarzaniem danych wejściowych
|
downloader'em. Zajmują się dodatkowym przetwarzaniem danych wejściowych
|
||||||
(żądań) i wyjściowych (odpowiedzi) downloader'a.
|
(żądań) i wyjściowych (odpowiedzi) downloader'a.
|
||||||
|
|
||||||
@ -174,7 +175,8 @@ asynchronicznie wysłać wiele zapytań do serwera i odbierać wiele odpowiedzi
|
|||||||
\subsection{Przepływ danych}
|
\subsection{Przepływ danych}
|
||||||
|
|
||||||
Przepływ danych kontrolowany jest przez
|
Przepływ danych kontrolowany jest przez
|
||||||
silnik i prezentuje się następująco:
|
silnik i prezentuje się następująco\footnote{Diagram i opis wzorowany jest na
|
||||||
|
dokumentacji znajdującej się pod linkiem https://doc.scrapy.org/en/latest/topics/architecture.html}:
|
||||||
|
|
||||||
\begin{figure}[tbh]
|
\begin{figure}[tbh]
|
||||||
\center
|
\center
|
||||||
@ -201,7 +203,7 @@ silnik i prezentuje się następująco:
|
|||||||
trafią do silnika przechodzą przez spider middleware. Dodatkowo spider
|
trafią do silnika przechodzą przez spider middleware. Dodatkowo spider
|
||||||
wysła żądania z nowymi stronami parafialnymi do pobrania.
|
wysła żądania z nowymi stronami parafialnymi do pobrania.
|
||||||
\item Silnik wysyła zebrane dane do przetwarzacza danych, który zapisuje je w
|
\item Silnik wysyła zebrane dane do przetwarzacza danych, który zapisuje je w
|
||||||
pliku jsonline REF. Następnie przekazuje nowe żądania do zakolejkowania
|
pliku jsonline\cite{jsonline}. Następnie przekazuje nowe żądania do zakolejkowania
|
||||||
dyspozytorowi.
|
dyspozytorowi.
|
||||||
\end{enumerate}
|
\end{enumerate}
|
||||||
% \vspace*{-20mm}
|
% \vspace*{-20mm}
|
||||||
@ -210,13 +212,13 @@ silnik i prezentuje się następująco:
|
|||||||
\subsection{Sprawdzanie typu odpowiedzi}
|
\subsection{Sprawdzanie typu odpowiedzi}
|
||||||
Podczas crawlowania ważne jest rozpoznawanie typu ściąganych danych. W przypadku
|
Podczas crawlowania ważne jest rozpoznawanie typu ściąganych danych. W przypadku
|
||||||
crawlowania stron parafialnych interesują nas wyłącznie dane tekstowe. Należy
|
crawlowania stron parafialnych interesują nas wyłącznie dane tekstowe. Należy
|
||||||
zatem zadbać o to aby nie pobierać danych binarnych takich jak np. video, audio
|
zatem zadbać o to, aby nie pobierać danych binarnych takich jak np. video, audio
|
||||||
i obrazy.
|
i obrazy.
|
||||||
|
|
||||||
Scrapy obsługuje rozpoznawanie typu zawartości odpowiedzi bazując na
|
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ściach \mintinline{bash}{Content-type}, \mintinline{bash}{Content-Encoding} i \mintinline{bash}{Content-Disposition} w nagłówku odpowiedzi,
|
\item wartościach \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 analizując pierwsze 5000 bajtów zawartości odpowiedzi w poszukiwaniu
|
\item analizując pierwsze 5000 bajtów zawartości odpowiedzi w poszukiwaniu
|
||||||
znaków znajdującyh się wyłącznie w plikach binarnych (jeśli nie udało się
|
znaków znajdującyh się wyłącznie w plikach binarnych (jeśli nie udało się
|
||||||
@ -224,11 +226,10 @@ następujących kryteriach:
|
|||||||
\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 są niezgodne z
|
odpowiedzi, które są niezgodne z rozdziałem 3.1 z RFC7231\cite{RFC7231}.
|
||||||
https://tools.ietf.org/html/rfc7231 section-3.1.1.5.
|
Dla przykładu, strona potrafi zwrócić \mintinline{bash}{Content-Type: text/html}, a w \mintinline{bash}{body} binarną
|
||||||
UZU Dla przykładu potrafi zwórcić \mintinline{bash}{Content-Type: text/html}, a w \mintinline{bash}{body} binarną
|
zawartość np. film. Tego rodzaju anomalie są wykrywane i eliminowane.
|
||||||
zawartość np. film.
|
Stosując następujący algorytm\cite{binaryornot} można określić typ zawartości \mintinline{bash}{body}:
|
||||||
Ze względu na tego rodzaju anomalie zastosowano następujący algorytm REF.
|
|
||||||
|
|
||||||
|
|
||||||
\enlargethispage{4\baselineskip}
|
\enlargethispage{4\baselineskip}
|
||||||
@ -282,8 +283,8 @@ regulować częstość zapytań w zależności od obciążenia crawler'a i stron
|
|||||||
\begin{enumerate}
|
\begin{enumerate}
|
||||||
\item Przyjmijmy, że:
|
\item Przyjmijmy, że:
|
||||||
|
|
||||||
\subitem {\makebox[4.55cm][l]{\mintinline{python}{download_delay}\footnote{Czasy oczekiwania i
|
\subitem {\makebox[4.55cm][l]{\mintinline{python}{download_delay}}} to opóźnienie\footnote{Czasy oczekiwania i
|
||||||
opóźnienia liczone są w sekudnach.}}} to opóźnienie wysłania
|
opóźnienia liczone są w sekudnach.} wysłania
|
||||||
zapytania.
|
zapytania.
|
||||||
\subitem \mintinline{python}{target_download_delay} to docelowe
|
\subitem \mintinline{python}{target_download_delay} to docelowe
|
||||||
opóźnienie zapytania.
|
opóźnienie zapytania.
|
||||||
@ -298,10 +299,11 @@ regulować częstość zapytań w zależności od obciążenia crawler'a i stron
|
|||||||
|
|
||||||
\item Zacznij z \mintinline{python}{download_delay} równym \mintinline{python}{init_download_delay}.
|
\item Zacznij z \mintinline{python}{download_delay} równym \mintinline{python}{init_download_delay}.
|
||||||
\item Kiedy odpowiedź jest odebrana, \\ustaw
|
\item Kiedy odpowiedź jest odebrana, \\ustaw
|
||||||
\mintinline{python}{target_download_delay = latency / target_concurrency}
|
\mintinline{python}{target_download_delay = latency / target_concurrency}.
|
||||||
\item Następne \mintinline{python}{download_delay} ustaw jako średnią z
|
\item Następne \mintinline{python}{download_delay} ustaw jako średnią z
|
||||||
aktualnego \mintinline{python}{download_delay} i \mintinline{python}{target_download_delay}.
|
aktualnego \mintinline{python}{download_delay} i \mintinline{python}{target_download_delay}.
|
||||||
\item \mintinline{python}{download_delay} nie może być mniejszy niż i większy niż .
|
\item \mintinline{python}{download_delay} nie może być mniejszy niż
|
||||||
|
\mintinline{python}{min_download_delay} i większy niż \mintinline{python}{max_download_delay}.
|
||||||
\item Czasy oczekiwania na odpowiedzi z kodem http różnym od 2xx nie są brane
|
\item Czasy oczekiwania na odpowiedzi z kodem http różnym od 2xx nie są brane
|
||||||
pod uwagę.
|
pod uwagę.
|
||||||
\end{enumerate}
|
\end{enumerate}
|
||||||
@ -316,30 +318,103 @@ regulować częstość zapytań w zależności od obciążenia crawler'a i stron
|
|||||||
|
|
||||||
|
|
||||||
\subsection{Crawlowanie wieloprocesorowe}
|
\subsection{Crawlowanie wieloprocesorowe}
|
||||||
Pająk został zaprojektowany w ten sposób, aby bardzo łatwo można było
|
\begin{figure}[tbh!]
|
||||||
urównoleglić ściąganie stron parafialnych.
|
|
||||||
Z pomocą GNU parallel crawlowane jest jednocześnie 100 parafii.
|
|
||||||
|
|
||||||
\begin{figure}[tbh]
|
|
||||||
\center
|
\center
|
||||||
\includegraphics[width=0.7\hsize]{crawler.png}
|
\includegraphics[width=0.72\hsize]{crawler.png}
|
||||||
\caption{100 crawlerów pracujących jednocześnie.}
|
\caption{100 crawlerów pracujących jednocześnie.}
|
||||||
\label{crawler_pic}
|
\label{crawler_pic}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
Pająk został zaprojektowany w ten sposób, aby bardzo łatwo można było
|
||||||
|
urównoleglić ściąganie stron parafialnych.
|
||||||
|
Z pomocą GNU parallel\cite{parallel} crawlowane jest jednocześnie 100 parafii. Gdy jedna ze stu
|
||||||
|
parafii zostanie ściągnięta, zastępuje ją kolejna parafia. Tym sposobem przez
|
||||||
|
prawie cały czas równolegle pracuje 100 crawlerów. Takie podejście pozwoliło
|
||||||
|
maksymalnie wykorzystać łącze internetowe, które było wąskim gardłem w procesie
|
||||||
|
crawlowania stron parafialnych.
|
||||||
|
|
||||||
|
|
||||||
|
\subsection{Organizacja danych}
|
||||||
|
Mały podrozdział do zrobienia lub pominięcia.
|
||||||
|
|
||||||
\subsection{Konwersja html na tekst.}
|
\subsection{Konwersja html na tekst.}
|
||||||
|
\begin{figure}[tbh]
|
||||||
|
\center
|
||||||
|
\includegraphics[width=0.6\hsize]{html2text_trans.png}
|
||||||
|
\label{hmlt2text_pic}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
Do konwersji z formatu html na format tekstowy wykorzystano bibliotekę \mintinline{bash}{html2text}\cite{html2text}
|
||||||
|
pierwotnie rozwijaną przez słynnego programistę Aarona Schwartza.
|
||||||
|
\mintinline{bash}{html2text} konwertuje html na czysty, czytelny tekst w
|
||||||
|
formacie Markdown\cite{markdown}. Biblioteka oferuje wiele opcji do kontroli
|
||||||
|
konwersji i jest bardzo łatwa w modyfikacji.
|
||||||
|
|
||||||
|
\smallskip
|
||||||
|
\noindent Zastosowano następujące opcje i modyfikacje przy konwersji:
|
||||||
|
\vspace{-2mm}
|
||||||
|
\begin{itemize}
|
||||||
|
% \setlength{\itemsep}{1pt}
|
||||||
|
\item ignorowanie linków, tabel i obrazków,
|
||||||
|
\item usunięto znaki odpowiedzialne za pogrubienie i kurysywę tekstu,
|
||||||
|
\item usunięto znaki odpowiedzialne za tworzenie list.
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\section{Ekstraktor godzin}
|
||||||
|
\begin{figure}[tbh!]
|
||||||
|
\center
|
||||||
|
\includegraphics[width=0.6\hsize]{general_ekstraktor.png}
|
||||||
|
\label{general_ekstraktor_pic}
|
||||||
|
\end{figure}
|
||||||
|
Ekstraktor godzin służy do znajdowania bardzo ogólnych ciągów znaków mogących
|
||||||
|
być godzinami rozpoczęcia mszy świętych. Został napisany z myślą, aby miał
|
||||||
|
bardzo wysoki recall, ale już niekoniecznie wysoką precyzję.
|
||||||
|
Celem jest,
|
||||||
|
aby w zbiorze wykestrahowanych godzin znalazło się jak najwięcej godzin
|
||||||
|
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
|
||||||
|
zajdzie każdy z poniżych warunków:
|
||||||
|
\begin{enumerate}
|
||||||
|
\item \mintinline{bash}{hour} pasuje do wyrażenia regularnego \\ \mintinline{text}{(0?[6-9]|1\d|2[0-2])[:.](oo|[0-5]\d)|6|7|8|9|1\d|2[0-2]};
|
||||||
|
\item Znak przed \mintinline{bash}{hour} zawiera się w
|
||||||
|
\mintinline{python}{{',', '('}};
|
||||||
|
\item Znak po \mintinline{bash}{hour} zawiera się w
|
||||||
|
\mintinline{python}{{',', ')', ';'}};
|
||||||
|
\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}
|
||||||
|
|
||||||
|
|
||||||
\section{System crowdsourcingowy}
|
\section{System crowdsourcingowy}
|
||||||
\section{Ekstraktor regułowy}
|
\begin{figure}[tbh!]
|
||||||
\section{Ekstraktor oparty na uczeniu maszynowym}
|
\center
|
||||||
|
\includegraphics[width=0.6\hsize]{annotator.png}
|
||||||
|
\label{annotator_pic}
|
||||||
|
\end{figure}
|
||||||
|
System crowdsourcingowy 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.
|
||||||
|
|
||||||
|
Do dokończenia
|
||||||
|
|
||||||
|
\section{Regułowy ekstraktor godzin mszy}
|
||||||
|
Do napisania
|
||||||
|
\section{Ekstraktor godzin mszy oparty na uczeniu maszynowym}
|
||||||
|
Do napisania
|
||||||
|
\subsection{Model teoretyczny}
|
||||||
|
\subsection{FastText}
|
||||||
|
|
||||||
|
|
||||||
\chapter{Rezultaty}
|
\chapter{Rezultaty}
|
||||||
|
Do napisania
|
||||||
% \section{Organizacja danych} % może zbyt inżynierskieby
|
% \section{Organizacja danych} % może zbyt inżynierskieby
|
||||||
|
|
||||||
\chapter{Perspektywy na przyszłość}
|
\chapter{Perspektywy na przyszłość}
|
||||||
|
Do napisania
|
||||||
|
|
||||||
\chapter{Podsumowanie}
|
\chapter{Podsumowanie}
|
||||||
|
Do napisania
|
||||||
|
|
||||||
% \subsection{Ewaluacja wewnętrzna} %F1 score
|
% \subsection{Ewaluacja wewnętrzna} %F1 score
|
||||||
% \subsection{Ewaluacja zewnętrzna} % w systemie webowym, użytkownicy
|
% \subsection{Ewaluacja zewnętrzna} % w systemie webowym, użytkownicy
|
||||||
|