Język zapytań TigerQuery

Poniżej prezentujemy język zapytań wyszukiwarki drzew, który stanowi rozszerzony podzbiór języka wyszukiwarki TIGERSearch. Po zadaniu pytania wyszukiwarka prezentuje listę wszystkich pasujących zdań.

Przykłady zapytań

Oto kilka przykładów zapytań pozwalających zorientować się w możliwościach wyszukiwarki (wynik zapytania można zobaczyć po kliknięciu w zapytanie):

Węzły drzewa — podstawowy element zapytań

Każde zapytanie musi się odnosić do co najmniej jednego węzła w drzewie składnikowym, a więc do co najmniej jednej jednostki nieterminalnej lub terminalnej gramatyki. Najprostsze zapytanie składa się z pary nawiasów kwadratowych:

[]
Dopasowuje się ono do dowolnego węzła w drzewie, więc jego zbiorem wyników jest cały bank drzew (zadanie tego zapytania pozwala sprawdzić liczbę zdań w zbiorze). Zbiór wyników można ograniczać poprzez zadawanie atrybutów węzłów oraz relacji między węzłami, co wyjaśniono w następnych punktach.

Atrybuty węzłów

Każdy wierzchołek drzewa jest charakteryzowany pewnym zbiorem atrybutów. Poszukiwane wartości atrybutów można zadawać w postaci równości wewnątrz nawiasów specyfikujących wierzchołek. Poniższe zapytanie znajduje wierzchołki o wartości S atrybutu category:

[ category = "S" ]
Jeżeli szukana wartość jest ciągiem liter i cyfr (niezawierającym w szczególności odstępu), to znaki cudzysłowu można pominąć:
[ category = S ]
Jest też dostępny operator wyrażający różność od podanej wartości:
[ category != S ]

Atrybuty wierzchołków terminalnych to:

Atrybuty wierzchołków nieterminalnych: Atrybuty przysługujące wszystkim wierzchołkom: Odwołując się do wymienionych identyfikatorów można na przykład formułować warunki typu „jednostki zaczynają/kończą się w tym samym miejscu”. Ostatnie dwa atrybuty są logiczne, przykład użycia: [terminal][!center].

Wyrażenia regularne

Wartość po prawej stronie znaku równości w specyfikacji atrybutu może także być ujętym w ukośniki wyrażeniem regularnym do którego poszukiwana wartość musi się dopasować. Wyrażenie musi się dopasować do całej poszukiwanej wartości. Na przykład:

Warunki na wiele atrybutów lub wiele wartości

W obrębie specyfikacji wierzchołka można umieścić wiele warunków określających wartości atrybutów połączonych operatorami koniunkcji &, alternatywy | i negacji !. Odpowiednie połączenie warunków można wymusić za pomocą nawiasów. Na przykład:

Analogiczne wyrażenia mogą też pojawiać się po znaku równości, np.:

[cat = (NP | AdjP) & case=acc]

Relacje między węzłami

Również specyfikacje wierzchołków możemy łączyć operatorami i nawiasami w bardziej skomplikowane wyrażenia. Poniższe zapytanie znajduje drzewa zawierające zarówno frazę nominalną jak i przymiotnikową, ale nie wymaga żadnej szczególnej konfiguracji tych fraz względem siebie:

[cat=NP] & [cat=AdjP]

Ważnym elementem języka zapytań są operatory określające relacje na wierzchołkach związane ze strukturą drzewa. Są to:

