3 Język zapytań

(Autor: Adam Przepiórkowski, Jakub Wilk; ostatnia modyfikacja: 2 października 2011)

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.

3.1 Zapytania o segmenty

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

W drugim z powyższych dwóch zapytań występują trzy segmenty odpowiadające dwóm słowom: przyszedłem i 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:

W tym drugim wypadku znalezione zostaną zarówno wszystkie wystąpienia trzysegmentowych ciągów [długo][m] [szedł], interpretowanych jako przysłówek, aglutynant i pseudoimiesłów, jak i dwusegmentowych ciągów [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:

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

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: ?, *, +, ., ,, |, {, }, [, ], (, ) oraz liczby naturalne pisane cyframi arabskimi, np. 0 czy 21, przy czym specyfikacje segmentów zawierające wyrażenia regularne muszą być ujęte w cudzysłowy ". 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ń.

  1. "Ala|Ela"

    znak | oznacza alternatywę dwóch wyrażeń, a zatem zapytanie to może zostać użyte do znalezienia wszystkich wystąpień segmentów o postaci Ala lub Ela,

  2. "[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 A lub E, a następne to la, tj. zapytanie to jest równoważne poprzedniemu,

  3. "beza?"

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

  4. "bez."

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

  5. "bez.?"

    bez, beza, bezy, bezą itp., ale nie bezami,

  6. ".z.z."

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

  7. ".z.z..?"

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

  8. "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 a, po których następuje ciąg by, np. by (zero wystąpień a), aby, aaaaby itp.,

  9. "Ala.*"

    segmenty zaczynające się na Ala, np. Ala i Alabama,

  10. "ala.*"/i

    segmenty zaczynające się na ala, Ala, aLa, ALA itd., np. Ala, alabaster i ALABAMA,

  11. ".*al+"

    plus ma działanie podobne do gwiazdki i oznacza dowolną 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 al, all, alll itd., ale nie na a, np. dal, robal i Gall,

  12. "a{1,3}b.*"/i

    konstrukcja typu n,m oznacza od n do 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 a lub A, po którym następuje litera b lub B, a następnie dowolny ciąg znaków (por. .*), np. Aby, aaaby, absolutnie, ABBA,

  13. ".*(la){3,}.*"

    konstrukcja typu n, oznacza co najmniej 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 la występuje przynajmniej 3 razy pod rząd, np. tralalala, sialalala,

  14. "[bcćdfghjklłmnńprsśtwzźż]{4,}[aąeęioóuy]"/i

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

  15. "([bcćdfghjklłmnńprsśtwzźż]{3}[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. wszystko, Zdmuchnąwszy i Szmajdziński konstrukcja typu n oznacza dokładnie n wystąpień znaku lub ujętego w nawiasy okrągłe wyrażenia bezpośrednio przed nią,

  16. "([^aąeęioóuy]{3}[aąeęioóuy])2,"/i

    jak wyżej,

  17. "(pod|na|za)jecha.*"

    segmenty zaczynające się od podjecha, najecha i zajecha, np. podjechał, zajechawszy.

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

3.2 Zapytania o formy podstawowe

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

Atrybut 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 [base=pisać] może być użyte do znalezienia form typu pisać, piszę, pisała, piszcie, pisanie, pisano, pisane itp.

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

Nie są jednak równoważne zapytania:

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

Wartościami atrybutów base i orth mogą być wyrażenia regularne, podobnie jak w wypadku prostych zapytań o formy opisanych w p.3.1, np.:

3.3 Zapytania wyższego rzędu

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

Podobne znaczenie ma następujące zapytanie o te wystąpienia segmentu minę, które nie są interpretowane jako formy leksemu minąć.

Warunek, że forma hasłowa to nie minąć, 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.

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 nie jako formę zaimka osobowego on są w pełni równoważne:

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

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

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

Specyfikacje pozycji w korpusie, ujęte w nawiasy kwadratowe, mogą zawierać dowolną liczbę warunków typu atrybut=wartość (na przykład orth=nie) połączonych operatorami !, & i |, 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.1

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.:

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

Dla wielu zastosowań ciekawsza byłaby możliwość zapytania na przykład o formy oddalone od siebie o 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 bać występującą dwie, trzy lub cztery pozycje dalej niż forma się może wyglądać następująco:

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

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

3.4 Zapytania o znaczniki morfosyntaktyczne

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

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

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 ppron3 i do klasy zaimków nietrzecioosobowych ppron12, poniższe zapytania mogą posłużyć do znalezienia dowolnych form dowolnych zaimków osobowych:

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

W zapytaniach można określać wartości nie tylko formy wyrazowej (za pomocą atrybutu orth), formy hasłowej (za pomocą base) i klasy gramatycznej (za pomocą 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.2.1):

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

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

  1. [number=sg]

    znalezione zostaną wszystkie formy w liczbie pojedynczej,

  2. [pos=subst & number=sg]

    znalezione zostaną formy rzeczownikowe w liczbie pojedynczej,

  3. [pos=subst & gender!=f]

    formy rzeczownikowe rodzaju męskiego lub nijakiego,

  4. [number=sg & case="nom|acc" & gender="m[123]"]

    pojedyncze mianownikowe lub biernikowe formy męskie.

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

atrybut skrót
number nmb
case cas
gender gnd
person per
degree deg
aspect asp
negation neg
accommodability acm
accentability acn
post-prepositionalityppr
agglutination agg
vocalicity vcl
fullstoppedness fsn

A zatem powyższe zapytanie 4. można zadać także w sposób następujący:

Wersje graficzna i tekstowa umożliwiają zdefiniowanie tzw. aliasów, 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:

aliasdefinicja
masc m1 m2 m3
noun subst depr ger ppron12 ppron3
pron ppron12 ppron3 siebie
verb fin praet aglt bedzie inf imps impt pact ppas pcon pant ger winien

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

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

Wartości atrybutu tag mają postać kl:kat1:kat2:...:katn, gdzie kl to nazwa klasy gramatycznej, a kati to wartości kategorii przysługujących tej klasie w kolejności, w jakiej zostały podane w tabeli w p.2.2.

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

Specyfikacje klas gramatycznych i kategorii gramatycznych mogą zawierać zmienne (mające postać $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:

można uprościć do:

3.5 Wieloznaczności i dezambiguacja

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 1.

  1. Pamiętam ją pijaną.
    1. Pamiętam go pijanego.
    2. Pamiętam go pijanym.

W przykładzie tym nie można stwierdzić, czy forma pijaną jest formą biernikową, jak pijanego w 2a., czy też formą narzędnikową, jak pijanym w 2. Dlatego też w korpusie segment pijaną w 1. powinien dostać dwie interpretacje: biernikową i narzędnikową.

W takim wypadku powstaje jednak pytanie, czy segment pijaną w 1. powinien zostać znaleziony w wypadku zadania zapytania typu [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 [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 1., zostanie znaleziony zarówno segment pijaną, jak i segment , zaś w wypadku zdania 2a. zarówno pijanego, jak i 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 [case==acc]. Wynikiem tego ostatniego zapytania w wypadku zdania 1. będzie znalezienie formy , ale nie formy pijaną, zaś w wypadku zdania 2a. zostaną ponownie znalezione obie formy go i pijanego choć są to formy synkretyczne posiadające także interpretacje dopełniaczowe, w kontekście zdania 2a. 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.

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.

Powyższe zapytania dotyczą interpretacji segmentów uzyskanych w procesie dezambiguacji, tj. w wyniku ujednoznacznienia (a raczej 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:

W wyniku tego zapytania znalezione zostaną synkretyczne formy go i pijanego, ale nie formy i pijaną, które takiego synkretyzmu nie wykazują.

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

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

w wynikach w wynikach
analizy morfologicznejdezambiguacji
co najmniej jedna interpretacja~ =
każda interpretacja ~~ ==

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

3.6 Ograniczenie zapytania do zdania lub akapitu

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 within, a po nim s lub p, w zależności od tego, czy zasięg ma być ograniczony do zdania (ang. sentence) czy do akapitu (ang. paragraph). Ilustruje to następujący przykład zapytania o zdania, w których forma się występuje za formą leksemu być, lecz nie bezpośrednio za nią:

3.7 Ograniczenie zapytania za pomocą metadanych

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 Narodowym Korpusie Języka Polskiego dostępne są następujące metaatrybuty:

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 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:

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

Specyfikacje atrybutów author i 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):

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

Odmiennie traktowane są atrybuty data_powstania, data_pozyskania, data_nagrania, data_pierwszego_wydania i 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 < i > w celu określenia przedziału czasowego, z jakiego dany utwór ma pochodzić, na przykład:

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

Poprzednie dema Narodowego Korpusu Języka Polskiego oraz wydania Korpusu IPI PAN używają innych schematów metadanych. Szczegóły można znaleźć w Ściągawce do Korpusu IPI PAN.

3.8 Wyrównywanie wyników

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

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 ^ (tutaj: ciąg przymiotników w mianowniku), prawe dopasowanie (tutaj: ciąg rzeczowników w mianowniku) oraz prawy kontekst.