% Copyright © 2004-2009 Adam Przepiórkowski
%
% This program is free software; you can redistribute it and/or
% modify it under the terms of the GNU General Public License
% as published by the Free Software Foundation; either version 2
% of the License, or (at your option) any later version.
%
% This program is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with this program; if not, write to the Free Software
% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
% MA 02110-1301, USA.

\author{Adam Przepiórkowski, Jakub Wilk}

\section{Język zapytań}
\label{sec:query-syntax}

Składnia zapytań w~programie Poliqarp jest wzorowana na składni używanej
w~programie Corpus Query Processor (CQP) stworzonym na Uniwersytecie
w~Stuttgarcie, zawiera jednak szereg rozszerzeń i~udogodnień.  Niniejszy
rozdział omawia składnię zapytań programu Poliqarp i~ilustruje ją wieloma
przykładami.

\subsection{Zapytania o segmenty}
\label{sec:zapytania-o-formy}

W~najprostszym wypadku zapytanie to ciąg szukanych segmentów, np.:

\begin{itemize}
\item \texttt{przyszedł czas}
\item \texttt{przyszedł em rano}
\end{itemize}

W~drugim z~powyższych dwóch zapytań występują trzy segmenty odpowiadające
dwóm słowom: \emph{przyszedłem} i~\emph{rano}.  W~wypadku prostych zapytań
o~formy Poliqarp próbuje wykryć sytuacje, w~których słowo składa się z~kilku
segmentów i~znaleźć odpowiednie ciągi segmentów, a~zatem prawidłowe wyniki
dadzą także zapytania:

\begin{itemize}
\item \texttt{przyszedłem rano}
\item \texttt{długom szedł}
\end{itemize}
W~tym drugim wypadku znalezione zostaną zarówno wszystkie wystąpienia
trzysegmentowych ciągów \emph{[długo][m] [szedł]}, interpretowanych jako
przysłówek, aglutynant i~pseudoimiesłów, jak i~dwusegmentowych ciągów
\emph{[długom] [szedł]}, interpretowanych jako celownikowa forma nominalna
i~pseudoimiesłów.

Domyślnie rozróżniana jest kasztowość (wielkość) liter, a~zatem poniższe dwa
zapytania dadzą różne wyniki:

\begin{itemize}
\item \texttt{przyszedł}
\item \texttt{Przyszedł}
\end{itemize}

Aby znaleźć wszystkie wystąpienia formy \emph{przyszedł}, niezależnie od
wielkości poszczególnych liter, należy użyć flagi \texttt{/i}.  Poniższe
zapytania dadzą te same wyniki, zawierające wszystkie odpowiedzi na oba
powyższe zapytania.

\begin{itemize}
\item \texttt{przyszedł/i}
\item \texttt{Przyszedł/i}
\end{itemize}

W~wersji graficznej i~tekstowej programu kasztowość można ustawić także
globalnie dla całego zapytania lub szeregu zapytań.