Relacja Zapis
relacje terminalne
bezpośrednie poprzedzanie A . B A bezpośrednio poprzedza B w porządku tekstowym (inaczej: fraza B zaczyna się tam, gdzie kończy się A)
poprzedzanie A .* B A poprzedza B
poprzedzanie A .N B B zaczyna się N terminali od końca A
poprzedzanie A .M,N B B zaczyna się między M a N terminali od końca A
relacje zależnościowe(A i B są terminalami)
bezpośredni nadrzędnik A -> B A jest nadrzędnikiem B w drzewie zależnościowym
nadrzędnik z etykietą A ->R B w drzewie zależnościowym A jest nadrzędnikiem B i węzły są połączone relacją zależnościową R
relacje składnikowe
bezpośredni nadrzędnik A > B A jest rodzicem B w drzewie składnikowym
nadrzędnik z etykietą A >R B w pewnym drzewie A jest rodzicem B i węzły są połączone relacją zależnościową R
nadrzędnik A >* B B należy do pewnego poddrzewa A (B != A)
nadrzędnik A >N B B należy do pewnego poddrzewa A, ścieżka A–B ma długość N
nadrzędnik A >M,N B B należy do pewnego poddrzewa A, ścieżka A–B ma długość między M i N
rodzeństwo A $ B A i B mają w drzewie składnikowym wspólnego rodzica
rodzeństwo i poprzedzanie A $. B A i B stanowią dwa kolejne składniki pewnego wspólnego rodzica
rodzeństwo i poprzedzanie A $.* B A i B mają w pewnym drzewie wspólnego rodzica i A występuje przed B na jego liście składników
lewy potomek A >@l B B należy do pewnego poddrzewa A i żadna jednostka w tym poddrzewie nie poprzedza B (B leży na skrajnej lewej gałęzi pewnego poddrzewa A)
prawy potomek A >@r B B należy do pewnego poddrzewa A i B nie poprzedza żadnej jednostki w tym poddrzewie (B leży na skrajnej prawej gałęzi pewnego poddrzewa A)
centralny potomek A >@c B B należy do pewnego poddrzewa A i istnieje ścieżka z A do B prowadząca gałęziami głównymi
korzeń root(A) A jest korzeniem lasu

Operatory infiksowe można łączyć w łańcuchy. Na przykład następujące wyrażenie wyszukuje zdania, które zawierają frazę werbalną VP, która zawiera formę czasownikową V (co praktycznie oznacza, jest to fraza bez koordynacji):

[cat=S] > [cat=VP] > [cat=V]

Zmienne

Zmienne pozwalają nadać nazwę pewnemu elementowi zapytania, aby wskazać, że musi on być identyczny z innym elementem. Można ich użyć na dwa sposoby: w odniesieniu do wartości atrybutów oraz do specyfikacji wierzchołków. Nazwy zmiennych poprzedzamy znakiem #.

Pierwszy sposób użycia ilustruje następujący przykład:

[orth=#w: /.*zny/ & lemma=#w]
Wymagamy, aby atrybut orth miał wartość pasującą do wzorca /.*zny/ (a więc, aby słowo kończyło się -zny). Tej wartości nadajemy nazwę #w, a w dalszej części warunku wymagamy, aby atrybut lemma miał tę samą wartość, czyli by w  tekście występowała forma podstawowa leksemu. Użycia zmiennych nie muszą występować w obrębie specyfikacji tego samego wierzchołka. W następnym zapytaniu poszukujemy dwóch wystąpień tego samego słowa obok siebie (relacja .):
[orth=#s & pos!=interp] . [orth=#s]

Drugi sposób użycia zmiennych pozwala wyspecyfikować udział konkretnego wierzchołka w większej liczbie relacji. Na przykład w poniższym zapytaniu poszukujemy wierzchołków kategorii S, które by miały jako swoje dzieci jednocześnie: frazę wymaganą oznaczoną jako podmiot subj(typ), frazę wymaganą nominalną podlegającą dopełniaczowi negacji np(accgen) oraz frazę wymaganą „przysłówkowatą” xp(typ). W tym celu oznaczamy wierzchołek reprezentujący zdanie zmienną #z, aby następnie użyć jej jeszcze dwukrotnie w specyfikacjach kolejnych relacji:

#z: [cat=S] > [tfw=/subj.*/] & #z > [tfw="np(accgen)"] & #z >  [tfw=/xp.*/]

W kontekście zapytań z udziałem wielu węzłów warto pamiętać, że każda para nawiasów kwadratowych implicite zadaje inny węzeł. Tak więc poniższe zapytanie znajduje węzły, które mają co najmniej dwoje dzieci:

#w: [] > [] & #w > [] 

Operator „nie istnieje”

Operator negacji użyty w obrębie specyfikacji wierzchołka wybiera drzewa posiadające wierzchołek niepasujący do zanegowanego kryterium. Czasami chciałoby się jednak znaleźć drzewa, w których pewien typ wierzchołka nie wystepuje. Takie działanie ma operator negacji ! użyty na zewnątrz specyfikacji wierzchołka (czyli na zewnątrz nawiasów kwadratowych). Na przykład następujące zapytanie znajduje zdania, które zawierają frazę wymaganą bezokolicznikową infp, ale nie zawierają jawnie wyrażonego podmiotu subj(…):

#z: [cat=S] > [tfw=/infp(.*)/ ] & ! #z > [tfw=/subj.*/]