Ściągawka do Narodowego Korpusu Języka Polskiego

Adam Przepiórkowski, Aleksander Buczyński, Jakub Wilk

August 1, 2012

Niniejszy dokument zawiera fragmenty publikacji Korpus IPI PAN. Wersja wstępna, które powinny ułatwić korzystanie z korpusu. (Niniejsza wersja została zmodyfikowana w marcu 2006 na potrzeby 2. wydania Korpusu IPI PAN oraz w kwietniu 2010 na potrzeby Narodowego Korpusu Języka Polskiego.)

1 Segmentacja

(Autor: Adam Przepiórkowski)

Znaczniki morfosyntaktyczne, tzw. tagi, przypisane są segmentom (tokenom, w przybliżeniu słowom). Segmenty nie są dłuższe niż słowa ortograficzne (słowa ’od spacji do spacji’), ale w niektórych wypadkach segmenty mogą być krótsze niż takie słowa:

Z powyższych zasad wynika, że segmentacja tekstu w 1. wygląda tak, jak to przedstawiono w 2.

  1. Pojechalibyśmy z Janem M. Rokitą i Janem Nowakiem-Jeziorańskim na sesję polsko-amerykańską, gdyby nas zaprosił George W. Byłaby to nasza już 2. doń podróż od czasów PRL-u, a może i 3., czy nawet 4.
  2. [Pojechali][by][śmy] [z] [Janem] [M.] [Rokitą] [i] [Janem] [Nowakiem][-][Jeziorańskim] [na] [sesję] [polsko][-][amerykańską][,] [gdyby] [nas] [zaprosił] [George] [W][.] [Była][by] [to] [nasza] [już] [2.] [do][ń] [podróż] [od] [czasów] [PRL-u][,] [a] [może] [i] [3.][,] [czy] [nawet] [4][.]

2 Zestaw znaczników morfosyntaktycznych

(Autor: Adam Przepiórkowski)

Każdy znacznik morfosyntaktyczny jest ciągiem wartości rozdzielonych dwukropkami, np.: subst:sg:nom:m1 dla segmentu chłopiec. Pierwsza wartość, np. subst, określa klasę gramatyczą (por. p.2.2), następne zaś, np. sg, nom i m1 wartości odpowiednich dla tej klasy kategorii gramatycznych (por. p.2.1).

2.1 Kategorie gramatyczne

Poniższa tabela przedstawia repertuar kategorii gramatycznych używanych w Narodownym Korpusie Języka Polskiego.

Liczba: (2 wartości)
pojedyncza sg oko
mnoga pl oczy
Przypadek: (7 wartości)
mianownik nom woda
dopełniacz gen wody
celownik dat wodzie
biernik acc wodę
narzędnik inst wodą
miejscownik loc wodzie
wołacz voc wodo
Rodzaj: (5 wartości)
męski osobowy m1 papież, kto, wujostwo
męski zwierzęcy m2 baranek, walc, babsztyl
męski rzeczowy m3 stół
żeński f stuła
nijaki n dziecko, okno, co, skrzypce, spodnie
Osoba: (3 wartości)
pierwsza pri bredzę
druga sec bredzisz
trzecia ter bredzi
Stopień: (3 wartości)
równy pos cudny
wyższy comp cudniejszy
najwyższy sup najcudniejszy
Aspekt: (2 wartości)
niedokonany imperf iść
dokonany perf zajść
Zanegowanie: (2 wartości)
niezanegowana aff pisanie, czytanego
zanegowana neg niepisanie, nieczytanego
Akcentowość: (2 wartości)
akcentowana akc jego, niego, tobie
nieakcentowana nakc go, -ń, ci
Poprzyimkowość: (2 wartości)
poprzyimkowa praep niego, -ń
niepoprzyimkowanpraepjego, go
Akomodacyjność: (2 wartości)
uzgadniająca congr dwaj, pięcioma
rządząca rec dwóch, dwu, pięciorgiem
Aglutynacyjność: (2 wartości)
nieaglutynacyjna nagl niósł
aglutynacyjna agl niosł-
Wokaliczność: (2 wartości)
wokaliczna wok -em
niewokaliczna nwok -m

