Poprawiony drugi rozdział. Dodany skrypt dla beeminder'a.
This commit is contained in:
parent
3339af9f87
commit
f1eaaaa2c3
11
beeminder.sh
Executable file
11
beeminder.sh
Executable file
@ -0,0 +1,11 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
(cat master.tex
|
||||||
|
cat strona_tytulowa.tex
|
||||||
|
cat oswiadczenie.tex
|
||||||
|
cat pakiety.tex
|
||||||
|
cat ustawienia.tex
|
||||||
|
cat rozdzial_*.tex
|
||||||
|
cat streszczenie.tex
|
||||||
|
cat abstract.tex
|
||||||
|
cat wstep.tex
|
||||||
|
cat bibliografia.bib) > beeminder.txt
|
557
beeminder.txt
Normal file
557
beeminder.txt
Normal file
@ -0,0 +1,557 @@
|
|||||||
|
\thispagestyle{empty}
|
||||||
|
\begin{figure}[h!]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.25\hsize]{uam_logo.jpg}
|
||||||
|
\end{figure}
|
||||||
|
\begin{center}
|
||||||
|
\Large{Uniwersytet im. A. Mickiewicza w Poznaniu} \\
|
||||||
|
\large{Wydział Matematyki i Informatyki}\\
|
||||||
|
%\vskip0.2in
|
||||||
|
\large{Praca magisterska}\\
|
||||||
|
\large{\textbf{Ekstrakcja informacji o godzinach rozpoczęcia mszy świętych}}\\
|
||||||
|
\normalsize{\textbf{Extracting information about church services start times}}\\
|
||||||
|
%\normalsize{\textbf{}}
|
||||||
|
\end{center}
|
||||||
|
%\vskip0.1in
|
||||||
|
\begin{center}
|
||||||
|
\Large{Dawid Jurkiewicz}\\
|
||||||
|
\normalsize{Numer albumu: 396341 }\\
|
||||||
|
\normalsize{Kierunek: Informatyka}\\
|
||||||
|
\normalsize{Specjalność: Przetwarzanie języka naturalnego}
|
||||||
|
%\Large{Imię Nazwisko}\\
|
||||||
|
%\normalsize{Numer albumu: xxxxxx}\\
|
||||||
|
%\normalsize{Kierunek: Informatyka, Specjalność: xxxxxxxxxxxxxxxxxx}
|
||||||
|
\end{center}
|
||||||
|
%\vskip1.5in
|
||||||
|
\begin{flushright}
|
||||||
|
Promotor: \\
|
||||||
|
prof. UAM, dr hab. Krzysztof Jassem \\
|
||||||
|
\end{flushright}
|
||||||
|
|
||||||
|
\vfill
|
||||||
|
|
||||||
|
\begin{center}
|
||||||
|
\rm Poznań, 2018
|
||||||
|
\end{center}
|
||||||
|
\newpage
|
||||||
|
\thispagestyle{empty}
|
||||||
|
\newgeometry{bottom=0pt}
|
||||||
|
\begin{flushright}
|
||||||
|
Poznań, dnia \today
|
||||||
|
\end{flushright}
|
||||||
|
\vskip0.7in
|
||||||
|
\begin{center}
|
||||||
|
\large \textbf{Oświadczenie}
|
||||||
|
\end{center}
|
||||||
|
\begin{small}
|
||||||
|
Ja, niżej podpisany Dawid Jurkiewicz, student Wydziału Matematyki i Informatyki Uniwersytetu im. Adama Mickiewicza w Poznaniu oświadczam, że przedkładaną pracę dyplomową pt.
|
||||||
|
|
||||||
|
\begin{center}
|
||||||
|
\textit{„Ekstrakcja informacji o godzinach rozpoczęcia mszyświętych”,}
|
||||||
|
\end{center}
|
||||||
|
|
||||||
|
%rozdziały:
|
||||||
|
|
||||||
|
%\begin{center}
|
||||||
|
%\textit{od 1 do 5}
|
||||||
|
%\end{center}
|
||||||
|
|
||||||
|
napisałem samodzielnie. Oznacza to, że przy pisaniu pracy, poza niezbędnymi konsultacjami, nie korzystałem z pomocy innych osób, a w szczególności nie zlecałem opracowania rozprawy lub jej części innym osobom, ani nie odpisywałem tej rozprawy lub jej części od innych osób.
|
||||||
|
|
||||||
|
Oświadczam również, że egzemplarz pracy dyplomowej w wersji drukowanej jest całkowicie zgodny z egzemplarzem pracy dyplomowej w wersji elektronicznej.
|
||||||
|
|
||||||
|
Jednocześnie przyjmuję do wiadomości, że przypisanie sobie, w pracy dyplomowej, autorstwa istotnego fragmentu lub innych elementów cudzego utworu lub ustalenia naukowego stanowi podstawę stwierdzenia nieważności postępowania w sprawie nadania tytułu zawodowego.
|
||||||
|
|
||||||
|
[\qquad]* - wyrażam zgodę na udostępnianie mojej pracy w czytelni Archiwum UAM
|
||||||
|
|
||||||
|
[\qquad]* - wyrażam zgodę na udostępnianie mojej pracy w zakresie koniecznym do ochrony mojego prawa do autorstwa lub praw osób trzecich
|
||||||
|
\end{small}
|
||||||
|
|
||||||
|
\begin{scriptsize}
|
||||||
|
*Należy wpisać TAK w przypadku wyrażenia zgody na udostępnianie pracy w czytelni Archiwum UAM, NIE w przypadku braku zgody. Niewypełnienie pola oznacza brak zgody na udostępnianie pracy.
|
||||||
|
\end{scriptsize}
|
||||||
|
|
||||||
|
\begin{flushright}
|
||||||
|
......................................................
|
||||||
|
\end{flushright}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
\restoregeometry\usepackage[OT4]{polski} % tryb pelnej polonizacji
|
||||||
|
\usepackage[utf8]{inputenc} % kodowanie
|
||||||
|
\usepackage{makeidx} % indeks
|
||||||
|
\usepackage[pdftex]{graphicx} % zalaczanie grafiki
|
||||||
|
\usepackage{tikz} % grafika wektorowa
|
||||||
|
|
||||||
|
\usepackage{setspace} % interlinia
|
||||||
|
|
||||||
|
\usepackage{hyperref} % wewnetrzne odnosniki w dokumencie
|
||||||
|
|
||||||
|
\usepackage{listings} % kody zrodlowe
|
||||||
|
\usepackage{fancyhdr} % zywe paginy smierci
|
||||||
|
|
||||||
|
\usepackage{tocloft} % format spisu tresci
|
||||||
|
%\usepackage{array} % ladniejsze tabelki
|
||||||
|
\usepackage{multirow} % laczenie wierszy w tabelach
|
||||||
|
\usepackage[tableposition=top,format=hang,labelsep=period,labelfont={bf,small},textfont=small]{caption}
|
||||||
|
% formatuje podpisy pod rysunkami i tabelami, format=hang powoduje,
|
||||||
|
% ze kolejne linie podpisu beda wciete az do odleglosci nazwy podpisu np. "Rysunek 1."
|
||||||
|
\usepackage{floatflt} % ladne oplywanie obrazkow tekstem
|
||||||
|
\usepackage{url} % url w bibliografii
|
||||||
|
\usepackage{amsmath}
|
||||||
|
|
||||||
|
\usepackage{tabularx} %lepsze tabele nie uzywane
|
||||||
|
\usepackage{makecell} % do formatowania cell w tabelach
|
||||||
|
\usepackage{geometry}
|
||||||
|
% \usepackage{minted} %kolorowanie kodu
|
||||||
|
\usepackage{subfig}
|
||||||
|
|
||||||
|
\usepackage{float} % to use H option in figures
|
||||||
|
|
||||||
|
\usepackage[shortlabels]{enumitem} % bold numbers in enumerate
|
||||||
|
|
||||||
|
\usepackage{titling}
|
||||||
|
|
||||||
|
\usepackage{afterpage}% ------------------------------------------------------------------------
|
||||||
|
% Kropki po numerach sekcji, podsekcji, itd.
|
||||||
|
% Np. 1.2. Tytul podrozdzialu
|
||||||
|
% ------------------------------------------------------------------------
|
||||||
|
\makeatletter
|
||||||
|
\def\numberline#1{\hb@xt@\@tempdima{#1.\hfil}} %kropki w spisie tresci
|
||||||
|
\renewcommand*\@seccntformat[1]{\csname the#1\endcsname.\enspace} %kropki w tresci dokumentu
|
||||||
|
\makeatother
|
||||||
|
|
||||||
|
%numerowanie tabel:
|
||||||
|
%\renewcommand{\thetable}{\thechapter.\arabic{figure}}
|
||||||
|
|
||||||
|
|
||||||
|
%
|
||||||
|
%twierdzenia, definicje i lematy
|
||||||
|
%
|
||||||
|
\newtheorem{defin}{Definicja}
|
||||||
|
\newtheorem{twr}{Twierdzenie}
|
||||||
|
\newtheorem{lem}[twr]{Lemat}
|
||||||
|
|
||||||
|
% ------------------------------------------------------------------------
|
||||||
|
% Inne
|
||||||
|
% ------------------------------------------------------------------------
|
||||||
|
\frenchspacing
|
||||||
|
\setlength{\parskip}{3pt} % odstep pom. akapitamia
|
||||||
|
\linespread{1.49} % odstep pomiedzy liniami (interlinia)
|
||||||
|
%\onehalfspacing
|
||||||
|
|
||||||
|
\setcounter{tocdepth}{2} % stopien zaglebienia w spisie tresci
|
||||||
|
\setcounter{secnumdepth}{2} % do jakiego stopnia zaglebienia numeracja
|
||||||
|
|
||||||
|
% polskie podpisy
|
||||||
|
\renewcommand{\figurename}{Rys.}
|
||||||
|
\renewcommand{\tablename}{Tab.}
|
||||||
|
|
||||||
|
%paginy zywe smierci
|
||||||
|
\pagestyle{fancy}
|
||||||
|
% zmiana liter w~zywej paginie na ma<6D>e
|
||||||
|
\renewcommand{\chaptermark}[1]{\markboth{#1}{}}
|
||||||
|
\renewcommand{\sectionmark}[1]{\markright{\thesection\ #1}}
|
||||||
|
\fancyhf{} % usun biezace ustawienia pagin
|
||||||
|
\fancyhead[LE,RO]{\small\bfseries\thepage}
|
||||||
|
\fancyhead[LO]{\small\bfseries\rightmark}
|
||||||
|
\fancyhead[RE]{\small\bfseries\leftmark}
|
||||||
|
\renewcommand{\headrulewidth}{0.5pt}
|
||||||
|
\renewcommand{\footrulewidth}{0pt}
|
||||||
|
\addtolength{\headheight}{0.5pt} % pionowy odstep na kreske
|
||||||
|
\fancypagestyle{plain}{%
|
||||||
|
\fancyhead{} % usun p. g<>rne na stronach pozbawionych
|
||||||
|
% numeracji (plain)
|
||||||
|
\renewcommand{\headrulewidth}{0pt} % pozioma kreska
|
||||||
|
} \chapter{Podstawowe pojęcia}
|
||||||
|
\chapter{Metody ekstrakcji informacji}
|
||||||
|
% w kontekście mojego projektu
|
||||||
|
W tym rozdziale zaprezentowane są wybrane metody,
|
||||||
|
które brane były pod uwagę lub zostały zastosowane
|
||||||
|
w opisywanym tutaj systemie ekstrakcji informacji o godzinach rozpoczęcia mszy świętych.
|
||||||
|
\section {Algorytmy \textit{bootstraping}}
|
||||||
|
Niech $J$ będzie dowolną reprezentacją języka (wyraz, fraza, wyrażenie
|
||||||
|
regularne itp.).
|
||||||
|
W dziedzinie przetwarzania języka naturalnego \textit{bootstraping} to technika
|
||||||
|
wyszukiwania niezanotowanych (nieprzypisanych do badanej klasy) $J$ przy użyciu małego zbioru specjalnie
|
||||||
|
wyselekcjonowanych zanotowanych $J$.
|
||||||
|
Implementacji algorytmu \textit{bootstraping} jest wiele, wszystkie jednak
|
||||||
|
oparte są na następującym schemacie \cite{Bootstrap}:
|
||||||
|
\enlargethispage{4\baselineskip}
|
||||||
|
\begin{enumerate}
|
||||||
|
\item Stwórz pustą listę reprezentacji języka $J$. % pusta lista $J$, pusta lista wyrazów, pusta
|
||||||
|
% lista fraz
|
||||||
|
\item Zainicjalizuj listę starannie dobranymi $J$.
|
||||||
|
\item Wykorzystaj elementy listy do znalezienia nowych $J$ z korpusu treningowego.
|
||||||
|
\item Oceń nowe $J$; najlepsze $J$ dodaj do listy.
|
||||||
|
\item Wróć do 3. i powtarzaj aż do osiągnięcia z góry określonej liczby iteracji
|
||||||
|
\newline lub
|
||||||
|
spełnienia innego warunku stopu.
|
||||||
|
|
||||||
|
\end{enumerate}
|
||||||
|
% \textit{Bootstraping} jest szczególnie przydatny w przypadku, gdy mamy mały
|
||||||
|
% zbiór treningowy, ponieważ z jego pomocą jesteśmy w stanie powiększyć zbiór
|
||||||
|
% treningowy. %todo poprawić
|
||||||
|
|
||||||
|
|
||||||
|
\subsection{Wzorce Hearst}
|
||||||
|
Jednymi z pierwszych implementacji algorytmu \textit{bootstraping} w dziedzinie
|
||||||
|
ekstrakcji informacji
|
||||||
|
są wzorce Hearst \textit{(ang. Hearst patterns)} \cite{Hearst}.
|
||||||
|
|
||||||
|
\smallskip
|
||||||
|
\noindent Znajdowanie nowych przykładów uczących za pomocą wzorców Hearst przedstawia się
|
||||||
|
następująco:
|
||||||
|
|
||||||
|
\begin{enumerate}
|
||||||
|
\item Wybierz relację leksykalną $R$.
|
||||||
|
\item Utwórz początkowy zbiór $S$ par $(x, y)\in R$, gdzie $x$ i $y$ to słowa lub frazy.
|
||||||
|
\item Znajdź zdania, które zawierają pary ze zbioru $S$.
|
||||||
|
\item Przyjrzyj się kontekstowi, w jakim występują te pary. Załóż, że często powtarzające się wzorce reprezentują relację R.
|
||||||
|
\item Wykorzystaj nowo odkryte wzorce do znalezienia kolejnych par $(x, y)\in R$.
|
||||||
|
\item Dodaj nowo znalezione pary do zbioru $S$, wróć do 3. i powtarzaj aż do osiągnięcia z góry określonej liczby iteracji.
|
||||||
|
\end{enumerate}
|
||||||
|
|
||||||
|
\enlargethispage{4\baselineskip}
|
||||||
|
\subsubsection{Przykład}
|
||||||
|
Rozważmy relację R taką, że $(x, y) \in R$ wtedy, gdy $x$ został pochowany w
|
||||||
|
$y$.
|
||||||
|
Załóżmy, że zaczynamy z parą \texttt{('Józef Piłsudski', 'Kraków')}$\in R$.
|
||||||
|
W korpusie treningowym szukamy zdań zawierających w sobie parę \texttt{('Józef
|
||||||
|
Piłsudski', 'Kraków')} i otrzymujemy zdania takie jak:
|
||||||
|
|
||||||
|
\centerline{„Józef Piłsudski został pochowany w Krakowie.”}
|
||||||
|
\centerline{„Miejsce pochówku Józefa Piłsudskiego to Kraków.”}
|
||||||
|
\centerline{„Grób Józefa Piłsudskiego znajduje się w Krakowie.”}
|
||||||
|
|
||||||
|
\noindent Ze znalezionych zdań tworzymy następujące wzorce:
|
||||||
|
|
||||||
|
\centerline{$x$ został pochowany w $y$.}
|
||||||
|
\centerline{Miejsce pochówku $x$ to $y$.}
|
||||||
|
\centerline{Grób $x$ znajduje się w $y$.}
|
||||||
|
|
||||||
|
\noindent Wykorzystujemy powyższe wzorce do znalezienia nowych par będących w relacji $R$, przykładowo:
|
||||||
|
% i otrzymujemy:
|
||||||
|
|
||||||
|
\centerline{\texttt{('Witold Doroszweski, 'Warszawa')}}
|
||||||
|
\centerline{\texttt{('Jana Długosz', 'Zakopane')}}
|
||||||
|
|
||||||
|
\noindent Następnie szukamy zdań w których występują powyższe pary, na przykład:
|
||||||
|
|
||||||
|
\centerline{„Witold Doroszewski spoczywa w Warszawie.”}
|
||||||
|
\centerline{„Na cmentarzu w Zakopanem mieści
|
||||||
|
się grób Jana Długosza.”}
|
||||||
|
|
||||||
|
\noindent Z nowo otrzymanych zdań tworzymy poniższe wzorce:
|
||||||
|
|
||||||
|
\centerline{$x$ spoczywa w $y$.}
|
||||||
|
\centerline{Na cmentarzu w $y$ mieści się grób $x$.}
|
||||||
|
|
||||||
|
\noindent Powtarzamy powyższy algorytm aż do osiągnięcia określonej liczby iteracji.
|
||||||
|
|
||||||
|
|
||||||
|
% \subsection{Miejsce na opis bardziej skomplikowanej metody implementującej
|
||||||
|
% algorytm \textit{bootstraping}}
|
||||||
|
|
||||||
|
\section{Automatyczne generowanie wyrażeń regularnych za pomocą algorytmów genetycznych}
|
||||||
|
W 2015 roku Bartoli i in. zaprezentowali efektywny algorytm genetyczny do generowania
|
||||||
|
wzorców zapisanch w
|
||||||
|
postaci wyrażeń regularnych przy użyciu niewielkiego zbioru zanotowanych
|
||||||
|
przykładów (fraz oznaczonych jako pasujące do wyrażeń regularnych) \cite{genetic}. Nowością było zastosowanie metody „dziel i zwyciężaj”.
|
||||||
|
Zamiast uczyć się jednego wyrażenia regularnego, które znajdowałoby wszystkie
|
||||||
|
przykłady, system uczy się wielu różnych wzorców, które dopiero po połączeniu
|
||||||
|
alternatywą tworzą
|
||||||
|
ostateczne wyrażenie regularne.
|
||||||
|
% Problem automatycznego generowania wyrażeń regularnych jest złożony. Warto zauważyć, że % bardzo łatwo wytrenować na zbiorze treningowym system, który znajdzie wzorzec o bardzo wysokiej precyzji i niskiej % czułości (np. wystarczy alternatywa, której składnikami są wszystkie zanotowane przykłady), ale szczególnie trudno wytrenować system tak, aby generalizował się na przypadki poza % zbiorem treningowym (innymi słowy taki system łatwo przetrenować). %(otrzymali wyniki bardzo zadowalające wyniki ) tabela wyników
|
||||||
|
\subsection{Opis problemu}
|
||||||
|
Niech $x_s$ będzie spójnym podciągiem ciągu znaków $s$ reprezentowanym przez
|
||||||
|
indeks początkowy i końcowy w $s$. Dla ułatwienia, w przykładach $x_s$ będziemy
|
||||||
|
reprezentować przez zawartość i indeks początkowy.
|
||||||
|
\enlargethispage{1\baselineskip}
|
||||||
|
Na przykład $x_s=\texttt{ku}_0$, $x'_s=\texttt{ku}_2$, $x''_s=\texttt{kuku}_0$, $x'''_s=\texttt{łka}_4$ to spójne podciągi ciągu znaków $s=\texttt{kukułka}$.
|
||||||
|
$x_s$ nazywa się nadłańcuchem $x'_s$ (a $x'_s$ jest podłańcuchem $x_s$),
|
||||||
|
jeśli (i) $x'_s$ jest krótszy niż $x_s$, (ii) indeks początkowy $x'_s$ jest
|
||||||
|
nie mniejszy niż indeks początkowy $x_s$ oraz (iii) indeks końcowy $x'_s$
|
||||||
|
jest nie większy niż indeks końcowy $x_s$. Na przykład $\texttt{ku}_0$
|
||||||
|
jest podłańcuchem $\texttt{kuku}_0$.
|
||||||
|
Mówi się, że $x_s$ nachodzi na $x'_s$ (lub $x'_s$ nachodzi na $x_s$), jeśli (i) indeks początkowy $x_s$ jest
|
||||||
|
nie większy niż indeks końcowy $x'_s$ oraz (ii) indeks końcowy $x_s$ jest nie
|
||||||
|
mniejszy niż indeks początkowy $x'_s$.
|
||||||
|
|
||||||
|
Niech $(s,X)$ będzie przykładem uczącym, w którym $X$ to zbiór
|
||||||
|
nienachodzących na siebie $x_s$.
|
||||||
|
|
||||||
|
Jako $e(s,P)$ oznacza się zbiór wszystkich ciągów $x_s$
|
||||||
|
wyekstrahowanych poprzez zbiór wyrażeń regularnych $P$, taki że (i)
|
||||||
|
$x_s$
|
||||||
|
pasuje do jakiegokolwiek wyrażenia regularnego $p\in P$, (ii) każdy nadłańcuch
|
||||||
|
$x'_s$ ciągu $x_s$ nie pasuje do żadnego wyrażenia regularnego $p\in P$
|
||||||
|
oraz (iii) dla każdego ciągu $x''_s\neq x_s$, który nachodzi na
|
||||||
|
$x_s$, indeks początkowy $x''_s$ jest większy od indeksu początkowego $x_s$
|
||||||
|
albo $x''_s$ nie pasuje do żadnego $p\in P$.
|
||||||
|
Między innymi dla $s=\texttt{abcde}\textvisiblespace \texttt{a}$ i
|
||||||
|
$P=\{\texttt{a}, \texttt{bc}, \texttt{cde}, \texttt{de}\}$
|
||||||
|
$e(s,P)=\{a_0, a_6, bc_1\}$. Należy zwrócić uwagę, że $de_3 \notin e(s,P)$ i $cde_2 \notin e(s,P)$, ponieważ nie spełniają one kolejno warunków (ii) oraz (iii).
|
||||||
|
|
||||||
|
Mając dwa zbiory anotowanych przykładów $(E, E')$, zbiór wyrażeń
|
||||||
|
regularnych $P$ generowany jest używając
|
||||||
|
tylko i wyłącznie $E$ w taki sposób, że (i) maksymalizowana jest średnia harmoniczna z precyzji i
|
||||||
|
pokrycia (ang. \textit{recall}) na $E'$ oraz (ii) minimalizowana jest $\sum_{p\in
|
||||||
|
P}{l(p)}$, gdzie $l(p)$ to długość wyrażenia regularnego $p$.
|
||||||
|
Wtedy precyzja i pokrycie definiowane są w następujący sposób:
|
||||||
|
|
||||||
|
$$Prec(P, E'):=\frac{\sum_{(s,X)\in E'}{|e(s,P) \cup X|}}{\sum_{(s,X)\in E'}{|e(s,P)|}}$$
|
||||||
|
$$Rec(P, E'):=\frac{\sum_{(s,X)\in E'}{|e(s,P) \cup X|}}{\sum_{(s,X)\in E'}{|X|}}$$
|
||||||
|
|
||||||
|
\subsection{Szczegóły algorytmu genetycznego}
|
||||||
|
|
||||||
|
Na wejściu do algorytmu genetycznego podawany jest zbiór treningowy $T$, a na
|
||||||
|
wyjściu otrzymuje się pojedyncze wyrażenie regularne $p$.
|
||||||
|
Zbiór treningowy $E$ składa się z trójki uporządkowanej $(s,X_d,X_u)=(s,X)$,
|
||||||
|
gdzie $X_d$ to zbiór pożądanych ciągów $x_s$ ekstrahowanych przez $p$, a
|
||||||
|
$X_u$ to zbiór niepożądanych ciągów $x_s$ ekstrahowanych przez $p$.
|
||||||
|
Nie istnieje żaden podłańcuch $x'_s$ ciągu $x_s \in
|
||||||
|
X_d$, który nachodzi na jakikolwiek podłańcuch $x'''_s$ ciągu $x''_s \in X_u$.
|
||||||
|
|
||||||
|
Wyrażenie regularne reprezentowane jest za pomocą drzewa. Liście składają
|
||||||
|
się z:
|
||||||
|
\begin{enumerate}
|
||||||
|
\item zakresów znaków np. \texttt{a-ż}, \texttt{A-Ż} i \texttt{0-9},
|
||||||
|
\item klas znaków \texttt{\textbackslash w} i \texttt{\textbackslash d},
|
||||||
|
\item cyfr od 0 do 9,
|
||||||
|
\item częściowych zakresów, czyli największego zakresu znaków występującego \newline
|
||||||
|
w $\bigcup_{(s,X_d,X_u)\in T}X_d$, np. dla $\texttt{\{pokój}_3, \texttt{ubierać}_{13}\}$
|
||||||
|
otrzymuje się
|
||||||
|
zakresy \newline \texttt{j-k} i \texttt{o-r} (przy założeniu, że
|
||||||
|
korzysta się z polskiego alfabetu),
|
||||||
|
\item znaków specjalnych takich jak np. \texttt{\textbackslash ., :, @}.
|
||||||
|
\end{enumerate}
|
||||||
|
Wierzchołki nie będące liściami składają się z:
|
||||||
|
\begin{enumerate}
|
||||||
|
\item konkatenacji $\bullet \bullet$,
|
||||||
|
\item klasy znaków $[\bullet]$ i jej negacji $[ \hat{\ } \bullet ]$,
|
||||||
|
\item kwantyfikatorów bez nawrotów (ang. possessive quantifiers) $\bullet
|
||||||
|
\ast$\texttt{+}, $\bullet$\texttt{++}, $\bullet$\texttt{?+ } oraz $ \bullet
|
||||||
|
\{ \bullet, \bullet \}$\texttt{+},
|
||||||
|
\item oznaczeń grup nieprzechwytujących \texttt{(?:$\bullet$)}.
|
||||||
|
\end{enumerate}
|
||||||
|
Wyrażenie regularne $p$ otrzymuje się przechodząc drzewo sposobem
|
||||||
|
\textit{post-order},\newline w którym pod znak $\bullet$ w wierzchołkach
|
||||||
|
niebędących
|
||||||
|
liściami podstawia się łańcuchy znaków zawarte w dzieciach tego wierzchołka.
|
||||||
|
|
||||||
|
\begin{figure}[tbh]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.7\hsize]{drzewo.png}
|
||||||
|
\caption{Reprezentacja wyrażenia regularnego \texttt{abc\{1,2\}+} za pomocą drzewa.}
|
||||||
|
\label{drzewo_pic}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\subsubsection{Inicjalizacja populacji}
|
||||||
|
Jako $n_{pop}$ oznacza się rozmiar populacji wyrażeń regularnych $P$. Dla każdego $x_s\in \bigcup_{(s,X_d,X_u)\in T}X_d$ budowane są dwa osobniki
|
||||||
|
(osobnikiem jest wyrażenie regularne). Pierwszy osobnik tworzony jest z $x_s$, w którym każda cyfra zamieniana
|
||||||
|
jest na \texttt{\textbackslash d} oraz każda litera zamienia jest na
|
||||||
|
\texttt{\textbackslash w}. Drugi osobnik tworzony jest identycznie jak pierwszy
|
||||||
|
z tą różnicą, że wielkrotne wystąpienia \texttt{\textbackslash d} (lub
|
||||||
|
\texttt{\textbackslash w}) zastępuje się oznaczeniami \texttt{\textbackslash d++} (lub
|
||||||
|
\texttt{\textbackslash w++}). W szczególności dla $x_s=\texttt{14\textvisiblespace lutego}$
|
||||||
|
otrzymujemy osobniki \texttt{\textbackslash d\textbackslash d\textvisiblespace
|
||||||
|
\textbackslash w\textbackslash w\textbackslash w\textbackslash w\textbackslash
|
||||||
|
w\textbackslash w} oraz
|
||||||
|
\texttt{\textbackslash d++\textvisiblespace \textbackslash w++}.
|
||||||
|
|
||||||
|
Jeśli liczba wygenerowanych osobników jest większa niż $n_{pop}$, to są one
|
||||||
|
losowo usuwane, natomiast jeśli liczba osobników jest mniejsza niż $n_{pop}$, to
|
||||||
|
brakujące osobniki są generowane metodą \textit{Ramped half-and-half} \cite{ramped}. Osobniki
|
||||||
|
niereprezentujące poprawnego wyrażenia regularnego są odrzucane, a w ich miejsce
|
||||||
|
generowane \newline są nowe.
|
||||||
|
|
||||||
|
\subsubsection{Funkcja przystosowania}
|
||||||
|
Dla każdego osobnika funkcję przystosowania defniuje się jako:
|
||||||
|
$$f(p):=(Prec(p,T), Acc(p,T), l(p))$$
|
||||||
|
Wprowadza się również dwie nowe operacje $\sqcap$ i $\ominus$, na których oparte są
|
||||||
|
funkcje $Prec$ i $Acc$.
|
||||||
|
Zakłada się, że $X_1$ i $X_2$ to zbiory spójnych podciągów tego samego łańcucha znaków $s$.
|
||||||
|
Wtedy:
|
||||||
|
\begin{itemize}
|
||||||
|
\item $X_1 \ominus X_2$ jest zbiorem takich $x_s$, że
|
||||||
|
(i) są one spójnym podciągiem jakiegoś elementu $X_1$, (ii) nie
|
||||||
|
nachodzą na żaden z elementów $X_2$ oraz (iii) nie mają nadłańcucha, który
|
||||||
|
spełnia warunki
|
||||||
|
(i), (ii);
|
||||||
|
\item $X_1 \sqcap X_2$ jest zbiorem takich $x_s$, że (i) są one
|
||||||
|
spójnym podciągiem jakiekolwiek elementu $X_1$ i
|
||||||
|
jakiekolwiek elementu $X_2$ oraz (ii) nie mają nadłańcucha, który spełnia (i).
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
Między innymi dla $X_1=\{\texttt{Ja}_0, \texttt{ty}_4,
|
||||||
|
\texttt{Adam\textvisiblespace Małysz}_9\}$, $X_2=\{\texttt{Ja}_0,
|
||||||
|
\texttt{Małysz}_{14}\}$: \newline $X_1 \ominus X_2 = \{\texttt{ty}_4, \texttt{Adam\textvisiblespace}_{9}\}$,
|
||||||
|
$X_1 \sqcap X_2 = \{\texttt{Ja}_0,\texttt{Małysz}_{14}\}$.
|
||||||
|
|
||||||
|
\enlargethispage{4\baselineskip}
|
||||||
|
\bigskip
|
||||||
|
\noindent W końcu $$Prec(p,T):=\frac{\sum_{(s,X_d,X_u)\in T}|e(s,\{p\})\cap
|
||||||
|
X_d|}{\sum_{(s,X_d,X_u)\in T}|e(s,\{p\})\sqcap (X_d \cup X_u)|}$$
|
||||||
|
Drugi element trójki uporządkowanej, czyli $Acc(p,T)$ jest średnią arytmetyczną
|
||||||
|
pokrycia na znakach (ang. True Positive Character Rate skr. TPCR) i
|
||||||
|
specyficzności na znakach (ang. True Negative Character Rate skr. TNCR):
|
||||||
|
\begin{equation*}
|
||||||
|
\begin{split}
|
||||||
|
TPCR(p,T) & :=\frac{\sum_{(s,X_d,X_u)\in T}||e(s,\{p\})\sqcap X_d||}{\sum_{(s,X_d,X_u)\in T}||X_d||} \\[3pt]
|
||||||
|
TNCR(p,T) & :=\frac{\sum_{(s,X_d,X_u)\in T}||s \ominus e(s,\{p\}) \sqcap X_u||}{\sum_{(s,X_d,X_u)\in T}||X_u||} \\[3pt]
|
||||||
|
Acc(p,T) & :=\frac{TPCR(p,T) + TNCR(p,T)}{2}
|
||||||
|
\end{split}
|
||||||
|
\end{equation*}
|
||||||
|
gdzie $||X|| = \sum_{x_s\in X}l(x_s)$, a $l(x_s)$ oznacza długość ciągu $x_s$.
|
||||||
|
|
||||||
|
Osobniki porównywane są w pierwszej kolejności na podstawie $Prec$, \newline potem
|
||||||
|
za pomocą $Acc$, a na końcu w przypadku identycznych
|
||||||
|
$Prec$ i $Acc$ brane jest pod uwagę $l(p)$.
|
||||||
|
|
||||||
|
\enlargethispage{4\baselineskip}
|
||||||
|
% \end{split}
|
||||||
|
% \end{equation*}
|
||||||
|
% \begin{equation*}
|
||||||
|
% \begin{split}
|
||||||
|
\textbf{Przykład}
|
||||||
|
\begin{equation*}
|
||||||
|
\begin{split}
|
||||||
|
s & = \texttt{70.\textvisiblespace Poprawny\textvisiblespace zapis\textvisiblespace dat\textvisiblespace to\textvisiblespace np.\textvisiblespace } \\
|
||||||
|
& \quad \; \texttt{10.04.2019,\textvisiblespace 1.03.2018\textvisiblespace (nie\textvisiblespace 01.03.2018).} \\
|
||||||
|
X_d & =\{\texttt{10.04.2019}_{30}, \texttt{1.03.2018}_{42}\} \\
|
||||||
|
X_u & = \{\texttt{70.\textvisiblespace Poprawny\textvisiblespace zapis\textvisiblespace dat\textvisiblespace to\textvisiblespace np.\textvisiblespace }_0, \texttt{\textvisiblespace (nie\textvisiblespace}_{52}, \;\texttt{).}_{67}\} \\
|
||||||
|
T & = \{(s, X_d, X_u)\} \\
|
||||||
|
p_1 & = \texttt{\textbackslash d\{2,2\}+.\textbackslash d\{2,2\}+.\textbackslash d\{4,4\}+.} \\
|
||||||
|
p_2 & = \texttt{\textbackslash d\{2,4\}+} \\
|
||||||
|
e(s, {p_1}) & = \{\texttt{10.04.2019}_{30}, \texttt{01.03.2018}_{57}\} \\
|
||||||
|
e(s, {p_2}) & = \{\texttt{70}_{0}, \texttt{10}_{30}, \texttt{04}_{33}, \texttt{2019}_{36}, \texttt{03}_{44}, \texttt{2018}_{47}, \texttt{01}_{57}, \texttt{03}_{60}, \texttt{2018}_{63}\} \\[3pt]
|
||||||
|
Prec(p_1, T) & = \frac{|\{\texttt{10.04.2019}_{30}\}|}{|\{\texttt{10.04.2019}_{30}\}|} =\frac{1}{1} = 1 \\[3pt]
|
||||||
|
Prec(p_2, T) & = \frac{|\emptyset|}{|\{\texttt{70}_{0}, \texttt{10}_{30}, \texttt{04}_{33}, \texttt{2019}_{36}, \texttt{03}_{44}, \texttt{2018}_{47}\}|} = \frac{0}{6} = 0 \\[4pt]
|
||||||
|
TPCR(p_1, T) & = \frac{||\{\texttt{10.04.2019}_{30}\}||}{||\{\texttt{10.04.2019}_{30}, \texttt{1.03.2018}_{42}\}||} = \frac{10}{19} \\[4pt]
|
||||||
|
TPCR(p_2, T) & = \frac{||\{\texttt{10}_{26}, \texttt{04}_{29}, \texttt{2019}_{32}, \texttt{03}_{40}, \texttt{2018}_{43}\}||}{||\{\texttt{10.04.2019}_{30}, \texttt{1.03.2018}_{42}\}||} = \frac{14}{19} \\[4pt]
|
||||||
|
TNCR(p_1, T) & = \frac{||\{\texttt{70.\textvisiblespace Poprawny\textvisiblespace zapis\textvisiblespace dat\textvisiblespace to\textvisiblespace np.\textvisiblespace }_0, \texttt{\textvisiblespace (nie\textvisiblespace}_{51}, \;\texttt{).}_{67}\}||}{||\{\texttt{70.\textvisiblespace Poprawny\textvisiblespace zapis\textvisiblespace dat\textvisiblespace to\textvisiblespace np.\textvisiblespace }_0, \texttt{\textvisiblespace (nie\textvisiblespace}_{51}, \;\texttt{).}_{67}\}||} = \frac{38}{38} = 1\\[4pt]
|
||||||
|
TNCR(p_2, T) & = \frac{||\{\texttt{.\textvisiblespace Poprawny\textvisiblespace zapis\textvisiblespace dat\textvisiblespace to\textvisiblespace np.\textvisiblespace }_2, \texttt{\textvisiblespace (nie\textvisiblespace}_{51}, \;\texttt{).}_{67}\}||}{||\{\texttt{70.\textvisiblespace Poprawny\textvisiblespace zapis\textvisiblespace dat\textvisiblespace to\textvisiblespace np.\textvisiblespace }_0, \texttt{\textvisiblespace (nie\textvisiblespace}_{51}, \;\texttt{).}_{67}\}||} = \frac{36}{38}\\[4pt]
|
||||||
|
f(p_1) & = \bigg(1, 0.76=\frac{1}{2}\Big(\frac{10}{19} + 1\Big), 20 \bigg)\\
|
||||||
|
f(p_2) & = \bigg(0, 0.84=\frac{1}{2}\Big(\frac{14}{19} + \frac{36}{38}, \Big), 24\bigg)
|
||||||
|
\end{split}
|
||||||
|
\end{equation*}
|
||||||
|
Zgodnie z wprowadzoną funkcją oceny osobnik $p_1$ jest lepiej
|
||||||
|
przystosowany niż osobnik $p_2$.
|
||||||
|
|
||||||
|
\subsubsection{Ewolucja populacji}
|
||||||
|
Populacja $P$ o liczności $n_{pop}$ ewoluuje następująco. W każdej epoce $0.1n$ osobników
|
||||||
|
generowanych jest losowo za pomocą metody
|
||||||
|
\textit{Ramped half-and-half} \cite{ramped}, kolejne $0.1n$ osobników powstaje za pomocą mutacji, a
|
||||||
|
pozostałe $0.8n$ otrzymuje \newline się metodą krzyżowania.
|
||||||
|
Z populacji P i zbioru nowo
|
||||||
|
wygenerowanych osobników wybierane jest $n$ najlepiej przystosowanych osobników,
|
||||||
|
które tworzą nową populację. Osobniki wybierane są do mutacji i krzyżowania
|
||||||
|
metodą turnieju (losowanie z $P$ siedmiu osobników i wyłonienie najlepszego).
|
||||||
|
Pondato wymusza się także różnorodność między fenotypami osobników, tzn. jeśli oba
|
||||||
|
osobniki mają identyczny łańcuch znaków to w populacji zostawia się tylko jednego
|
||||||
|
z nich. Koniec iteracji następuje, gdy zostanie osiągnięty z góry ustalony limit
|
||||||
|
iteracji lub
|
||||||
|
najlepiej przystosowany osobnik nie zmieni się od określonej liczby epok.
|
||||||
|
Finalne wyrażenie regularne $p$ to najlepiej przystosowany osobnik po
|
||||||
|
zakończeniu wszystkich iteracji.
|
||||||
|
\subsubsection{Zastosowanie metody „dziel i zwyciężaj”}
|
||||||
|
Zbiór wyrażeń regularnych $P$ generowany jest za pomocą strategii „dziel i zwyciężaj”.
|
||||||
|
W każdej iteracji spójne podciągi ciągu znaków $s$, które zostały poprawnie
|
||||||
|
wykryte przez $P$ są usuwane ze zbioru treningowego.
|
||||||
|
|
||||||
|
\enlargethispage{2\baselineskip}
|
||||||
|
Oby uniknąć przetrenowania, czyli bardzo wysokiego \textit{F-measure} na $E$, a niskiego na $E'$,
|
||||||
|
zbiór treningowy $E$ dzielony jest losowo na dwa zbiory $E_{train}$ i $E_{validation}$
|
||||||
|
takie, że $E=E_{train} \cup E_{validation}$, $E_{train} \cap E_{validation} =
|
||||||
|
\emptyset$ \newline i
|
||||||
|
$\sum_{(s,X)\in E_{train}}|X|\approx \sum_{(s,X)\in E_{validation}}|X|$.
|
||||||
|
|
||||||
|
|
||||||
|
\noindent Procedura generowania zbioru wyrażeń regularnych $P$ prezentuje się następująco.
|
||||||
|
|
||||||
|
Zacznij z $P=\emptyset$ i z $T$ utworzonym w taki sposób, że dla
|
||||||
|
każdego $(s,X)\in E_{train}$, trójka uporządkowana $(s, X, \{s\} \ominus X)$ jest
|
||||||
|
dodawana do $T$, \newline gdzie $X_d:=X$ i $X_u:=\{s\} \ominus X$.
|
||||||
|
|
||||||
|
\noindent Następnie dopóki $\bigcup_{(x,X_d,X_u)\in T}X_d\ne \emptyset$ powtarzaj:
|
||||||
|
\begin{enumerate}
|
||||||
|
\item Wykonaj algorytm genetyczny na $T$ i otrzymaj wyrażenie regularne $p$.
|
||||||
|
\item Jeśli $Prec(p,T)=1$, to $P:=P\cup\{p\}$, w przeciwnym wypadku przerwij pętlę.
|
||||||
|
\item Dla każdego $(s, X_d, X_u)\in T$ ustaw $X_d:=X_d\setminus e(s, \{p\})$.
|
||||||
|
\end{enumerate}
|
||||||
|
|
||||||
|
Powyższa procedura powtarzana jest wiele razy z różnym zarodkiem generatora
|
||||||
|
liczb losowych (startowy zbiór trenujący $T$ pozostaje bez zmian), by otrzymać
|
||||||
|
dużo różnych zbiorów $P$, z których na końcu wybierany jest ten o najwyższej
|
||||||
|
średniej harmonicznej z precyzji i pokrycia na $E=E_{train} \cup E_{validation}$.
|
||||||
|
%\section{Sieci neuronowe}
|
||||||
|
\chapter{Metodologia}
|
||||||
|
\section{Ogólny zarys}
|
||||||
|
\section{Zbieranie informacji o parafiach}
|
||||||
|
\section{Wyszukiwanie stron internetowych parafii}
|
||||||
|
\section{Wydobywanie tekstu ze stron parafialnych}
|
||||||
|
\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ść}
|
||||||
|
\chapter*{Streszczenie}
|
||||||
|
TODO
|
||||||
|
|
||||||
|
\textbf{Słowa kluczowe:} ekstrakcja informacji\chapter*{Abstract}
|
||||||
|
todo
|
||||||
|
|
||||||
|
\textbf{Key words:} information extraction\markboth{Wstęp}{Wstęp}
|
||||||
|
\addcontentsline{toc}{chapter}{Wstęp}
|
||||||
|
@ARTICLE{Bootstrap,
|
||||||
|
author = {Daniel Waegel},
|
||||||
|
title = {A Survey of Bootstrapping Techniques in Natural Language Processing},
|
||||||
|
journal = {Department of Computer Science,
|
||||||
|
University of Delaware, Literature Survey Reports},
|
||||||
|
year = {2013}
|
||||||
|
}
|
||||||
|
|
||||||
|
@ARTICLE{Hearst,
|
||||||
|
author = {Marti Hearst },
|
||||||
|
title = {Automatic Acquisition of Hyponyms from Large Text Corpora.},
|
||||||
|
journal = {Proc. of the
|
||||||
|
Fourteenth International Conference on Computational Linguistics, Nantes, France.},
|
||||||
|
year = {1992}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@inproceedings{genetic,
|
||||||
|
title={Learning text patterns using separate-and-conquer genetic programming},
|
||||||
|
author={Bartoli, Alberto and De Lorenzo, Andrea and Medvet, Eric and Tarlao, Fabiano},
|
||||||
|
booktitle={European Conference on Genetic Programming},
|
||||||
|
pages={16--27},
|
||||||
|
year={2015},
|
||||||
|
organization={Springer}
|
||||||
|
}
|
||||||
|
|
||||||
|
@article{ramped,
|
||||||
|
title={Genetic programming as a means for programming computers by natural selection},
|
||||||
|
author={Koza, John R},
|
||||||
|
journal={Statistics and computing},
|
||||||
|
volume={4},
|
||||||
|
number={2},
|
||||||
|
pages={87--112},
|
||||||
|
year={1994},
|
||||||
|
publisher={Springer}
|
||||||
|
}
|
@ -1,3 +1,11 @@
|
|||||||
|
@ARTICLE{Bootstrap,
|
||||||
|
author = {Daniel Waegel},
|
||||||
|
title = {A Survey of Bootstrapping Techniques in Natural Language Processing},
|
||||||
|
journal = {Department of Computer Science,
|
||||||
|
University of Delaware, Literature Survey Reports},
|
||||||
|
year = {2013}
|
||||||
|
}
|
||||||
|
|
||||||
@ARTICLE{Hearst,
|
@ARTICLE{Hearst,
|
||||||
author = {Marti Hearst },
|
author = {Marti Hearst },
|
||||||
title = {Automatic Acquisition of Hyponyms from Large Text Corpora.},
|
title = {Automatic Acquisition of Hyponyms from Large Text Corpora.},
|
||||||
@ -7,10 +15,22 @@ Fourteenth International Conference on Computational Linguistics, Nantes, France
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ARTICLE{Bootstrap,
|
@inproceedings{genetic,
|
||||||
author = {Daniel Waegel},
|
title={Learning text patterns using separate-and-conquer genetic programming},
|
||||||
title = {A Survey of Bootstrapping Techniques in Natural Language Processing},
|
author={Bartoli, Alberto and De Lorenzo, Andrea and Medvet, Eric and Tarlao, Fabiano},
|
||||||
journal = {Department of Computer Science,
|
booktitle={European Conference on Genetic Programming},
|
||||||
University of Delaware, Literature Survey Reports},
|
pages={16--27},
|
||||||
year = {2013}
|
year={2015},
|
||||||
|
organization={Springer}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@article{ramped,
|
||||||
|
title={Genetic programming as a means for programming computers by natural selection},
|
||||||
|
author={Koza, John R},
|
||||||
|
journal={Statistics and computing},
|
||||||
|
volume={4},
|
||||||
|
number={2},
|
||||||
|
pages={87--112},
|
||||||
|
year={1994},
|
||||||
|
publisher={Springer}
|
||||||
|
}
|
66
master.tex
Normal file
66
master.tex
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
\documentclass[a4paper, 12pt, twoside]{report}
|
||||||
|
\input{pakiety.tex}
|
||||||
|
\input{ustawienia.tex}
|
||||||
|
|
||||||
|
\newcommand\blankpage{%
|
||||||
|
\null
|
||||||
|
\thispagestyle{empty}%
|
||||||
|
%\addtocounter{page}{-1}%
|
||||||
|
\newpage}
|
||||||
|
|
||||||
|
\begin{document}
|
||||||
|
|
||||||
|
\pagenumbering{roman}
|
||||||
|
|
||||||
|
% strona tytulowa
|
||||||
|
\input{strona_tytulowa.tex}
|
||||||
|
% oswiadczenie
|
||||||
|
\blankpage
|
||||||
|
\input{oswiadczenie.tex}
|
||||||
|
\blankpage
|
||||||
|
\input{empty.tex}
|
||||||
|
% wstawienie spisu tresci:
|
||||||
|
\newpage
|
||||||
|
\tableofcontents
|
||||||
|
|
||||||
|
% tresc pracy - numeracja stron liczbami arabskimi
|
||||||
|
\newcounter{licznikStron}
|
||||||
|
\setcounter{licznikStron}{\value{page}}
|
||||||
|
\pagenumbering{arabic}
|
||||||
|
\setcounter{page}{\value{licznikStron}}
|
||||||
|
|
||||||
|
\newpage\null\thispagestyle{empty}\newpage
|
||||||
|
\input{streszczenie.tex}
|
||||||
|
\newpage\null\thispagestyle{empty}\newpage
|
||||||
|
\input{empty.tex}
|
||||||
|
\input{abstract.tex}
|
||||||
|
\newpage\null\thispagestyle{empty}\newpage
|
||||||
|
\input{wstep.tex}
|
||||||
|
\newpage\null\thispagestyle{empty}\newpage
|
||||||
|
\input{rozdzial_1.tex}
|
||||||
|
\input{rozdzial_2.tex}
|
||||||
|
\newpage\null\thispagestyle{empty}\newpage
|
||||||
|
\input{rozdzial_3.tex}
|
||||||
|
\input{rozdzial_4.tex}
|
||||||
|
\input{rozdzial_5.tex}
|
||||||
|
\newpage\null\thispagestyle{empty}\newpage
|
||||||
|
|
||||||
|
% spis ilustracji:
|
||||||
|
%\newpage
|
||||||
|
%\listoffigures
|
||||||
|
%\addcontentsline{toc}{chapter}{Spis ilustracji}
|
||||||
|
|
||||||
|
% spis tabel:
|
||||||
|
%\newpage
|
||||||
|
%\listoftables
|
||||||
|
%\addcontentsline{toc}{chapter}{Spis tabel}
|
||||||
|
|
||||||
|
|
||||||
|
%bibliografia
|
||||||
|
\nocite{*}
|
||||||
|
\bibliographystyle{acm}
|
||||||
|
\bibliography{bibliografia}
|
||||||
|
\addcontentsline{toc}{chapter}{Bibliografia}
|
||||||
|
%\newpage\null\thispagestyle{empty}\newpage
|
||||||
|
%\input{zakres_projektu.tex}
|
||||||
|
\end{document}
|
@ -1,3 +1 @@
|
|||||||
\chapter{Podstawowe pojęcia}
|
\chapter{Podstawowe pojęcia}
|
||||||
|
|
||||||
\chapter{stub}
|
|
292
rozdzial_2.tex
292
rozdzial_2.tex
@ -2,132 +2,150 @@
|
|||||||
% w kontekście mojego projektu
|
% w kontekście mojego projektu
|
||||||
W tym rozdziale zaprezentowane są wybrane metody,
|
W tym rozdziale zaprezentowane są wybrane metody,
|
||||||
które brane były pod uwagę lub zostały zastosowane
|
które brane były pod uwagę lub zostały zastosowane
|
||||||
w końcowym systemie ekstrakcji informacji o godzinach rozpoczęcia mszy świętych.
|
w opisywanym tutaj systemie ekstrakcji informacji o godzinach rozpoczęcia mszy świętych.
|
||||||
\section {Algorytmy \textit{bootstraping}}
|
\section {Algorytmy \textit{bootstraping}}
|
||||||
Niech $J$ to będzie dowolna reprezentacja języka (wyraz, fraza, wyrażenie
|
Niech $J$ będzie dowolną reprezentacją języka (wyraz, fraza, wyrażenie
|
||||||
regularne itp.)
|
regularne itp.).
|
||||||
W dziedzinie przetwarzania języka naturalnego \textit{bootstraping} to technika
|
W dziedzinie przetwarzania języka naturalnego \textit{bootstraping} to technika
|
||||||
wyszukiwania niezanotowanych $J$ przy użyciu małego zbioru specjalnie
|
wyszukiwania niezanotowanych (nieprzypisanych do badanej klasy) $J$ przy użyciu małego zbioru specjalnie
|
||||||
wyselekcjonowanych $J$.
|
wyselekcjonowanych zanotowanych $J$.
|
||||||
Implementacji algorytmu \textit{bootstraping} jest wiele; wszystkie jednak
|
Implementacji algorytmu \textit{bootstraping} jest wiele, wszystkie jednak
|
||||||
oparte są na następującym schemacie \cite{Bootstrap}:
|
oparte są na następującym schemacie \cite{Bootstrap}:
|
||||||
|
\enlargethispage{4\baselineskip}
|
||||||
\begin{enumerate}
|
\begin{enumerate}
|
||||||
\item Stwórz pustą listę $J$. % pusta lista $J$, pusta lista wyrazów, pusta
|
\item Stwórz pustą listę reprezentacji języka $J$. % pusta lista $J$, pusta lista wyrazów, pusta
|
||||||
% lista fraz
|
% lista fraz
|
||||||
\item Zainicjalizuj listę starannie dobranymi $J$.
|
\item Zainicjalizuj listę starannie dobranymi $J$.
|
||||||
\item Wykorzystaj elementy listy do znalezienia nowych $J$ z korpusu treningowego.
|
\item Wykorzystaj elementy listy do znalezienia nowych $J$ z korpusu treningowego.
|
||||||
\item Oceń nowe $J$; najlepsze $J$ dodaj do listy.
|
\item Oceń nowe $J$; najlepsze $J$ dodaj do listy.
|
||||||
\item Wróć do 3. i powtarzaj aż do osiągnięcia z góry określonej liczby iteracji lub
|
\item Wróć do 3. i powtarzaj aż do osiągnięcia z góry określonej liczby iteracji
|
||||||
|
\newline lub
|
||||||
spełnienia innego warunku stopu.
|
spełnienia innego warunku stopu.
|
||||||
|
|
||||||
\end{enumerate}
|
\end{enumerate}
|
||||||
\textit{Bootstraping} jest szczególnie przydatny w przypadku, gdy mamy mały
|
% \textit{Bootstraping} jest szczególnie przydatny w przypadku, gdy mamy mały
|
||||||
zbiór treningowy, ponieważ z jego pomocą jesteśmy w stanie powiększyć zbiór
|
% zbiór treningowy, ponieważ z jego pomocą jesteśmy w stanie powiększyć zbiór
|
||||||
treningowy. %todo poprawić
|
% treningowy. %todo poprawić
|
||||||
|
|
||||||
|
|
||||||
\subsection{Wzorce Hearst}
|
\subsection{Wzorce Hearst}
|
||||||
Jedną z pierwszych implementacji algorytmu \textit{bootstraping} w dziedzinie
|
Jednymi z pierwszych implementacji algorytmu \textit{bootstraping} w dziedzinie
|
||||||
ekstrakcji informacji
|
ekstrakcji informacji
|
||||||
są wzorce Hearst \textit{(ang. Hearst patterns)} \cite{Hearst}.
|
są wzorce Hearst \textit{(ang. Hearst patterns)} \cite{Hearst}.
|
||||||
|
|
||||||
\smallskip
|
\smallskip
|
||||||
\noindent Znajdowanie nowych wzorców za pomocą wzorców Hearst można przedstawić
|
\noindent Znajdowanie nowych przykładów uczących za pomocą wzorców Hearst przedstawia się
|
||||||
następująco:
|
następująco:
|
||||||
|
|
||||||
\begin{enumerate}
|
\begin{enumerate}
|
||||||
\item Wybierz relację leksykalną $R$.
|
\item Wybierz relację leksykalną $R$.
|
||||||
\item Zbierz zbiór $S$ par $(x, y)\in R$, gdzie $x$ i $y$ to słowa lub frazy.
|
\item Utwórz początkowy zbiór $S$ par $(x, y)\in R$, gdzie $x$ i $y$ to słowa lub frazy.
|
||||||
\item Znajdź zdania, które zawierają pary ze zbioru $S$.
|
\item Znajdź zdania, które zawierają pary ze zbioru $S$.
|
||||||
\item Przyjrzyj się kontekstowi w jakim występują te pary. Załóż, że często powtarzające się wzorce reprezentują relację R.
|
\item Przyjrzyj się kontekstowi, w jakim występują te pary. Załóż, że często powtarzające się wzorce reprezentują relację R.
|
||||||
\item Wykorzystaj nowo odkryte wzorce do znalezienia nowych par słów lub fraz będących w relacji $R$.
|
\item Wykorzystaj nowo odkryte wzorce do znalezienia kolejnych par $(x, y)\in R$.
|
||||||
\item Dodaj nowo znalezione pary słów lub fraz do zbioru $S$, wróć do 3. i powtarzaj aż do osiągnięcia z góry określonej liczby iteracji.
|
\item Dodaj nowo znalezione pary do zbioru $S$, wróć do 3. i powtarzaj aż do osiągnięcia z góry określonej liczby iteracji.
|
||||||
\end{enumerate}
|
\end{enumerate}
|
||||||
|
|
||||||
\enlargethispage{6\baselineskip}
|
\enlargethispage{4\baselineskip}
|
||||||
\subsubsection{Przykład}
|
\subsubsection{Przykład}
|
||||||
Rozważmy relację R taką, że $(x, y) \in R$ wtedy, gdy $x$ został pochowany w
|
Rozważmy relację R taką, że $(x, y) \in R$ wtedy, gdy $x$ został pochowany w
|
||||||
$y$.
|
$y$.
|
||||||
Załóżmy, że zaczynamy z parą \texttt{('Józef Piłsudski', 'Kraków')}$\in R$.
|
Załóżmy, że zaczynamy z parą \texttt{('Józef Piłsudski', 'Kraków')}$\in R$.
|
||||||
W korpusie treningowym szukamy zdań zawierających w sobie parę \texttt{('Józef Piłsudski', 'Kraków')} i otrzymujemy:
|
W korpusie treningowym szukamy zdań zawierających w sobie parę \texttt{('Józef
|
||||||
|
Piłsudski', 'Kraków')} i otrzymujemy zdania takie jak:
|
||||||
|
|
||||||
\centerline{„Józef Piłsudski został pochowany w Krakowie.”}
|
\centerline{„Józef Piłsudski został pochowany w Krakowie.”}
|
||||||
\centerline{„Miejsce pochówku Józefa Piłsudskiego to Kraków.”}
|
\centerline{„Miejsce pochówku Józefa Piłsudskiego to Kraków.”}
|
||||||
\centerline{„Grób Józefa Piłsudskiego znajduje się w Krakowie.”}
|
\centerline{„Grób Józefa Piłsudskiego znajduje się w Krakowie.”}
|
||||||
|
|
||||||
Ze znalezionych zdań tworzymy następujące wzorce:
|
\noindent Ze znalezionych zdań tworzymy następujące wzorce:
|
||||||
|
|
||||||
\centerline{$x$ został pochowany w $y$.}
|
\centerline{$x$ został pochowany w $y$.}
|
||||||
\centerline{Miejsce pochówku $x$ to $y$.}
|
\centerline{Miejsce pochówku $x$ to $y$.}
|
||||||
\centerline{Grób $x$ znajduje się w $y$.}
|
\centerline{Grób $x$ znajduje się w $y$.}
|
||||||
|
|
||||||
Wykorzystujemy powyższe wzorce do znalezienia nowych par będących w relacji $R$
|
\noindent Wykorzystujemy powyższe wzorce do znalezienia nowych par będących w relacji $R$, przykładowo:
|
||||||
i otrzymujemy:
|
% i otrzymujemy:
|
||||||
|
|
||||||
\centerline{\texttt{('Władysław Araszkiewicz', 'Warszawa')}}
|
\centerline{\texttt{('Witold Doroszweski, 'Warszawa')}}
|
||||||
\centerline{\texttt{('Władysław Kuczewski', 'Częstochowa')}}
|
\centerline{\texttt{('Jana Długosz', 'Zakopane')}}
|
||||||
|
|
||||||
Następnie nowe pary używamy do znalezienia nowych wzorców, a potem nowe
|
\noindent Następnie szukamy zdań w których występują powyższe pary, na przykład:
|
||||||
wzorce do wyszukania kolejnych par i powtarzamy powyższy
|
|
||||||
algorytm aż do osiągnięcia określonej liczby iteracji.
|
\centerline{„Witold Doroszewski spoczywa w Warszawie.”}
|
||||||
|
\centerline{„Na cmentarzu w Zakopanem mieści
|
||||||
|
się grób Jana Długosza.”}
|
||||||
|
|
||||||
|
\noindent Z nowo otrzymanych zdań tworzymy poniższe wzorce:
|
||||||
|
|
||||||
|
\centerline{$x$ spoczywa w $y$.}
|
||||||
|
\centerline{Na cmentarzu w $y$ mieści się grób $x$.}
|
||||||
|
|
||||||
|
\noindent Powtarzamy powyższy algorytm aż do osiągnięcia określonej liczby iteracji.
|
||||||
|
|
||||||
|
|
||||||
|
% \subsection{Miejsce na opis bardziej skomplikowanej metody implementującej
|
||||||
|
% algorytm \textit{bootstraping}}
|
||||||
|
|
||||||
|
\section{Automatyczne generowanie wyrażeń regularnych za pomocą algorytmów genetycznych}
|
||||||
\subsection{Miejsce na opis bardziej skomplikowanej metoda implementującej
|
W 2015 roku Bartoli i in. zaprezentowali efektywny algorytm genetyczny do generowania
|
||||||
algorytm \textit{bootstraping}}
|
wzorców zapisanch w
|
||||||
|
postaci wyrażeń regularnych przy użyciu niewielkiego zbioru zanotowanych
|
||||||
\section{Dziel i zwyciężaj algorytmami genetycznymi}
|
przykładów (fraz oznaczonych jako pasujące do wyrażeń regularnych) \cite{genetic}. Nowością było zastosowanie metody „dziel i zwyciężaj”.
|
||||||
W 2015 Bartoli i in. zaprezentowali efektywny algorytm genetyczny do generowania wzorców w
|
Zamiast uczyć się jednego wyrażenia regularnego, które znajdowałoby wszystkie
|
||||||
postaci wyrażeń regularnych przy użyciu niewielkiego zbioru zanotowanych przykładów.
|
przykłady, system uczy się wielu różnych wzorców, które dopiero po połączeniu
|
||||||
Problem generowania automatycznych wyrażeń regularnych jest ciężki. Warto zauważyć, że
|
alternatywą tworzą
|
||||||
bardzo łatwo wytrenować na zbiorze treningowym system, który znajdzie wzorzec o bardzo wysokiej precyzji i niskiej
|
ostateczne wyrażenie regularne.
|
||||||
czułości (np. wystarczy alternatywa po wszystkich zanotowanych przykładach), ale szczególnie trudno wytrenować system tak, aby generalizował się na przypadki poza
|
% Problem automatycznego generowania wyrażeń regularnych jest złożony. Warto zauważyć, że % bardzo łatwo wytrenować na zbiorze treningowym system, który znajdzie wzorzec o bardzo wysokiej precyzji i niskiej % czułości (np. wystarczy alternatywa, której składnikami są wszystkie zanotowane przykłady), ale szczególnie trudno wytrenować system tak, aby generalizował się na przypadki poza % zbiorem treningowym (innymi słowy taki system łatwo przetrenować). %(otrzymali wyniki bardzo zadowalające wyniki ) tabela wyników
|
||||||
zbiorem treningowym (innymi słowy taki system łatwo przetrenować).
|
|
||||||
|
|
||||||
%Bartoli i in. na następujących przykładach
|
|
||||||
|
|
||||||
%tabela tekstu do wyekstrachowania
|
|
||||||
|
|
||||||
%(otrzymali wyniki bardzo zadowalające wyniki ) tabela wyników
|
|
||||||
\subsection{Opis problemu}
|
\subsection{Opis problemu}
|
||||||
Niech $x_s$ będzie spójnym podciągiem ciągu znaków $s$ reprezentowanym przez
|
Niech $x_s$ będzie spójnym podciągiem ciągu znaków $s$ reprezentowanym przez
|
||||||
indeks początkowy i końcowy w $s$.
|
indeks początkowy i końcowy w $s$. Dla ułatwienia, w przykładach $x_s$ będziemy
|
||||||
$x_s$ nazywa się nadłańcuchem $x'_s$ (a $x'_s$ jest podłańcuchem $x_s$)
|
reprezentować przez zawartość i indeks początkowy.
|
||||||
|
\enlargethispage{1\baselineskip}
|
||||||
|
Na przykład $x_s=\texttt{ku}_0$, $x'_s=\texttt{ku}_2$, $x''_s=\texttt{kuku}_0$, $x'''_s=\texttt{łka}_4$ to spójne podciągi ciągu znaków $s=\texttt{kukułka}$.
|
||||||
|
$x_s$ nazywa się nadłańcuchem $x'_s$ (a $x'_s$ jest podłańcuchem $x_s$),
|
||||||
jeśli (i) $x'_s$ jest krótszy niż $x_s$, (ii) indeks początkowy $x'_s$ jest
|
jeśli (i) $x'_s$ jest krótszy niż $x_s$, (ii) indeks początkowy $x'_s$ jest
|
||||||
większy lub równy niż indeks początkowy $x_s$ oraz (iii) indeks końcowy $x'_s$
|
nie mniejszy niż indeks początkowy $x_s$ oraz (iii) indeks końcowy $x'_s$
|
||||||
jest mniejszy lub równy niż indeks końcowy $x_s$.
|
jest nie większy niż indeks końcowy $x_s$. Na przykład $\texttt{ku}_0$
|
||||||
|
jest podłańcuchem $\texttt{kuku}_0$.
|
||||||
|
Mówi się, że $x_s$ nachodzi na $x'_s$ (lub $x'_s$ nachodzi na $x_s$), jeśli (i) indeks początkowy $x_s$ jest
|
||||||
|
nie większy niż indeks końcowy $x'_s$ oraz (ii) indeks końcowy $x_s$ jest nie
|
||||||
|
mniejszy niż indeks początkowy $x'_s$.
|
||||||
|
|
||||||
Niech $(s,X)$ to przykład uczący, w którym $X$ to zbiór
|
Niech $(s,X)$ będzie przykładem uczącym, w którym $X$ to zbiór
|
||||||
nienachodzących na siebie $x_s$.
|
nienachodzących na siebie $x_s$.
|
||||||
|
|
||||||
Niech $e(s,P)$ to zbiór wszystkich ciągów $x_s$
|
Jako $e(s,P)$ oznacza się zbiór wszystkich ciągów $x_s$
|
||||||
wyekstrahowanych poprzez zbiór wyrażeń regularnych $P$, taki że (i)
|
wyekstrahowanych poprzez zbiór wyrażeń regularnych $P$, taki że (i)
|
||||||
$x_s$
|
$x_s$
|
||||||
pasuje do jakiegokolwiek wyrażenia regularnego $p\in P$, (ii) każdy nadłańcuch
|
pasuje do jakiegokolwiek wyrażenia regularnego $p\in P$, (ii) każdy nadłańcuch
|
||||||
$x'_s$ ciągu $x_s$ nie pasuje do żadnego wyrażenia regularnego $p\in P$
|
$x'_s$ ciągu $x_s$ nie pasuje do żadnego wyrażenia regularnego $p\in P$
|
||||||
oraz (iii) dla każdego innego ciągu $x''_s$, który nachodzi na
|
oraz (iii) dla każdego ciągu $x''_s\neq x_s$, który nachodzi na
|
||||||
$x_s$, indeks początkowy $x''_s$ albo jest większy od indeksu początkowego $x_s$
|
$x_s$, indeks początkowy $x''_s$ jest większy od indeksu początkowego $x_s$
|
||||||
albo $x''_s$ nie pasuje do żadnego $p\in P$.
|
albo $x''_s$ nie pasuje do żadnego $p\in P$.
|
||||||
|
Między innymi dla $s=\texttt{abcde}\textvisiblespace \texttt{a}$ i
|
||||||
|
$P=\{\texttt{a}, \texttt{bc}, \texttt{cde}, \texttt{de}\}$
|
||||||
|
$e(s,P)=\{a_0, a_6, bc_1\}$. Należy zwrócić uwagę, że $de_3 \notin e(s,P)$ i $cde_2 \notin e(s,P)$, ponieważ nie spełniają one kolejno warunków (ii) oraz (iii).
|
||||||
|
|
||||||
Mając dwa zbiory zanotowanych przykładów $(E, E')$ zbiór wyrażeń
|
Mając dwa zbiory anotowanych przykładów $(E, E')$, zbiór wyrażeń
|
||||||
regularnych $P$ generowany jest używając
|
regularnych $P$ generowany jest używając
|
||||||
tylko i wyłącznie $E$ w taki sposób, że (i) maksymalizowana jest średnia harmoniczna z precyzji i
|
tylko i wyłącznie $E$ w taki sposób, że (i) maksymalizowana jest średnia harmoniczna z precyzji i
|
||||||
czułości na $E'$ oraz (ii) minimalizowana jest $\sum_{p\in
|
pokrycia (ang. \textit{recall}) na $E'$ oraz (ii) minimalizowana jest $\sum_{p\in
|
||||||
P}{l(p)}$, gdzie $l(p)$ to długość wyrażenie regularnego $p$.
|
P}{l(p)}$, gdzie $l(p)$ to długość wyrażenia regularnego $p$.
|
||||||
Wtedy precyzja i czułość definiowane są w następujący sposób:
|
Wtedy precyzja i pokrycie definiowane są w następujący sposób:
|
||||||
|
|
||||||
$$Prec(P, E'):=\frac{\sum_{(s,X)\in E'}{|e(s,P) \cup X|}}{\sum_{(s,X)\in E'}{|e(s,P)|}}$$
|
$$Prec(P, E'):=\frac{\sum_{(s,X)\in E'}{|e(s,P) \cup X|}}{\sum_{(s,X)\in E'}{|e(s,P)|}}$$
|
||||||
$$Rec(P, E'):=\frac{\sum_{(s,X)\in E'}{|e(s,P) \cup X|}}{\sum_{(s,X)\in E'}{|X|}}$$
|
$$Rec(P, E'):=\frac{\sum_{(s,X)\in E'}{|e(s,P) \cup X|}}{\sum_{(s,X)\in E'}{|X|}}$$
|
||||||
|
|
||||||
\subsection{Algorytm}
|
\subsection{Szczegóły algorytmu genetycznego}
|
||||||
|
|
||||||
\subsubsection{Algorytm genetyczny}
|
Na wejściu do algorytmu genetycznego podawany jest zbiór treningowy $T$, a na
|
||||||
Na wejściu podawany jest zbiór treningowy $T$, a na wyjściu pojedyńcze wyrażenie regularne $p$.
|
wyjściu otrzymuje się pojedyncze wyrażenie regularne $p$.
|
||||||
Zbiór treningowy $E$ składa się z trójki uporządkowanej $(s,X)=(s,X_d,X_u)$,
|
Zbiór treningowy $E$ składa się z trójki uporządkowanej $(s,X_d,X_u)=(s,X)$,
|
||||||
gdzie $X_d$ to zbiór ciągów $x_s$ ekstrahowanych przez $p$, a
|
gdzie $X_d$ to zbiór pożądanych ciągów $x_s$ ekstrahowanych przez $p$, a
|
||||||
$X_u$ to zbiór niepożądanych ciągów $x_s$ ekstrahowanych przez $p$. Dodatkowo
|
$X_u$ to zbiór niepożądanych ciągów $x_s$ ekstrahowanych przez $p$.
|
||||||
żaden podłańcuch $x'_s$ ciągu $x_s\in X_d$ nie nachodzi na żaden podłańcuch $x'_s$ ciągu $x_s\in X_u$.
|
Nie istnieje żaden podłańcuch $x'_s$ ciągu $x_s \in
|
||||||
|
X_d$, który nachodzi na jakikolwiek podłańcuch $x'''_s$ ciągu $x''_s \in X_u$.
|
||||||
|
|
||||||
Wyrażenie regularne reprezentowane jest za pomocą drzewa. Liście składają
|
Wyrażenie regularne reprezentowane jest za pomocą drzewa. Liście składają
|
||||||
się z:
|
się z:
|
||||||
@ -135,10 +153,10 @@ się z:
|
|||||||
\item zakresów znaków np. \texttt{a-ż}, \texttt{A-Ż} i \texttt{0-9},
|
\item zakresów znaków np. \texttt{a-ż}, \texttt{A-Ż} i \texttt{0-9},
|
||||||
\item klas znaków \texttt{\textbackslash w} i \texttt{\textbackslash d},
|
\item klas znaków \texttt{\textbackslash w} i \texttt{\textbackslash d},
|
||||||
\item cyfr od 0 do 9,
|
\item cyfr od 0 do 9,
|
||||||
\item częściowych zakresów, czyli największego zakresu znaków występującego
|
\item częściowych zakresów, czyli największego zakresu znaków występującego \newline
|
||||||
w $\bigcup_{(s,X_d,X_u)\in T}X_d$, np. dla \texttt{\{pokój, ubierać\}}
|
w $\bigcup_{(s,X_d,X_u)\in T}X_d$, np. dla $\texttt{\{pokój}_3, \texttt{ubierać}_{13}\}$
|
||||||
otrzymuje się
|
otrzymuje się
|
||||||
zakresy \texttt{a-b}, \texttt{j-k} i \texttt{o-r} (przy założeniu, że
|
zakresy \newline \texttt{j-k} i \texttt{o-r} (przy założeniu, że
|
||||||
korzysta się z polskiego alfabetu),
|
korzysta się z polskiego alfabetu),
|
||||||
\item znaków specjalnych takich jak np. \texttt{\textbackslash ., :, @}.
|
\item znaków specjalnych takich jak np. \texttt{\textbackslash ., :, @}.
|
||||||
\end{enumerate}
|
\end{enumerate}
|
||||||
@ -149,96 +167,156 @@ Wierzchołki nie będące liściami składają się z:
|
|||||||
\item kwantyfikatorów bez nawrotów (ang. possessive quantifiers) $\bullet
|
\item kwantyfikatorów bez nawrotów (ang. possessive quantifiers) $\bullet
|
||||||
\ast$\texttt{+}, $\bullet$\texttt{++}, $\bullet$\texttt{?+ } oraz $ \bullet
|
\ast$\texttt{+}, $\bullet$\texttt{++}, $\bullet$\texttt{?+ } oraz $ \bullet
|
||||||
\{ \bullet, \bullet \}$\texttt{+},
|
\{ \bullet, \bullet \}$\texttt{+},
|
||||||
\item nie łapiących grup \texttt{(?:$\bullet$)}.
|
\item oznaczeń grup nieprzechwytujących \texttt{(?:$\bullet$)}.
|
||||||
\end{enumerate}
|
\end{enumerate}
|
||||||
Wyrażenie regularne $p$ otrzymuje się przechodząc drzewo sposobem post-order,\newline w którym pod $\bullet$ w wierzchołkach
|
Wyrażenie regularne $p$ otrzymuje się przechodząc drzewo sposobem
|
||||||
|
\textit{post-order},\newline w którym pod znak $\bullet$ w wierzchołkach
|
||||||
niebędących
|
niebędących
|
||||||
liściami podstawia się łańcuchy znaków zawarte w dzieciach tego wierzchołka.
|
liściami podstawia się łańcuchy znaków zawarte w dzieciach tego wierzchołka.
|
||||||
|
|
||||||
|
\begin{figure}[tbh]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=0.7\hsize]{drzewo.png}
|
||||||
|
\caption{Reprezentacja wyrażenia regularnego \texttt{abc\{1,2\}+} za pomocą drzewa.}
|
||||||
|
\label{drzewo_pic}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
\subsubsection{Inicjalizacja populacji}
|
\subsubsection{Inicjalizacja populacji}
|
||||||
Dla każdego $x_s\in \bigcup_{(s,X_d,X_u)\in T}X_d$ budowane są dwa osobniki
|
Jako $n_{pop}$ oznacza się rozmiar populacji wyrażeń regularnych $P$. Dla każdego $x_s\in \bigcup_{(s,X_d,X_u)\in T}X_d$ budowane są dwa osobniki
|
||||||
(osobnik to wyrażenie regularne). Pierwszy osobnik tworzony jest z $x_s$, w którym każda cyfra zamieniana
|
(osobnikiem jest wyrażenie regularne). Pierwszy osobnik tworzony jest z $x_s$, w którym każda cyfra zamieniana
|
||||||
jest na \texttt{\textbackslash d} oraz każda litera zamienia jest na
|
jest na \texttt{\textbackslash d} oraz każda litera zamienia jest na
|
||||||
\texttt{\textbackslash w}. Drugi osobnik tworzony jest identycznie jak pierwszy
|
\texttt{\textbackslash w}. Drugi osobnik tworzony jest identycznie jak pierwszy
|
||||||
z tą różnicą, że wielkrotne wystąpienia \texttt{\textbackslash d} (lub
|
z tą różnicą, że wielkrotne wystąpienia \texttt{\textbackslash d} (lub
|
||||||
\texttt{\textbackslash w}) zastępuje się \texttt{\textbackslash d++} (lub
|
\texttt{\textbackslash w}) zastępuje się oznaczeniami \texttt{\textbackslash d++} (lub
|
||||||
\texttt{\textbackslash w++}). %\marginpar{przykład}
|
\texttt{\textbackslash w++}). W szczególności dla $x_s=\texttt{14\textvisiblespace lutego}$
|
||||||
|
otrzymujemy osobniki \texttt{\textbackslash d\textbackslash d\textvisiblespace
|
||||||
|
\textbackslash w\textbackslash w\textbackslash w\textbackslash w\textbackslash
|
||||||
|
w\textbackslash w} oraz
|
||||||
|
\texttt{\textbackslash d++\textvisiblespace \textbackslash w++}.
|
||||||
|
|
||||||
|
Jeśli liczba wygenerowanych osobników jest większa niż $n_{pop}$, to są one
|
||||||
|
losowo usuwane, natomiast jeśli liczba osobników jest mniejsza niż $n_{pop}$, to
|
||||||
|
brakujące osobniki są generowane metodą \textit{Ramped half-and-half} \cite{ramped}. Osobniki
|
||||||
|
niereprezentujące poprawnego wyrażenia regularnego są odrzucane, a w ich miejsce
|
||||||
|
generowane \newline są nowe.
|
||||||
|
|
||||||
\subsubsection{Funkcja przystosowania}
|
\subsubsection{Funkcja przystosowania}
|
||||||
Dla każdego osobnika funkcję przystosowania zdefiniowano jako
|
Dla każdego osobnika funkcję przystosowania defniuje się jako:
|
||||||
$$f(p):=(Prec(p,T), Acc(p,T), l(p))$$
|
$$f(p):=(Prec(p,T), Acc(p,T), l(p))$$
|
||||||
Wprowadzono również dwie nowe operacje $\sqcap$ i $\ominus$, na których oparte są
|
Wprowadza się również dwie nowe operacje $\sqcap$ i $\ominus$, na których oparte są
|
||||||
funkcje $Prec$ i $Acc$.
|
funkcje $Prec$ i $Acc$.
|
||||||
Załóżono, że $X_1$ i $X_2$ to zbiory spójnych podciągów tego samego łańcucha znaków $s$.
|
Zakłada się, że $X_1$ i $X_2$ to zbiory spójnych podciągów tego samego łańcucha znaków $s$.
|
||||||
Wtedy:
|
Wtedy:
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item $X_1 \ominus X_2$ jest zbiorem takich $x_s$, że
|
\item $X_1 \ominus X_2$ jest zbiorem takich $x_s$, że
|
||||||
(i) są one spójnym podciągiem jakiegoś elementu $X_1$, (ii) nie
|
(i) są one spójnym podciągiem jakiegoś elementu $X_1$, (ii) nie
|
||||||
nachodzą na żaden z elementów $X_2$ oraz (iii) nie mają nadłańcucha, który spełnia
|
nachodzą na żaden z elementów $X_2$ oraz (iii) nie mają nadłańcucha, który
|
||||||
|
spełnia warunki
|
||||||
(i), (ii);
|
(i), (ii);
|
||||||
\item $X_1 \sqcap X_2$ jest zbiorem takich $x_s$, że (i) są one
|
\item $X_1 \sqcap X_2$ jest zbiorem takich $x_s$, że (i) są one
|
||||||
spójnym podciągiem jakiekolwiek elementu $X_1$ i
|
spójnym podciągiem jakiekolwiek elementu $X_1$ i
|
||||||
jakiekolwiek elementu $X_2$ oraz (ii) nie mają nadłańcucha, który spełnia (i).
|
jakiekolwiek elementu $X_2$ oraz (ii) nie mają nadłańcucha, który spełnia (i).
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
W końcu $$Prec(p,T):=\frac{\sum_{(s,X_d,X_u)\in T}|e(s,\{p\})\cap
|
Między innymi dla $X_1=\{\texttt{Ja}_0, \texttt{ty}_4,
|
||||||
|
\texttt{Adam\textvisiblespace Małysz}_9\}$, $X_2=\{\texttt{Ja}_0,
|
||||||
|
\texttt{Małysz}_{14}\}$: \newline $X_1 \ominus X_2 = \{\texttt{ty}_4, \texttt{Adam\textvisiblespace}_{9}\}$,
|
||||||
|
$X_1 \sqcap X_2 = \{\texttt{Ja}_0,\texttt{Małysz}_{14}\}$.
|
||||||
|
|
||||||
|
\enlargethispage{4\baselineskip}
|
||||||
|
\bigskip
|
||||||
|
\noindent W końcu $$Prec(p,T):=\frac{\sum_{(s,X_d,X_u)\in T}|e(s,\{p\})\cap
|
||||||
X_d|}{\sum_{(s,X_d,X_u)\in T}|e(s,\{p\})\sqcap (X_d \cup X_u)|}$$
|
X_d|}{\sum_{(s,X_d,X_u)\in T}|e(s,\{p\})\sqcap (X_d \cup X_u)|}$$
|
||||||
|
|
||||||
Drugi element trójki uporządkowanej, czyli $Acc(p,T)$ jest średnią arytmetyczną
|
Drugi element trójki uporządkowanej, czyli $Acc(p,T)$ jest średnią arytmetyczną
|
||||||
czułości na znakach (ang. True Positive Character Rate skr. TPCR) i
|
pokrycia na znakach (ang. True Positive Character Rate skr. TPCR) i
|
||||||
specyficzności na znakach (ang. True Negative Character Rate skr. TNCR):
|
specyficzności na znakach (ang. True Negative Character Rate skr. TNCR):
|
||||||
$$TPCR(p,T):=\frac{\sum_{(s,X_d,X_u)\in T}||e(s,\{p\})\sqcap X_d||}{\sum_{(s,X_d,X_u)\in T}||X_d||}$$
|
\begin{equation*}
|
||||||
$$TNCR(p,T):=\frac{\sum_{(s,X_d,X_u)\in T}||s \ominus e(s,\{p\}) \sqcap X_u||}{\sum_{(s,X_d,X_u)\in T}||X_u||}$$
|
\begin{split}
|
||||||
|
TPCR(p,T) & :=\frac{\sum_{(s,X_d,X_u)\in T}||e(s,\{p\})\sqcap X_d||}{\sum_{(s,X_d,X_u)\in T}||X_d||} \\[3pt]
|
||||||
$$Acc(p,T)=\frac{TPCR(p,T) + TNCR(p,T)}{2},$$
|
TNCR(p,T) & :=\frac{\sum_{(s,X_d,X_u)\in T}||s \ominus e(s,\{p\}) \sqcap X_u||}{\sum_{(s,X_d,X_u)\in T}||X_u||} \\[3pt]
|
||||||
|
Acc(p,T) & :=\frac{TPCR(p,T) + TNCR(p,T)}{2}
|
||||||
|
\end{split}
|
||||||
|
\end{equation*}
|
||||||
gdzie $||X|| = \sum_{x_s\in X}l(x_s)$, a $l(x_s)$ oznacza długość ciągu $x_s$.
|
gdzie $||X|| = \sum_{x_s\in X}l(x_s)$, a $l(x_s)$ oznacza długość ciągu $x_s$.
|
||||||
|
|
||||||
Osobniki porównywane są w pierwszej kolejności na podstawie $Prec$, potem
|
Osobniki porównywane są w pierwszej kolejności na podstawie $Prec$, \newline potem
|
||||||
\newline w
|
za pomocą $Acc$, a na końcu w przypadku identycznych
|
||||||
przypadku remisu za pomocą $Acc$, a w przypadku identycznych
|
|
||||||
$Prec$ i $Acc$ brane jest pod uwagę $l(p)$.
|
$Prec$ i $Acc$ brane jest pod uwagę $l(p)$.
|
||||||
|
|
||||||
Populacja $P$ o liczności $n$ ewoluuje następująco. W każdej iteracji $0.1n$ osobników
|
\enlargethispage{4\baselineskip}
|
||||||
|
% \end{split}
|
||||||
|
% \end{equation*}
|
||||||
|
% \begin{equation*}
|
||||||
|
% \begin{split}
|
||||||
|
\textbf{Przykład}
|
||||||
|
\begin{equation*}
|
||||||
|
\begin{split}
|
||||||
|
s & = \texttt{70.\textvisiblespace Poprawny\textvisiblespace zapis\textvisiblespace dat\textvisiblespace to\textvisiblespace np.\textvisiblespace } \\
|
||||||
|
& \quad \; \texttt{10.04.2019,\textvisiblespace 1.03.2018\textvisiblespace (nie\textvisiblespace 01.03.2018).} \\
|
||||||
|
X_d & =\{\texttt{10.04.2019}_{30}, \texttt{1.03.2018}_{42}\} \\
|
||||||
|
X_u & = \{\texttt{70.\textvisiblespace Poprawny\textvisiblespace zapis\textvisiblespace dat\textvisiblespace to\textvisiblespace np.\textvisiblespace }_0, \texttt{\textvisiblespace (nie\textvisiblespace}_{52}, \;\texttt{).}_{67}\} \\
|
||||||
|
T & = \{(s, X_d, X_u)\} \\
|
||||||
|
p_1 & = \texttt{\textbackslash d\{2,2\}+.\textbackslash d\{2,2\}+.\textbackslash d\{4,4\}+.} \\
|
||||||
|
p_2 & = \texttt{\textbackslash d\{2,4\}+} \\
|
||||||
|
e(s, {p_1}) & = \{\texttt{10.04.2019}_{30}, \texttt{01.03.2018}_{57}\} \\
|
||||||
|
e(s, {p_2}) & = \{\texttt{70}_{0}, \texttt{10}_{30}, \texttt{04}_{33}, \texttt{2019}_{36}, \texttt{03}_{44}, \texttt{2018}_{47}, \texttt{01}_{57}, \texttt{03}_{60}, \texttt{2018}_{63}\} \\[3pt]
|
||||||
|
Prec(p_1, T) & = \frac{|\{\texttt{10.04.2019}_{30}\}|}{|\{\texttt{10.04.2019}_{30}\}|} =\frac{1}{1} = 1 \\[3pt]
|
||||||
|
Prec(p_2, T) & = \frac{|\emptyset|}{|\{\texttt{70}_{0}, \texttt{10}_{30}, \texttt{04}_{33}, \texttt{2019}_{36}, \texttt{03}_{44}, \texttt{2018}_{47}\}|} = \frac{0}{6} = 0 \\[4pt]
|
||||||
|
TPCR(p_1, T) & = \frac{||\{\texttt{10.04.2019}_{30}\}||}{||\{\texttt{10.04.2019}_{30}, \texttt{1.03.2018}_{42}\}||} = \frac{10}{19} \\[4pt]
|
||||||
|
TPCR(p_2, T) & = \frac{||\{\texttt{10}_{26}, \texttt{04}_{29}, \texttt{2019}_{32}, \texttt{03}_{40}, \texttt{2018}_{43}\}||}{||\{\texttt{10.04.2019}_{30}, \texttt{1.03.2018}_{42}\}||} = \frac{14}{19} \\[4pt]
|
||||||
|
TNCR(p_1, T) & = \frac{||\{\texttt{70.\textvisiblespace Poprawny\textvisiblespace zapis\textvisiblespace dat\textvisiblespace to\textvisiblespace np.\textvisiblespace }_0, \texttt{\textvisiblespace (nie\textvisiblespace}_{51}, \;\texttt{).}_{67}\}||}{||\{\texttt{70.\textvisiblespace Poprawny\textvisiblespace zapis\textvisiblespace dat\textvisiblespace to\textvisiblespace np.\textvisiblespace }_0, \texttt{\textvisiblespace (nie\textvisiblespace}_{51}, \;\texttt{).}_{67}\}||} = \frac{38}{38} = 1\\[4pt]
|
||||||
|
TNCR(p_2, T) & = \frac{||\{\texttt{.\textvisiblespace Poprawny\textvisiblespace zapis\textvisiblespace dat\textvisiblespace to\textvisiblespace np.\textvisiblespace }_2, \texttt{\textvisiblespace (nie\textvisiblespace}_{51}, \;\texttt{).}_{67}\}||}{||\{\texttt{70.\textvisiblespace Poprawny\textvisiblespace zapis\textvisiblespace dat\textvisiblespace to\textvisiblespace np.\textvisiblespace }_0, \texttt{\textvisiblespace (nie\textvisiblespace}_{51}, \;\texttt{).}_{67}\}||} = \frac{36}{38}\\[4pt]
|
||||||
|
f(p_1) & = \bigg(1, 0.76=\frac{1}{2}\Big(\frac{10}{19} + 1\Big), 20 \bigg)\\
|
||||||
|
f(p_2) & = \bigg(0, 0.84=\frac{1}{2}\Big(\frac{14}{19} + \frac{36}{38}, \Big), 24\bigg)
|
||||||
|
\end{split}
|
||||||
|
\end{equation*}
|
||||||
|
Zgodnie z wprowadzoną funkcją oceny osobnik $p_1$ jest lepiej
|
||||||
|
przystosowany niż osobnik $p_2$.
|
||||||
|
|
||||||
|
\subsubsection{Ewolucja populacji}
|
||||||
|
Populacja $P$ o liczności $n_{pop}$ ewoluuje następująco. W każdej epoce $0.1n$ osobników
|
||||||
generowanych jest losowo za pomocą metody
|
generowanych jest losowo za pomocą metody
|
||||||
Ramped half-and-half, kolejne $0.1n$ osobników powstaje za pomocą mutacji, a
|
\textit{Ramped half-and-half} \cite{ramped}, kolejne $0.1n$ osobników powstaje za pomocą mutacji, a
|
||||||
pozostałe $0.8n$ otrzymano z
|
pozostałe $0.8n$ otrzymuje \newline się metodą krzyżowania.
|
||||||
populacji i zbioru nowo
|
Z populacji P i zbioru nowo
|
||||||
wygenerowanych osobników wybierane jest $n$ najlepiej przystosowanych osobników,
|
wygenerowanych osobników wybierane jest $n$ najlepiej przystosowanych osobników,
|
||||||
które tworzą nową populację. Osobniki wybierane \newline są do mutacji i krzyżowania za
|
które tworzą nową populację. Osobniki wybierane są do mutacji i krzyżowania
|
||||||
pomocą turnieju (losowanie z $P$ siedmiu osobników i zostawienie najlepszego).
|
metodą turnieju (losowanie z $P$ siedmiu osobników i wyłonienie najlepszego).
|
||||||
Wymuszono również różnorodność między fenotypami osobników tzn. jeśli oba
|
Pondato wymusza się także różnorodność między fenotypami osobników, tzn. jeśli oba
|
||||||
osobniki mają identyczny łańcuch znaków to w populacji zostawiono tylko jednego
|
osobniki mają identyczny łańcuch znaków to w populacji zostawia się tylko jednego
|
||||||
z nich. Koniec iteracji następuje, gdy zostanie osiągnięty \newline z góry ustalony limit generacji lub
|
z nich. Koniec iteracji następuje, gdy zostanie osiągnięty z góry ustalony limit
|
||||||
najlepiej przystosowany osobnik nie zmieni się od określonej liczby iteracji.
|
iteracji lub
|
||||||
|
najlepiej przystosowany osobnik nie zmieni się od określonej liczby epok.
|
||||||
Finalne wyrażenie regularne $p$ to najlepiej przystosowany osobnik po
|
Finalne wyrażenie regularne $p$ to najlepiej przystosowany osobnik po
|
||||||
zakończeniu wszystkich iteracji.
|
zakończeniu wszystkich iteracji.
|
||||||
\subsubsection{Dziel i zwyciężaj}
|
\subsubsection{Zastosowanie metody „dziel i zwyciężaj”}
|
||||||
Zbiór wyrażeń regularnych $P$ generowany jest za pomocą strategii dziel i
|
Zbiór wyrażeń regularnych $P$ generowany jest za pomocą strategii „dziel i zwyciężaj”.
|
||||||
zwyciężaj. W każdej iteracji spójne podciągi ciągu znaków $s$, które zostały poprawnie
|
W każdej iteracji spójne podciągi ciągu znaków $s$, które zostały poprawnie
|
||||||
wykryte przez $P$ są usuwane ze zbioru treningowego.
|
wykryte przez $P$ są usuwane ze zbioru treningowego.
|
||||||
|
|
||||||
Oby uniknąć przetrenowania, czyli bardzo wysokiego F-measure na $E$, a niskiego na $E'$
|
\enlargethispage{2\baselineskip}
|
||||||
|
Oby uniknąć przetrenowania, czyli bardzo wysokiego \textit{F-measure} na $E$, a niskiego na $E'$,
|
||||||
zbiór treningowy $E$ dzielony jest losowo na dwa zbiory $E_{train}$ i $E_{validation}$
|
zbiór treningowy $E$ dzielony jest losowo na dwa zbiory $E_{train}$ i $E_{validation}$
|
||||||
takie, że $E=E_{train} \cup E_{validation}$, $E_{train} \cap E_{validation} =
|
takie, że $E=E_{train} \cup E_{validation}$, $E_{train} \cap E_{validation} =
|
||||||
\emptyset$ \newline i
|
\emptyset$ \newline i
|
||||||
$\sum_{(s,X)\in E_{train}}|X|\approx \sum_{(s,X)\in E_{validation}}|X|$.
|
$\sum_{(s,X)\in E_{train}}|X|\approx \sum_{(s,X)\in E_{validation}}|X|$.
|
||||||
|
|
||||||
\enlargethispage{7\baselineskip}
|
|
||||||
|
|
||||||
\newpage
|
\noindent Procedura generowania zbioru wyrażeń regularnych $P$ prezentuje się następująco.
|
||||||
|
|
||||||
Zacznij z $P=\emptyset$ i z $T$ utworzonym w taki sposób, że dla
|
Zacznij z $P=\emptyset$ i z $T$ utworzonym w taki sposób, że dla
|
||||||
każdego $(s,X)\in E_t$, trójka uporządkowana $(s, X, \{s\} \ominus X)$ jest
|
każdego $(s,X)\in E_{train}$, trójka uporządkowana $(s, X, \{s\} \ominus X)$ jest
|
||||||
dodawana do $T$, \newline gdzie $X_d:=X$ i $X_u:=\{s\} \ominus X$.
|
dodawana do $T$, \newline gdzie $X_d:=X$ i $X_u:=\{s\} \ominus X$.
|
||||||
|
|
||||||
\noindent Następnie dopóki $\bigcup_{(x,X_d,X_u)\in T}X_d\ne \emptyset$ powtarzaj:
|
\noindent Następnie dopóki $\bigcup_{(x,X_d,X_u)\in T}X_d\ne \emptyset$ powtarzaj:
|
||||||
\begin{enumerate}
|
\begin{enumerate}
|
||||||
\item Wykonaj algorytm genetyczny na $T$ i otrzymaj finalne $p$.
|
\item Wykonaj algorytm genetyczny na $T$ i otrzymaj wyrażenie regularne $p$.
|
||||||
\item Jeśli $Prec(p,T)=1$, to $P:=P\cup\{p\}$, w przeciwnym wypadku przerwij pętlę.
|
\item Jeśli $Prec(p,T)=1$, to $P:=P\cup\{p\}$, w przeciwnym wypadku przerwij pętlę.
|
||||||
\item Dla każdego $(s, X_d, X_u)\in T$, ustaw $X_d:=X_d\setminus e(s, \{p\})$.
|
\item Dla każdego $(s, X_d, X_u)\in T$ ustaw $X_d:=X_d\setminus e(s, \{p\})$.
|
||||||
\end{enumerate}
|
\end{enumerate}
|
||||||
|
|
||||||
Powyższa procedura powtarzana jest wiele razy z różnym zarodkiem generatora
|
Powyższa procedura powtarzana jest wiele razy z różnym zarodkiem generatora
|
||||||
liczb losowych (startowy zbiór trenujący $T$ pozostaje bez zmian), by otrzymać
|
liczb losowych (startowy zbiór trenujący $T$ pozostaje bez zmian), by otrzymać
|
||||||
wiele różnych zbiorów $P$, z których na końcu wybierany jest ten o najwyższej
|
dużo różnych zbiorów $P$, z których na końcu wybierany jest ten o najwyższej
|
||||||
średniej harmonicznej z precyzji i czułości na $E=E_{train} \cup E_{validation}$.
|
średniej harmonicznej z precyzji i pokrycia na $E=E_{train} \cup E_{validation}$.
|
||||||
%\section{Sieci neuronowe}
|
%\section{Sieci neuronowe}
|
@ -21,4 +21,4 @@
|
|||||||
\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
|
||||||
\chapter{Wnioski}
|
\chapter{Wnioski}
|
||||||
\chapter{Perspektywy na przyszłość}
|
\chapter{Perspektywy na przyszłość}
|
||||||
|
Loading…
Reference in New Issue
Block a user