W~zapytaniach o~segmenty mogą wystąpić standardowe wyrażenia regularne
wykorzystujące następujące znaki specjalne: \texttt{?}, \texttt{*},
\texttt{+}, \texttt{.}, \texttt{,}, \texttt{|}, \texttt{\lbr{}}, \texttt{\rbr{}},
\texttt{[}, \texttt{]}, \texttt{(}, \texttt{)} oraz liczby naturalne pisane
cyframi arabskimi, np.~\texttt{0} czy \texttt{21}, przy czym specyfikacje
segmentów zawierające wyrażenia regularne muszą być ujęte
w~cudzysłowy~\texttt{"}.  Ponieważ formalny opis wyrażeń regularnych
wykracza poza ramy niniejszej publikacji, ograniczymy się tutaj do kilku
przykładów, które powinny pozwolić użytkownikowi na szybkie przyswojenie
składni i~znaczenia takich wyrażeń.

\begin{enumerate}

\item \texttt{"Ala|Ela"}

znak \texttt{|} oznacza alternatywę dwóch wyrażeń, a~zatem  zapytanie to
może zostać użyte do znalezienia wszystkich wystąpień segmentów o~postaci
\emph{Ala} lub \emph{Ela}, \item \texttt{"[AE]la"}

nawiasy kwadratowe oznaczają alternatywę znaków, a~zatem zapytanie to może
zostać użyte do znalezienia tych segmentów, których pierwszy znak to
\emph{A} lub \emph{E}, a~następne to \emph{la}, tj. zapytanie to jest
równoważne poprzedniemu,

\item \texttt{"beza?"}

znak zapytania oznacza opcjonalność znaku (tutaj \emph{a}) lub ujętego
w~nawiasy okrągłe wyrażenia bezpośrednio poprzedzającego znak \texttt{?},
a~zatem w~wyniku zadania tego zapytania znalezione zostaną segmenty
\emph{bez} i \emph{beza},

\item \texttt{"bez."}

kropka oznacza dowolny znak, a~zatem wynikiem tego zapytania będą segmenty
\emph{beza}, \emph{bezy}, \emph{bezą} itp., ale nie \emph{bez} czy
\emph{bezami},

\item \texttt{"bez.?"}

\emph{bez}, \emph{beza}, \emph{bezy}, \emph{bezą} itp., ale nie
\emph{bezami},

\item \texttt{".z.z."}

segmenty pięcioznakowe, w~których 2. i~4. znak to \emph{z} (np.~\emph{czczą}
i~\emph{rzezi}),

\item \texttt{".z.z..?"}

segmenty składające się z~pięciu lub sześciu znaków, w~których 2. i~4. znak
to \emph{z}, np.~\emph{czczą}, \emph{rzezi} i~\emph{szczyt},

\item \texttt{"a*by"}

gwiazdka oznacza dowolną liczbę wystąpień znaku lub wyrażenia bezpośrednio
przed nią, a~zatem zapytanie to może posłużyć do znalezienia segmentów
składających się z~dowolnej liczby liter \emph{a}, po których następuje ciąg
\emph{by}, np.~\emph{by} (zero wystąpień \emph{a}), \emph{aby},
\emph{aaaaby} itp.,

\item \texttt{"Ala.*"}

segmenty zaczynające się na \emph{Ala}, np.~\emph{Ala} i~\emph{Alabama},

\item \texttt{"ala.*"/i}

segmenty zaczynające się na \emph{ala}, \emph{Ala}, \emph{aLa}, \emph{ALA}
itd., np.~\emph{Ala}, \emph{alabaster} i~\emph{ALABAMA},

\item \texttt{".*al+"}

plus ma działanie podobne do gwiazdki i~oznacza dowolną \emph{większą od
zera} liczbę wystąpień znaku lub wyrażenia bezpośrednio przed nim, a~zatem
wynikiem tego zapytania będzie znalezienie segmentów kończących się na
\emph{al}, \emph{all}, \emph{alll} itd., ale nie na \emph{a},
np.~\emph{dal}, \emph{robal} i~\emph{Gall},

\item \texttt{"a\lbr{}1,3\rbr{}b.*"/i}

konstrukcja typu \texttt{{n,m}} oznacza od \texttt{n} do \texttt{m}
wystąpień znaku lub wyrażenia bezpośrednio przed nią, a~zatem zapytanie to
pomoże znaleźć segmenty zaczynające się od ciągu od 1 do 3 liter \emph{a}
lub \emph{A}, po którym następuje litera \emph{b} lub \emph{B}, a~następnie
dowolny ciąg znaków (por.~\texttt{.*}), np.~\emph{Aby}, \emph{aaaby},
\emph{absolutnie}, \emph{ABBA},

\item \label{flank} \texttt{".*(la)\lbr{}3,\rbr{}.*"}

konstrukcja typu \texttt{{n,}} oznacza co najmniej \texttt{n} wystąpień
znaku lub ujętego w~nawiasy okrągłe wyrażenia bezpośrednio przed nią,
a~zatem zapytanie to może posłużyć do znalezienia segmentów, w~których ciąg
\emph{la} występuje przynajmniej 3 razy pod rząd, np.~\emph{tralalala},
\emph{sialalala},

\item \texttt{"[bcćdfghjklłmnńprsśtwzźż]\lbr{}4,\rbr{}[aąeęioóuy]"/i}

segmenty składające się z~co najmniej 4 spółgłosek i~dokładnie jednej
samogłoski, np.~\emph{źdźbła} i \emph{Chrzczę} wyrażenie
\texttt{[bcćdfghjklłmnńprsśtwzźż]\lbr{}4,\rbr{}} oznacza co najmniej czterokrotne
powtórzenie znaku pasującego do \texttt{[bcćdfghjklłmnńprsśtwzźż]}, tj. co
najmniej cztery wystąpienia spółgłoski (niekoniecznie tej samej),

\item \texttt{"([bcćdfghjklłmnńprsśtwzźż]\lbr{}3\rbr{}[aąeęioóuy]){2,}"/i}

segmenty składające się z~co najmniej dwukrotnego powtórzenia wzorca CCCV,
gdzie C to spółgłoska, a~V to samogłoska, np.~\emph{wszystko},
\emph{Zdmuchnąwszy} i~\emph{Szmajdziński} konstrukcja typu \texttt{{n}}
oznacza \emph{dokładnie} \texttt{n} wystąpień znaku lub ujętego w~nawiasy
okrągłe wyrażenia bezpośrednio przed nią,

\item \texttt{"([\textasciicircum{}aąeęioóuy]\lbr{}3\rbr{}[aąeęioóuy]){2,}"/i}

jak wyżej,

\item \texttt{"(pod|na|za)jecha.*"}

segmenty zaczynające się od \emph{podjecha}, \emph{najecha}
i~\emph{zajecha}, np.~\emph{podjechał}, \emph{zajechawszy}.

\end{enumerate}

Specyfikacje segmentów podane powyżej muszą pasować do całych segmentów stąd
konieczność umieszczenia po obu stronach ciągu \texttt{(la)\lbr{}3,\rbr{}}
w~zapytaniu~\ref{flank}. o~segmenty zawierające ciąg \emph{lalala} wyrażenia
\texttt{.*}, pasującego do dowolnego ciągu znaków.  Ten sam efekt zostanie
osiągnięty przy użyciu flagi \texttt{/x},\label{flagax} oznaczającej, że
dana specyfikacja segmentu musi pasować przynajmniej do części danego
segmentu, niekoniecznie do całego segmentu:

\begin{itemize}
\item \texttt{"(la)\lbr{}3,\rbr{}"/x}

segmenty, w~których ciąg \emph{la} występuje przynajmniej 3 razy pod rząd,
np.~\emph{tralalala}, \emph{sialalala},

\item \texttt{"(la)\lbr{}3,\rbr{}"/ix}

segmenty, w~których występuje ciąg \emph{lalala}, \emph{LaLAla} itp.,
np.~\emph{tralalala}, \emph{SiaLaLALA}.

\end{itemize}

\subsection{Zapytania o formy podstawowe}
\label{sec:zapytania-o-formy-1}

Aby znaleźć wszystkie formy leksemu \textsc{korpus}, można użyć
następującego zapytania:

\begin{itemize}
\item \texttt{[base=korpus]}
\end{itemize}

Atrybut \texttt{base} jest jednym z~wielu możliwych atrybutów, jakie mogą
pojawić się w~zapytaniu.  Wartością tego atrybutu powinna być specyfikacja
formy podstawowej (hasłowej), a~zatem zapytanie \texttt{[base=pisać]} może
być użyte do znalezienia form typu \emph{pisać}, \emph{piszę},
\emph{pisała}, \emph{piszcie}, \emph{pisanie}, \emph{pisano}, \emph{pisane}
itp.

Innym możliwym atrybutem jest \texttt{orth} wartości tego atrybutu określają
same segmenty, a~zatem następujące pary zapytań są równoważne:

\begin{itemize}
\item \begin{itemize}
\item \texttt{przyszedł}
\item \texttt{[orth=przyszedł]}

\end{itemize}
\item \begin{itemize}
\item \texttt{Przyszedł/i}
\item \texttt{[orth=Przyszedł/i]}

\end{itemize}
\item \begin{itemize}
\item \texttt{przyszedł czas}
\item \texttt{[orth=przyszedł][orth=czas]}

\end{itemize}
\end{itemize}

Nie są jednak równoważne zapytania:

\begin{itemize}
\item \begin{itemize}
\item \texttt{przyszedłem rano}
\item \texttt{[orth=przyszedłem][orth=rano]}

\end{itemize}
\end{itemize}

W~pierwszym wypadku program spróbuje rozbić słowo \emph{przyszedłem} na dwa
segmenty, \emph{przyszedł} i~\emph{em}, podczas gdy wartość atrybutu
\texttt{orth} jest zawsze interpretowana jako specyfikacja pojedynczego
segmentu.

Wartościami atrybutów \texttt{base} i~\texttt{orth} mogą być wyrażenia
regularne, podobnie jak w~wypadku prostych zapytań o~formy opisanych
w~p.\ref{sec:zapytania-o-formy}, np.:

\begin{itemize}

\item \texttt{[orth="bez.?"/i]}

znalezione zostaną segmenty \emph{bez}, \emph{Beza}, \emph{bezy} itp., ale
nie \emph{bzem} czy \emph{bezami},

\item \texttt{[base="bez.?"/i]}

znalezione zostaną wszystkie segmenty, których forma hasłowa ma 3 lub 4
litery i~zaczyna się od \emph{bez} (przy dowolnej kasztowości), czyli
np.~segmenty \emph{bzem}, \emph{bez}, \emph{bezami} itp.

\end{itemize}

\subsection{Zapytania wyższego rzędu}
\label{sec:zapyt-wysz-rzdu}

Zapytania o~segmenty i~o~formy podstawowe segmentów można łączyć.  Na
przykład, aby znaleźć wszystkie wystąpienia segmentu \emph{minę} rozumianego
jako forma leksemu \textsc{mina} (a~nie na przykład leksemu \textsc{mijać}),
można zadać następujące zapytanie:

\begin{itemize}
\item \texttt{[orth=minę \& base=mina]}

\end{itemize}

Podobne znaczenie ma następujące zapytanie o~te wystąpienia segmentu
\emph{minę}, które \emph{nie} są interpretowane jako formy leksemu
\textsc{mijać}.

\begin{itemize}
\item \texttt{[orth=minę \& base!=mijać]}
\end{itemize}

Warunek, że forma hasłowa to nie \emph{mijać}, można zadać także,
umieszczając znak negacji (wykrzyknik) przed nazwą atrybutu, a~więc poniższe
zapytanie jest w~pełni równoważne zapytaniu powyższemu.

\begin{itemize}
\item \texttt{[orth=minę \& !base=mijać]}
\end{itemize}

Podobnie jak w~rachunku zdań, zapytanie z~podwójną negacją jest równoważna
zapytaniu bez negacji, a~zatem następujące zapytania o~segment \emph{nie}
jako formę zaimka osobowego \textsc{on} są w~pełni równoważne:

\begin{itemize}
\item \texttt{[orth=nie \& base=on]}
\item \texttt{[orth=nie \& !base!=on]}
\item \texttt{[orth=nie \& !!!base!=on]}
\item \texttt{[orth=nie \& !!base=on]}
\end{itemize}

W~powyższych zapytaniach operator \texttt{\&} spełnia rolę logicznej
koniunkcji.  Operatorem do niego dualnym jest operator \texttt{|},
spełniający rolę logicznej alternatywy.  Oto kilka przykładów użycia tego
operatora:

\begin{itemize}

\item \texttt{[base=on | base=ja]}

wszystkie formy zaimków \textsc{on} i~\textsc{ja}, równoważne zapytaniu
\texttt{[base="on|ja"]},

\item \texttt{[base=on | orth=mnie | orth=ciebie]}

wszystkie formy zaimka \textsc{on}, a~także segmenty \emph{mnie}
i~\emph{ciebie},

\item \texttt{[orth=pora \& !(base=por | base=pora)]}

segment \emph{pora} nie będący ani formą leksemu \textsc{por}, ani formą
leksemu \textsc{pora}.

\end{itemize}

Aby lepiej zrozumieć różnicę pomiędzy operatorami \texttt{\&} i~\texttt{|},
porównajmy następujące dwa zapytania:

\begin{itemize}
\item \texttt{[orth=minę \& base=mina]}
\item \texttt{[orth=minę | base=mina]}
\end{itemize}

W~wyniku zadania pierwszego zapytania znalezione zostaną te segmenty, które
są jednocześnie (koniunkcja) segmentem \emph{minę} i~formą leksemu
\textsc{mina}, a~więc wyłącznie te wystąpienia segmentu \emph{minę}, które
są interpretowane jako formy leksemu \textsc{mina}.  W~wyniku zadania
drugiego zapytania znalezione natomiast zostaną te segmenty, które są albo
dowolnie interpretowanym segmentem \emph{minę}, albo formą leksemu
\textsc{mina} (alternatywa), czyli wszystkie wystąpienia zarówno segmentu
\emph{minę}, jak i~segmentów \emph{mina}, \emph{miny}, \emph{minami} itp.
interpretowanych jako formy leksemu \textsc{mina}.

Specyfikacje pozycji w~korpusie, ujęte w~nawiasy kwadratowe, mogą zawierać
dowolną liczbę warunków typu \texttt{atrybut=wartość} (na przykład
\texttt{orth=nie}) połączonych operatorami \texttt{!}, \texttt{\&}
i~\texttt{|}, tak jak pokazują to powyższe przykłady.  Możliwe jest także
całkowite pominięcie jakichkolwiek warunków poniższe zapytanie mogłoby
posłużyć do znalezienia wszystkich segmentów w~korpusie.%
\footnote{%
Mogłoby, gdyby nie fakt, że Poliqarp zawiera wewnętrzne ograniczenia na
liczbę możliwych wyników zapytania.}

\begin{itemize}
\item \texttt{[]}
\end{itemize}

Taka trywialna specyfikacja pozycji w~korpusie, pasująca do dowolnego
segmentu, może posłużyć na przykład do znalezienia dwóch form oddzielonych
od siebie dowolnymi dwoma segmentami, np.:

\begin{itemize}
\item \texttt{[orth=się][][][base=bać]}
\end{itemize}

W~wyniku tego zapytania zostaną znalezione ciągi takie jak \emph{się nikogo
nie bać}, \emph{się Boga nie boicie} itp.

Dla wielu zastosowań ciekawsza byłaby możliwość zapytania na przykład
o~formy oddalone od siebie o~\emph{najwyżej} pięć pozycji.  Poliqarp
umożliwia zadawanie takich pytań, gdyż pozwala na formułowanie wyrażeń
regularnych także na poziomie pozycji korpusu.  Na przykład zapytanie
o~formę leksemu \textsc{bać} występującą dwie, trzy lub cztery pozycje dalej
niż forma \emph{się} może wyglądać następująco:

\begin{itemize}
\item \texttt{[orth=się][]\lbr{}2,4\rbr{}[base=bać]}
\end{itemize}

W~wyniku tego zapytania zostaną znalezione ciągi uzyskane w~wyniku
poprzedniego zapytania, a~także na przykład ciąg \emph{się każdy następny
Rywin będzie bał}.

Zapewne bardziej poprawnym zapytaniem o~różne wystąpienia form
tzw.~czasownika zwrotnego \textsc{bać się} byłoby zapytanie o~\emph{się}
w~pewnej odległości przed formą leksemu \textsc{bać}, ale bez znaku
interpunkcyjnego pomiędzy tymi formami, lub bezpośrednio za taką formą,
ewentualnie oddzielone od formy \textsc{bać} zaimkiem osobowym:

\begin{itemize}
\item \texttt{[orth=się][orth!="[.!?,:]"]\lbr{},5\rbr{}[base=bać] \\
| [base=bać][base="on|ja|ty|my|wy"]?[orth=się]}
\end{itemize}

\subsection{Zapytania o znaczniki morfosyntaktyczne}
\label{sec:zapyt-o-znaczn}

Powyższe zapytanie można uprościć poprzez zastąpienie warunku
\texttt{orth!="[.!?,:]"} bezpośrednim odwołaniem do ,,klasy gramatycznej''
\emph{interp}:

\begin{itemize}
\item \texttt{[orth=się][pos!=interp]\lbr{},5\rbr{}[base=bać] \\
| [base=bać][base="on|ja|ty|my|wy"]?[orth=się]}
\end{itemize}

Ogólniej, wartościami atrybutu \texttt{pos} (ang.~\emph{part of speech}
'część mowy') są skróty nazw klas gramatycznych omówionych
w~p.\ref{sec:klasy-gramatyczne} (por.~tabela w p.\ref{skrklasflek}).  Na
przykład zapytanie o~sekwencję dwóch form rzeczownikowych rozpoczynających
się na \emph{a} może być sformułowane w~sposób następujący:

\begin{itemize}
\item \texttt{[pos=subst \& orth="a.*"]\lbr{}2\rbr{}}
\end{itemize}

Podobnie jak to miało miejsce w~wypadku specyfikacji form tekstowych i~form
hasłowych, także specyfikacje klas gramatycznych mogą zawierać wyrażenia
regularne.  Na przykład, zważywszy na to, że zaimki osobowe należą do klasy
zaimków trzecioosobowych \emph{ppron3} i~do klasy zaimków
nietrzecioosobowych \emph{ppron12}, poniższe zapytania mogą posłużyć do
znalezienia dowolnych form dowolnych zaimków osobowych:

\begin{itemize}
\item \texttt{[pos=ppron12 | pos=ppron3]}
\item \texttt{[pos="ppron12|ppron3"]}
\item \texttt{[pos="ppron(12|3)"]}
\item \texttt{[pos="ppron[123]+"]}
\item \texttt{[pos="ppron.+"]}
\item \texttt{[pos=ppron/x]}
\end{itemize}

A~zatem zapytanie o~formy \textsc{bać się} może zostać jeszcze bardziej
uproszczone do następującego zapytania:

\begin{itemize}
\item \texttt{[orth=się][pos!=interp]\lbr{},5\rbr{}[base=bać] \\
| [base=bać][pos=ppron/x]?[orth=się]}
\end{itemize}

W~zapytaniach można określać wartości nie tylko formy wyrazowej (za pomocą
atrybutu \texttt{orth}), formy hasłowej (za pomocą \texttt{base}) i~klasy
gramatycznej (za pomocą \texttt{pos}), ale także wartości poszczególnych
kategorii gramatycznych, takich jak przypadek czy rodzaj.  Służą do tego
następujące atrybuty (por.~p.\ref{sec:kat}):

\begin{tabular}{llll}
\textbf{atrybut} &
\textbf{kategoria} &
\textbf{możliwe wartości}
\\
\texttt{number} &
liczba &
\texttt{sg}  \texttt{pl}
\\
\texttt{case} &
przypadek &
\texttt{nom}  \texttt{gen}  \texttt{dat}
  \texttt{acc} \texttt{inst} \texttt{loc}  \texttt{voc}
\\
\texttt{gender} &
rodzaj &
\texttt{m1}  \texttt{m2}  \texttt{m3}  \texttt{f}  \texttt{n}
\\
\texttt{person} &
osoba &
\texttt{pri}  \texttt{sec}  \texttt{ter}
\\
\texttt{degree} &
stopień &
\texttt{pos}  \texttt{comp}  \texttt{sup}
\\
\texttt{aspect} &
aspekt &
\texttt{imperf}  \texttt{perf}
\\
\texttt{negation} &
zanegowanie &
\texttt{aff}  \texttt{neg}
\\
\texttt{accentability} &
akcentowość &
\texttt{akc}  \texttt{nakc}
\\
\texttt{post-prepositionality} &
poprzyimkowość &
\texttt{npraep}  \texttt{praep}
\\
\texttt{accommodability} &
akomodacyjność &
\texttt{congr}  \texttt{rec}
\\
\texttt{agglutination} &
aglutynacyjność &
\texttt{agl}  \texttt{nagl}
\\
\texttt{vocalicity} &
wokaliczność &
\texttt{nwok}  \texttt{wok}
\end{tabular}

A~zatem możliwe jest zadanie na przykład następujących zapytań:

\begin{enumerate}
\item \texttt{[number=sg]}

znalezione zostaną wszystkie formy w~liczbie pojedynczej,

\item \texttt{[pos=subst \& number=sg]}

znalezione zostaną formy rzeczownikowe w~liczbie pojedynczej,

\item \texttt{[pos=subst \& gender!=f]}

formy rzeczownikowe rodzaju męskiego lub nijakiego,

\item \label{bezskr} \texttt{[number=sg \& case="nom|acc" \&
gender="m[123]"]}


pojedyncze mianownikowe lub biernikowe formy męskie.

\end{enumerate}

Zamiast pełnych nazw atrybutów można używać ich trzyliterowych skrótów:

\begin{tabular}{llll}
\textbf{atrybut} &
\textbf{skrót}
\\
\texttt{number} &
\texttt{nmb}
\\
\texttt{case} &
\texttt{cas}
\\
\texttt{gender} &
\texttt{gnd}
\\
\texttt{person} &
\texttt{per}
\\
\texttt{degree} &
\texttt{deg}
\\
\texttt{aspect} &
\texttt{asp}
\\
\texttt{negation} &
\texttt{neg}
\\
\texttt{accommodability} &
\texttt{acm}
\\
\texttt{accentability} &
\texttt{acn}
\\
\texttt{post-prepositionality} &
\texttt{ppr}
\\
\texttt{agglutination} &
\texttt{agg}
\\
\texttt{vocalicity} &
\texttt{vcl}
\end{tabular}

A~zatem powyższe zapytanie~\ref{bezskr}. można zadać także w~sposób
następujący:

\begin{itemize}
\item \texttt{[nmb=sg \& cas="nom|acc" \& gnd="m[123]"]}
\end{itemize}

Wersje graficzna i~tekstowa umożliwiają zdefiniowanie
tzw.~aliasów,\label{alias} czyli skrótów alternatyw wartości danego
atrybutu, których następnie można używać jak zwykłych wartości atrybutów.
W~obecnej wersji Narodowego Korpusu Języka Polskiego predefiniowane są cztery takie aliasy:

\begin{tabular}{llll}
\textbf{alias} &
\textbf{definicja}
\\
\texttt{masc} &
\texttt{m1}  \texttt{m2}  \texttt{m3}
\\
\texttt{noun} &
\texttt{subst}  \texttt{depr}    \texttt{ger}  \texttt{xxs}  \texttt{ppron12}  \texttt{ppron3}
\\
\texttt{pron} &
\texttt{ppron12}  \texttt{ppron3}  \texttt{siebie}
\\
\texttt{verb} &
\texttt{fin}  \texttt{praet}    \texttt{aglt}
  \texttt{bedzie}  \texttt{inf}  \texttt{imps}  \texttt{impt}
  \texttt{pact}  \texttt{ppas}  \texttt{pcon}
  \texttt{pant}  \texttt{ger}  \texttt{winien}
\end{tabular}

Przy tak zdefiniowanych aliasach \texttt{noun} i~\texttt{masc}, poniższe dwa
zapytania są równoważne:

\begin{itemize}
\item \texttt{[pos=noun \& gender=masc]}
\item \texttt{[pos="subst|depr|ger|xxs|ppron12|ppron3" \& gender="m1|m2|m3"]}
\end{itemize}

O~klasy gramatyczne i~kategorie gramatyczne można także pytać łącznie,
używając do tego atrybutu \texttt{tag}.  Na przykład, aby znaleźć wszystkie
rzeczowniki nijakie w~mianowniku o~pojedynczej wartości liczby, można zadać
następujące zapytanie:

\begin{itemize}
\item \texttt{[tag=subst:sg:nom:n]}
\end{itemize}

Wartości atrybutu \texttt{tag} mają postać
\texttt{kl:kat$_1$:kat$_2$:...:kat$_n$}\label{tagsy}, gdzie \texttt{kl} to
nazwa klasy gramatycznej, a~\texttt{kat$_i$} to wartości kategorii
przysługujących tej klasie w~kolejności, w~jakiej zostały podane
w~tabeli w p.\ref{tabzewsz}.

Tak jak w~wypadku innych atrybutów, specyfikacja atrybutu \texttt{tag} może
być zadana wyrażeniem regularnym, np.:

\begin{itemize}
\item \texttt{[tag=".*:sg:(nom|acc):m[123].*"]}
\item \texttt{[tag="sg:(nom|acc):m[123]"/x]}
\end{itemize}

Specyfikacje klas gramatycznych i kategorii gramatycznych mogą zawierać zmienne
(mające postać \texttt{\$$n$}, gdzie $n$ jest pojedynczą cyfrą), których
wartości zostaną ustalone dopiero podczas wykonywania zapytania. Na przykład
poniższe zapytanie o zapytanie o przymiotnik i rzeczownik z uzgodnionymi
wartościami przypadka:

\begin{itemize}
\item
\texttt{[case=nom \& pos=adj] [case=nom \& pos=subst] | [case=gen \& pos=adj] [case=gen \& pos=subst] |} \\
\texttt{[case=dat \& pos=adj] [case=dat \& pos=subst] | [case=acc \& pos=adj] [case=acc \& pos=subst] |} \\
\texttt{[case=inst \& pos=adj] [case=inst \& pos=subst] | [case=loc \& pos=adj] [case=loc \& pos=subst] |} \\
\texttt{[case=voc \& pos=adj] [case=voc \& pos=subst]}
\end{itemize}

można uprościć do:

\begin{itemize}
\item \texttt{[case=\$1 \& pos=adj] [case=\$1 \& pos=subst]}
\end{itemize}

\subsection{Wieloznaczności i~dezambiguacja}
\label{sec:wieloznacznoci}

Jedną z~cech, które wyróżniają Narodowy Korpus Języka Polskiego i~program Poliqarp, jest
możliwość reprezentacji wieloznaczności morfosyntaktycznych.  Istnieją
jednak konstrukcje, w~których nie jest możliwe ujednoznacznienie
interpretacji danej formy, na przykład dlatego, że kilka możliwych
interpretacji prowadzi do identycznego znaczenia całego zdania.  Ilustruje
to przykład~\ref{pij1}.

\begin{enumerate}
\item \label{pij1} Pamiętam ją pijaną.
\item \label{pij2}
\begin{enumerate}
\item Pamiętam go pijanego.
\item Pamiętam go pijanym.
\end{enumerate}
\end{enumerate}

W~przykładzie tym nie można stwierdzić, czy forma \emph{pijaną} jest formą
biernikową, jak \emph{pijanego} w~\ref{pij2}a., czy też formą narzędnikową,
jak \emph{pijanym} w~\ref{pij2}.  Dlatego też w~korpusie segment
\emph{pijaną} w~\ref{pij1}. powinien dostać dwie interpretacje: biernikową
i~narzędnikową.

W~takim wypadku powstaje jednak pytanie, czy segment \emph{pijaną}
w~\ref{pij1}. powinien zostać znaleziony w~wypadku zadania zapytania typu
\texttt{[case=acc]}, czy też nie: za odpowiedzią pozytywną przemawia fakt,
że interpretacja biernikowa jest poprawną interpretacją tego segmentu w~tym
kontekście, zaś za odpowiedzią negatywną fakt, że nie można z~całkowitą
pewnością uznać tej formy za formę biernikową.

Zamiast narzucać jedną z~tych interpretacji, Poliqarp pozwala na zadanie obu
rodzajów zapytań.  Wynikiem zapytania \texttt{[case=acc]} będzie znalezienie
tych segmentów, w~wypadku których przynajmniej jedna z~interpretacji
poprawnych w~danym kontekście jest interpretacją biernikową, a~zatem,
w~wypadku zdania~\ref{pij1}., zostanie znaleziony zarówno segment
\emph{pijaną}, jak i~segment \emph{ją}, zaś w~wypadku zdania~\ref{pij2}a.
zarówno \emph{pijanego}, jak i~\emph{go}.  Aby natomiast znaleźć te
segmenty, które są biernikowe z~całą pewnością, tj. których każda poprawna
w~danym kontekście interpretacja jest biernikowa, należy posłużyć się
zapytaniem \texttt{[case==acc]}.  Wynikiem tego ostatniego zapytania
w~wypadku zdania~\ref{pij1}. będzie znalezienie formy \emph{ją}, ale nie
formy \emph{pijaną}, zaś w~wypadku zdania~\ref{pij2}a. zostaną ponownie
znalezione obie formy \emph{go} i~\emph{pijanego} choć są to formy
synkretyczne posiadające także interpretacje dopełniaczowe, w~kontekście
zdania~\ref{pij2}a. powinny zostać zdezambiguowane do interpretacji
biernikowej.

Dzięki temu rozróżnieniu możliwe jest na przykład wyszukiwanie form, które
mogą być w~danym kontekście interpretowane jako biernikowe lub
dopełniaczowe, a~zatem w~poprawnie oznakowanym korpusie poniższe zapytanie
może dać niepuste wyniki.

\begin{itemize}
\item \texttt{[case=acc \& case=gen]}
\end{itemize}

Z~drugiej strony, zapytanie przedstawione poniżej, jako zapytanie o~te
formy, których wszystkie poprawne w~danym kontekście interpretacje są
jednocześnie biernikowe i~dopełniaczowe, oczywiście da wynik pusty.

\begin{itemize}
\item \texttt{[case==acc \& case==gen]}
\end{itemize}

Powyższe zapytania dotyczą interpretacji segmentów uzyskanych w~procesie
dezambiguacji, tj.~w~wyniku ujednoznacznienia (a~raczej
\emph{unietakwieloznacznienia}) interpretacji morfosyntaktycznych.
W~Narodowym Korpusie Języka Polskiego zachowane są jednak wszystkie interpretacje danego
segmentu znane analizatorowi morfologicznemu, a~nie tylko te, które zostały
uznane za poprawne w~danym kontekście.  W~pewnych sytuacjach przydatny jest
dostęp do tych odrzuconych interpretacji, na przykład wtedy, gdy chcemy
znaleźć wszystkie występujące w~korpusie formy synkretyczne o~możliwych
interpretacjach biernikowej i~dopełniaczowej, niezależnie od tego, które
z~tych interpretacji są poprawne w~danym kontekście, albo gdy chcemy
zignorować potencjalnie błędne wyniki działania dezambiguatora.  W~pierwszym
z~tych wypadków posłużyć się możemy następującym zapytaniem:

\begin{itemize}
\item \texttt{[case\textasciitilde{}acc \& case\textasciitilde{}gen]}
\end{itemize}

W~wyniku tego zapytania znalezione zostaną synkretyczne formy \emph{go}
i~\emph{pijanego}, ale nie formy \emph{ją} i~\emph{pijaną}, które takiego
synkretyzmu nie wykazują.

Ostatnim rodzajem równości dostępnym w~zapytaniach jest
\texttt{\textasciitilde{}\textasciitilde{}}.  Zapytanie poniższe może
posłużyć do znalezienia tych form, o~których jeszcze przed
ujednoznacznianiem wiadomo, że są wyłącznie biernikowe:

\begin{itemize}
\item \texttt{[case\textasciitilde\textasciitilde{}acc]}
\end{itemize}

Poniższa tabela podsumowuje znaczenie poszczególnych operatorów równości.

\begin{tabular}{lll}
& \textbf{w~wynikach}  & \textbf{w~wynikach} \\
& \textbf{analizy morfologicznej}  & \textbf{dezambiguacji} \\
\textbf{co najmniej jedna interpretacja}  & \texttt{\textasciitilde{}} & \texttt{=} \\
\textbf{każda interpretacja}  & \texttt{\textasciitilde\textasciitilde{}}  & \texttt{==}
\end{tabular}

A~zatem prawdziwe są następujące implikacje:

\begin{itemize}

\item \texttt{[atrybut\textasciitilde\textasciitilde{}wartość]}
$\rightarrow$ \texttt{[atrybut==wartość]}

tj. każda odpowiedź na zapytanie
\texttt{[atrybut\textasciitilde\textasciitilde{}wartość]} jest także
odpowiedzią na zapytanie \texttt{[atrybut==wartość]}

\item \texttt{[atrybut==wartość]}
  $\rightarrow$ \texttt{[atrybut=wartość]}

tj. każda odpowiedź na zapytanie \texttt{[atrybut==wartość]} jest także
odpowiedzią na zapytanie \texttt{[atrybut=wartość]}

\item \texttt{[atrybut=wartość]} $\rightarrow$
\texttt{[atrybut\textasciitilde{}wartość]}

tj. każda odpowiedź na zapytanie \texttt{[atrybut=wartość]} jest także
odpowiedzią na zapytanie \texttt{[atrybut\textasciitilde{}wartość]}

\end{itemize}

\subsection{Ograniczenie zapytania do zdania lub akapitu}
\label{sec:szukanie-w-obrbie}

Tekst zawarty w~Narodowym Korpusie Języka Polskiego został automatycznie podzielony na zdania
i~na akapity.  Informację tę można wykorzystać w~zapytaniach, na przykład
ograniczając dopasowanie do jednego zdania.

Aby ograniczyć zasięg zapytania, należy dopisać do zapytania słowo kluczowe
\texttt{within}, a~po nim \texttt{s} lub \texttt{p}, w~zależności od tego,
czy zasięg ma być ograniczony do zdania (ang.~\emph{sentence}) czy do
akapitu (ang.~\emph{paragraph}).  Ilustruje to następujący przykład
zapytania o~zdania, w~których forma \emph{się} występuje za formą leksemu
\textsc{być}, lecz nie bezpośrednio za nią:

\begin{itemize}
\item \texttt{[base=bać][orth!=się]+[orth=się] within s}
\end{itemize}

\subsection{Ograniczenie zapytania za pomocą metadanych}
\label{sec:metadane}

Z~każdym utworem znajdującym się w~Narodowym Korpusie Języka Polskiego związane są
tzw.~metadane, czyli informacje o~tytule i~autorze
utworu, jego pochodzeniu, wydawcy itp.  Część z~tych informacji jest
dostępna za pomocą programu Poliqarp i~może zostać użyta do
ograniczenia zasięgu zapytania, na przykład do tekstów danego autora
lub tekstów powstałych w~danym przedziale czasowym.

W~{3. demo Narodowego Korpusu Języka Polskiego} dostępne są następujące
metaatrybuty:

\begin{itemize}

  \item \texttt{autor}: imię i~nazwisko autora lub autorów;

  \item \texttt{tytuł}: tytuł utworu;

  \item \texttt{źródło}: źródło utworu (np. tytuł czasopisma w przypadku
  artykułów prasowych);

  \item \texttt{isbn}: numer ISBN;

  \item \texttt{issn}: numer ISSN;

  \item \texttt{type}: typ tekstu (np. styl), możliwe wartości to:

  \begin{itemize}

    \item \texttt{lit}: proza (podtypy: \texttt{lit\_proza},
    \texttt{lit\_poezja}, \texttt{lit\_dramat}),

    \item \texttt{fakt}: literatura faktu,

    \item \texttt{publ}: publicystyka i wiadomości prasowe,

    \item \texttt{nd}: teksty naukowo-dydaktyczne,

    \item \texttt{inf-por}: teksty informacyjno-poradnikowe,

    \item \texttt{nklas}: książki niebeletrystyczne niesklasyfikowane,

    \item \texttt{inne\_pisane}: inne teksty pisane (podtypy:
    \texttt{urzed}: teksty urzędowo-kancelaryjne,
    \texttt{persw}: teksty perswazyjne,
    \texttt{instr}: krótkie teksty instruktażowe,
    \texttt{listy});

    \item \texttt{internet}: teksty pochodzące z Internetu (podtypy:
        \texttt{net\_interakt}: pochodzące z forów, czatów, komunikatorów, list dyskusyjnych,
        \texttt{net\_nieinterakt}: pochodzące ze statycznych stron WWW),

    \item \texttt{konwers}: teksty konwersacyjne,

    \item \texttt{media}: teksty mówione medialne,

    \item \texttt{qmow}: teksty quasi-mówione;

  \end{itemize}

  \item \texttt{kanał}: kanał publikacji, możliwe wartości to:

  \begin{itemize}

    \item \texttt{prasa}: (podkanały:
    \texttt{prasa\_dziennik},
    \texttt{prasa\_tygodnik},
    \texttt{prasa\_miesiecznik},
    \texttt{prasa\_inne}),

    \item \texttt{ksiazka},

    \item \texttt{internet},

    \item \texttt{mowiony},

    \item \texttt{ulotka}: ulotki, ogłoszenia, reklamy,

    \item \texttt{rkps}: rękopisy lub maszynopisy;

  \end{itemize}

  \item \texttt{wydawca};

  \item \texttt{miejsce\_wydania};

  \item \texttt{data\_wydania};

  \item \texttt{data\_pierwszego\_wydania}: data publikacji pierwszego
  wydania tekstu,

  \item \texttt{data\_powstania},

  \item \texttt{data\_pozyskania},

  \item \texttt{data\_nagrania}.

\end{itemize}

Zwykle tylko niektóre z~tych atrybutów będą miały przypisaną wartość, na
przykład wtedy, gdy znana jest tylko data publikacji, a~nie data pierwszej
publikacji i~powstania, albo w~wypadku krótkich notatek prasowych, których
autor a~czasami i~tytuł nie są znane.

Aby ograniczyć zasięg zapytania do określonych wartości metadanych, należy
na końcu zapytania wpisać słowo kluczowe \texttt{meta}, po którym następuje
specyfikacja wartości metaatrybutów.  W~wypadku, gdy zapytanie jest
ograniczone zarówno do zdania czy akapitu, jak i~na podstawie metadanych,
specyfikacja ograniczenia do zdania lub akapitu występuje w~zapytaniu przed
specyfikacją metadanych, na przykład:

\begin{itemize}
\item \texttt{[pos=subst]\lbr{}6,\rbr{} within s meta author=Kowalski}
\end{itemize}

Wartości atrybutów \texttt{author} i~\texttt{title} mogą być zadane
wyrażeniami regularnymi, np.~poniższe zapytanie może posłużyć do znalezienia
form leksemu \textsc{wirus} w~utworach, których tytuł zawiera jeden
z~napisów \emph{windows} lub \emph{microsoft}.

\begin{itemize}
\item \texttt{[base=wirus] meta title="windows|microsoft"}
\end{itemize}

Specyfikacje atrybutów \texttt{author} i~\texttt{title} są rozumiane
w~sposób bezkasztowy (wielkość liter nie ma znaczenia) i~są interpretowane
jako części pełnych wartości, a~zatem wyniki poniższego zapytania będą
pochodziły z~utworów m.in.~Pola, Polkowskiego i~Rampolskiego (o~ile ci
autorzy są reprezentowani w~korpusie):

\begin{itemize}
\item \texttt{[pos=subst]\lbr{}5\rbr{} meta author=Pol}
\end{itemize}

Flagi \texttt{/X} i~\texttt{/I} działają w~sposób dualny do opisanych
powyżej flag \texttt{/x} i~\texttt{/i}: flaga \texttt{/X} powoduje, że dana
specyfikacja atrybutu jest rozumiana jako specyfikacja pełnej wartości tego
atrybutu, a~nie tylko jego części, zaś flaga \texttt{/I} powoduje, że
kasztowość specyfikacji jest dopasowywana do kasztowości wartości atrybutu.
Ilustrują to poniższe przykłady:

\begin{itemize}
\item \texttt{[pos=subst]\lbr{}5\rbr{} meta author=Pol/I}

przeszukiwanie ograniczone do utworów Pola, Polkowskiego itd., ale nie
Rampolskiego

\item \texttt{[pos=subst]\lbr{}5\rbr{} meta author="Marek Pol"/X}

przeszukiwanie ograniczone do utworów Marka Pola

\item \texttt{[pos=subst]\lbr{}5\rbr{} meta author=Pol/X}

przeszukiwanie ograniczone do utworów autora, którego pełna specyfikacja
imienia i~nazwiska to \emph{Pol} (lub \emph{POL}, \emph{pol} itd.)

\item \texttt{[pos=subst]\lbr{}5\rbr{} meta author=".* Pol"/I}

przeszukiwanie ograniczone do utworów autora, którego nazwisko to \emph{Pol}

\end{itemize}

Odmiennie traktowane są atrybuty \texttt{data\_powstania},
\texttt{data\_pozyskania}, \texttt{data\_nagrania},
\texttt{data\_pierwszego\_wydania} i~\texttt{data\_wydania}, którego
wartościami mogą być wyłącznie daty.
W~wypadku atrybutów tego typu nie można użyć wyrażeń regularnych, natomiast
można użyć znaków \texttt{<} i~\texttt{>} w~celu określenia przedziału
czasowego, z~jakiego dany utwór ma pochodzić, na przykład:

\begin{itemize}
\item \texttt{[pos=subst]\lbr{}5\rbr{} meta created>1950}

przeszukiwanie ograniczone do utworów powstałych po roku 1950

\end{itemize}

Warunki dotyczące metadanych można łączyć za pomocą operatorów \texttt{\&},
\texttt{|} i~\texttt{!}:

\begin{itemize}
\item \texttt{[pos=subst]\lbr{}5\rbr{} meta created>=1951 \& created<=1960}

przeszukiwanie ograniczone do utworów powstałych w~latach 1951-1960

\item \texttt{[pos=subst]\lbr{}5\rbr{} meta published>1900 \& author!=Sienkiewicz}

przeszukiwanie ograniczone do utworów wydanych po roku 1900, z~wyjątkiem
tekstów Sienkiewicza,

\item \texttt{[pos=subst]\lbr{}5\rbr{} meta (author=sienkiewicz \& title=potop)\\
| (author=żeromski \& title=przedwiośnie)}

przeszukiwanie ograniczone do \emph{Potopu} Sienkiewicza
i~\emph{Przedwiośnia} Żeromskiego

\item \texttt{[pos=subst]\lbr{}5\rbr{} meta styl=nd \& medium=książka}

przeszukiwanie ograniczone do tekstów naukowo-dydaktycznych wydanych w~postaci
książki

\end{itemize}

Poprzednie dema Narodowego Korpusu Języka Polskiego oraz wydania Korpusu IPI
PAN używają innych schematów metadanych. Szczegóły można znaleźć w~%
\href{http://korpus.pl/pl/cheatsheet/node3.html#SECTION00037000000000000000}{Ściągawce
do Korpusu IPI PAN}.

\subsection{Wyrównywanie wyników}
\label{sec:wyrwyn}

W~części zapytania dotyczącej form, tj. przed kwalifikatorami
\texttt{within} i~\texttt{meta}, można używać znacznika wyrównania \texttt{\textasciicircum}, na przykład:

\begin{itemize}
\item \texttt{[pos=adj \& case=nom]+\textasciicircum[pos=subst \& case=nom]+}
\end{itemize}

W~wyniku zadania powyższego zapytania wyświetlone zostaną cztery kolumny
zawierające, odpowiednio, lewy kontekst, tj.~fragment tekstu bezpośrednio
poprzedzający znalezione dopasowanie, lewe dopasowanie, tj. fragment tekstu
pasujący do części zapytania przed znakiem \texttt{\textasciicircum} (tutaj:
ciąg przymiotników w~mianowniku), prawe dopasowanie (tutaj: ciąg
rzeczowników w~mianowniku) oraz prawy kontekst.