2.2 Klasy gramatyczne

Zasięg tradycyjnych części mowy, takich jak czasownik, rzeczownik, liczebnik czy zaimek, jest nieostry i przez to kontrowersyjny: czy tzw. odsłowniki, tj. formy typu picie i palenie, to czasowniki (posiadają kategorię aspektu, są regularnie powiązane z formami czasownikowymi typu pić i palić), czy też rzeczowniki (odmieniają się przez przypadek, posiadają słownikową kategorię rodzaju)?, czy piąty to liczebnik (na to wskazuje semantyka), czy też przymiotnik (na to wskazuje odmiana)?, czy taki to zaimek (semantyka), czy przymiotnik (odmiana)?

W Narodowym Korpusie Języka Polskiego klasy gramatyczne rozumiane są morfosyntaktycznie są one oparte na pojęciu fleksemu, będącym pojęciem węższym od terminu leksem.

Poniższa tabela zawiera przybliżoną charakterystykę morfoskładniową wszystkich klas fleksyjnych przyjmowanych w niniejszym tagsecie. Symbol oznacza, że dla danej klasy fleksyjnej dana kategoria gramatyczna jest morfologiczna (fleksemy należące to tej klasy zwykle „odmieniają się” przez tę kategorię), zaś symbol oznacza, że dana kategoria jest słownikowa (wszystkie formy dowolnego fleksemu należącego do tej klasy mają tę samą wartość tej kategorii, choć mogą to być różne wartości dla różnych fleksemów, jak w wypadku rodzaju rzeczowników).

liczbaprzypadekrodzajosobastopieńaspektzaneg.akcent.poprzyim.akomod.aglutyn.wokal.
rzeczownik
rzeczownik deprecjatywny
liczebnik główny
liczebnik zbiorowy
przymiotnik
przymiotnik przyprzym.
przymiotnik poprzyim.
przysłówek
zaimek nietrzecioosobowy
zaimek trzecioosobowy
zaimek siebie
forma nieprzeszła
forma przyszła być
aglutynant być
pseudoimiesłów
rozkaźnik
bezosobnik
bezokolicznik
im. przys. współczesny
im. przys. uprzedni
odsłownik
im. przym. czynny
im. przym. bierny
winien
predykatyw
przyimek
spójnik
kublik
ciało obce nominalne
ciało obce luźne
forma nierozpoznana
interpunkcja

Poniższa tabela zawiera informacje o formach podstawowych dla poszczególnych klas fleksyjnych, a także skróty nazw klas fleksyjnych używane w korpusie.

fleksem skrót forma podstawowa przykład
rzeczownik subst mianownik liczby pojedynczej profesor
rzeczownik deprecjatywny depr mianownik liczby pojedynczej rzeczownika profesor
liczebnik główny num mianownik rodzaju męskiego rzeczowego pięć, dwa
liczebnik zbiorowy numcol mianownik rodzaju męskiego rzeczowego liczebnika głównego pięć, dwa
przymiotnik adj mianownik liczby pojedynczej rodzaju męskiego stopnia równego polski
przymiotnik przyprzym. adja mianownik liczby pojedynczej rodzaju męskiego przymiotnika w stopniu równympolski
przymiotnik poprzyimkowyadjp mianownik liczby pojedynczej rodzaju męskiego przymiotnika w stopniu równympolski
przysłówek adv forma stopnia równego dobrze, bardzo
zaimek nietrzecioosobowy ppron12mianownik liczby pojedynczej ja
zaimek trzecioosobowy ppron3 mianownik liczby pojedynczej on
zaimek siebie siebie biernik siebie
forma nieprzeszła fin bezokolicznik czytać
forma przyszła być bedzie bezokolicznik być
aglutynant być aglt bezokolicznik być
pseudoimiesłów praet bezokolicznik czytać
rozkaźnik impt bezokolicznik czytać
bezosobnik imps bezokolicznik czytać
bezokolicznik inf bezokolicznik czytać
im. przys. współczesny pcon bezokolicznik czytać
im. przys. uprzedni pant bezokolicznik czytać
odsłownik ger bezokolicznik czytać
im. przym. czynny pact bezokolicznik czytać
im. przym. bierny ppas bezokolicznik czytać
winien winien forma męska liczby pojedynczej powinien, rad
predykatyw pred jedyna forma tego fleksemu warto
przyimek prep niewokaliczna forma tego fleksemu na, przez, w
spójnik conj jedyna forma tego fleksemu oraz
kublik qub jedyna forma tego fleksemu nie, -że, się
ciało obce nominalne xxs mianownik liczby pojedynczej de, l’Hospital
ciało obce luźne xxx jedyna forma tego fleksemu bene
forma nierozpoznana ign jedyna forma tego fleksemu
interpunkcja interp jedyna forma tego fleksemu ;, ., (, ]

3 Język zapytań

(Autor: Adam Przepiórkowski, Jakub Wilk)

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 mijać), 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 mijać.

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

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

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

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 xxs 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 3. demo Narodowego Korpusu 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.

4 Zapytania statystyczne

(Autor: Aleksander Buczyński)

Rozszerzenia statystyczne obsługuje jedynie graficzna wersja Poliqarpa. Nie są one dostępne przez interfejs WWW.

Poliqarp został zaprojektowany jako konkordancer, zwracający dla każdego zapytania listę dopasowań wraz z kontekstem określonej szerokości. Zapewnia to użytkownikowi przykłady użycia konkretnych konstrukcji, ale można sobie wyobrazić wiele problemów korpusowych, dla których przeglądanie setek dopasowań byłoby co najmniej niewygodne. Rozszerzenie statystyczne (dostępne obecnie jedynie w stacjonarnej wersji Poliqarpa) wprowadza możliwość łatwego znalezienia odpowiedzi na pytania typu:

Rozszerzenie zapewnia także zestaw testów statystycznych służących wykrywaniu kolokacji i badaniu korelacji pomiędzy atrybutami segmentów.

4.1 Składnia zapytania

Zapytanie statyczne ma następującą składnię [nawiasy kwadratowe oznaczają elementy opcjonalne]:

<pattern> group by <attr list> [; <attr list>] [interp <method>] [sort <order>] [min <cmin>] [count <nmax>]

gdzie:

<pattern> – zapytanie Poliqarpa opisane w poprzednim rozdziale; tylko sekwencje segmentów dopasowane do <pattern> będą brane po uwagę w statystyce.

<attr list> – lista specyfikacji atrybutów (np. base lub 2.case), oddzielanych przecinkami; każda specyfikacja atrybutu składa się z opcjonalnej specyfikacji segmentu (np. 2. lub -1.) i obowiązkowej nazwy atrybutu (np. base lub case); patrz 4.3;

<method> – metoda wyboru interpretacji (random lub combine), zgodnie z 4.4;

<order> – porządek sortowania wyników, tak jak opisano w 4.6 (zapytania proste) i 4.8 (zapytania z grupowaniem częściowym);

<cmin> – minimalna liczba wystąpień; wyświetlanie tylko wyników, które wystąpiły co najmniej <cmin> razy wśród dopasowań;

<nmax> – maksymalna liczba (lub all – wszystkie) próbek dopasowań wybranych do stworzenia statystyki; patrz 4.5.

4.2 Proste zapytania statystyczne

Rozszerzenie wprowadza możliwość grupowania dopasowań według zbioru atrybutów, wyspecyfikowanego w zasadach grupowania. Najprostsza zasada składa się z jednej nazwy atrybutu. Żeby np. znaleźć częstości różnych form słowa woda, można napisać:

[base=woda] group by orth

Rezultatem tego zapytania jest tabela. Każda z różnych wartości wyspecyfikowanego atrybutu (orth) napotkana w wynikach pierwszej części zapytania ([base=woda]) odpowiada jednemu wierszowi tej tabeli. Każdy wiersz zawiera wartość wyspecyfikowanego atrybutu oraz liczbę dopasowań, które zawierają tę wartość.

W zasadach grupowania można wymienić więcej atrybutów, oddzielając je przecinkami, np.:

[base=woda] group by orth, number, case

W rezultatach tego zapytania każdy wiersz odpowiada unikalnej kombinacji wartości wyspecyfikowanych atrybutów (woda sg nom, wody pl nom, wody sg gen, etc.) Bierzemy zatem w tym wypadku pod uwagę także rozróżnienie pomiędzy formami homonimicznymi (np. forma wody może być emphsg gen, pl nom, etc.)

4.3 Wzorce wielowyrazowe

Wzorce mogą zwracać dopasowania dłuższe niż pojedynczy segment. Aby wskazać atrybut którego z segmentów powinien zostać wykorzystany do grupowania, należy dodać numer segmentu (z kropką) przed nazwą atrybutu. Np., żeby znaleźć czasowniki występujące bezpośrednio po słowie woda, można zapytać:

[base=woda][pos=verb] group by 2.base

Specyfikacja 2.base odnosi się do formy podstawowej drugiego segmentu dopasowania (czasownika – verb – po segmencie, którego formą podstawową jest woda).

Kolejne numery odnoszą się do kolejnych segmentów dopasowania, nie kolejnych specyfikacji segmentów w zapytaniu. Np. żeby znaleźć rozkład częstości dla ciągów trzech kolejnych przysłówków, należy zapytać (można pominąć 1.):

[pos=adv]{3} group by 1.base, 2.base, 3.base

Aby wskazać segmenty w dopasowaniach o nieznanej długości, można w specyfikacjach segmentów używać liczb ujemnych. Liczba ujemna oznacza liczenie od końca dopasowania. Np. żeby dopuścić opcjonalny przysłówek pomiędzy wodą i czasownikiem, ww. zapytanie powinno zostać następująco zmodyfikowane:

[base=woda][pos=adv]?[pos=verb] group by -1.base

Specyfikacja -1.base odnosi się do formy podstawowej ostatniego segmentu dopasowania. Analogicznie -2. odnosiłoby się do drugiego segmentu od końca, -3. — trzeciego od końca etc.

4.4 Niejednoznaczności

Domyślnie dla każdego niejednoznacznego segmentu wybierana jest losowo jedna interpretacja. Ale jeśli dodamy interp combine po specyfikacji atrybutu, wartość tego atrybutu zostanie obliczona jako konkatenacja unikalnych wartości atrybutów we wszystkich interpretacjach, oddzielonych pionową kreską. Np. żeby znaleźć wszystkie możliwe kombinacje interpretacji dla segmentów, które mogą być formami czasownika mieć, można napisać:

[base~mieć] group by base interp combine

Wynik zapytania będzie zawierał pary słów takich jak mama/mieć, mieć/mienie, maić/mieć, mielić/mieć etc. Rezultat będzie się różnił znacząco w zależności od tego, czy w konfiguracji Poliqarpa wybrano opcję „Pokazuj tylko ujednoznacznione interpretacje”; jeśli jest zaznaczona, interpretacje odrzucone przez tager nie pojawią się w wynikach.

4.5 Rozmiar próbki

Domyślnie statystyka liczona jest na próbce 1000 losowo wybranych dopasowań, aby szybko pokazać wyniki. Jeśli potrzebne jest dokładniejsze obliczenie, rozmiar próbki może zostać zmodyfikowany za pomocą słowa kluczowego count, np.:

[base=woda] group by orth count 5000

Aby policzyć wszystkie dopasowania, należy użyć count all, np.:

[base=woda] group by orth count all

Uwaga: w obecnej wersji (1.2) występuje twardy limit 500 000 dopasowań. Jeśli naprawdę potrzebna jest większa próbka, trzeba podzielić zapytanie na kilka nieco bardziej szczegółowych (np. według meta style).

4.6 Sortowanie i selekcja wyników

Wyniki mogą być posortowane w porządku alfabetycznym (sort a fronte) lub według częstości (sort by freq). Jeśli wykorzystywane jest grupowanie częściowe, wyniki można także posortować według wybranej funkcji kolokacji — patrz 4.8.

Selekcja wyników jest obecnie ograniczona od odcięcia według częstości (min n).

4.7 Grupowanie częściowe

Najczęstsze bigramy można łatwo znaleźć korzystając z składni zapytań prostych:

[][] group by 1.base, 2.base sort by freq

Jednak takie wyniki są często niewystarczające. Np. w wykrywaniu kolokacji istotna jest nie tylko częstość bigramu, ale także częstość jego składowych. W związku z tym wprowadzony został specjalny separator – średnik „;” – który umożliwia podzielenie zasad grupowania na dwie części. Przykładowo:

[][] group by 1.base; 2.base sort by freq

spowoduje, że wyniki zostaną pogrupowane według: 1.base (część przed średnikiem); 2.base (część za średnikiem); 1.base, 2.base (obie części). Dla każdego wiersza wyników ostatniego grupowania, zostaną wyświetlone także wyniki grupowań częściowych. Modyfikatory sort i min stosuje się zawsze do ostatniego grupowania.

Każda z części grupowania może zawierać więcej niż jedną specyfikację atrybutu, ale zasady grupowania nie mogą zawierać więcej niż dwie części. Inaczej rzecz ujmując: zasady grupowania mogą zawierać dowolną liczbę przecinków, ale nie więcej niż jeden średnik.

Składnia grupowania częściowego ma zastosowanie nie tylko dla bigramów. Różne części grupowania mogą nawet zawierać odwołania do tego samego segmentu, np.

[base=woda] group by number; case

4.8 Funkcje kolokacji

W celu wykrywania kolokacji, w zapytaniach z grupowaniem częściowym (patrz 4.7) można zastosować jako parametr sortowania jedną ze statystycznych miar zależności (np. sort by cp lub sort by dice). Wszystkie obecnie zaimplementowane miary są funkcjami następujących parametrów:

c(w1) — liczba wystąpień w1, gdzie w1 jest kombinacją wartości atrybutów wyspecyfikowanych przez pierwszą część zasad grupowania;

c(w2) — liczba wystąpień w2, gdzie w2 jest kombinacją wartości atrybutów wyspecyfikowanych przez drugą część zasad grupowania;

c(w1w2) — liczba wystąpień kombinacji w1 i w2.

Funkcje te to:

Ponieważ miary zależności de facto preferują rzadkie bigramy, zalecane jest ich stosowanie w połączeniu z odcięciem wyników o niskiej częstości, np.:

[pos!=interp]{2} group by base; 2.base sort by scp min 2

Alternatywą jest zmodyfikowanie miary, tak by w pewnym stopniu preferowała częste wyniki, np.:

[pos!=interp]{2} group by base; 2.base sort by scp bias 0.5

bias b oznacza „przed posortowaniem, pomnóż wynik funkcji przez częstość do potęgi b”:

                 b
x biasb = xc(w1w2 )

np.:

                  2.5
scp bias0.5 = c(w1w2-)---
            c(w1)c(w2)

Oczywiście, można łączyć słowa kluczowe bias i min, np.:

[]{2} group by base; 2.base sort by scp bias 0.5 min 2

Podobnie jak w innych przypadkach, odcięcie stosuje się tu do czystej liczby wystąpień, nie wartości miary zależności.