Wyszukiwarka drzew składniowych ze Składnicy frazowej

Niniejsza strona pozwala na zadawanie zapytań dotyczących Składnicy frazowej — banku składnikowych drzew składniowych języka polskiego. Udostępniamy wersję 0.5 Składnicy (8227 drzew), będącą wynikiem projektu N N104 224735, oraz wersję bieżącą, rozbudowaną w projektach NEKST, CLARIN-PL, CLARIN-PL-2.

Poniżej prezentujemy język zapytań wyszukiwarki wzorowany na języku wyszukiwarki TIGERSearch. Po zadaniu pytania wyszukiwarka prezentuje stronicowaną listę wszystkich pasujących zdań. Po wybraniu zdania z tej listy wyświetlane jest pasujące drzewo z możliwością przechodzenia między dopasowaniami, jeżeli jest ich więcej niż jedno w obrębie danego zdania. Kolejność zwracanych wyników nie jest zdefiniowana.

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. Pożądane 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 zdanie atrybutu category:

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

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ą binarne — ich wartości to truefalse.

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 = (fno | fpt) & przypadek=bier]

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=fno] & [cat=fpt]

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

Relacja Zapis
bezpośredni nadrzędnik A > B A jest rodzicem B w pewnym drzewie
nadrzędnik A >* B B należy do pewnego poddrzewa A (B != A)
nadrzędnik z etykietą A >R B w pewnym drzewie A jest rodzicem B, który wyprowadzono z użyciem reguły R
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
bezpośrednie poprzedzanie A . B A poprzedza B (inaczej fraza B zaczyna się tam gdzie kończy się A)
poprzedzanie A .* B B występuje po A
poprzedzanie A .N B B zaczyna się N wyrazów od końca A
poprzedzanie A .M,N B B zaczyna się między M a N wyrazów od końca A
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
rodzeństwo A $ B A i B mają w pewnym drzewie 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
korzeń root(A) A jest korzeniem lasu
pokrewieństwo same_tree(A, B) istnieje drzewo zawierające A i B

Te z powyższych operatorów, które zapisane są infiksowo, można łączyć w łańcuchy. Na przykład następujące wyrażenie wyszukuje zdania, które zawierają frazę wymaganą fw, która jest realizowana przez frazę przymiotnikową:

[cat=zdanie] > [cat=fw] > [cat=fpt]

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/ & base=#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ęściwarunku wymagamy, aby atrybut base 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] . [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 zdanie, które by miały jako swoje dzieci jednocześnie: frazę wymaganą oznaczoną jako podmiot subj, frazę wymaganą nominalną w bierniku np(bier) oraz frazę wymaganą przysłówkową advp. 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=zdanie] > [tfw=subj] & #z > [tfw="np(bier)"] & #z >  [tfw=advp]

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=zdanie] > [tfw=/infp(.*)/ ] & ! #z > [tfw=subj]

Poprawne zapytanie nie może się składać wyłącznie z wierzchołków wyspecyfikowanych w zasięgu operatora „nie istnieje”.

Praca ze strukturami niejednoznacznymi

Składnica frazowa powstała w wyniku automatycznej analizy składniowej zdań i ujednoznacznienia ich przez językoznawców. W procesie tym analizator generuje wiele możliwych interpretacji składniowych, a eksperci oznaczają jedno drzewo jako najlepiej pasujący opis danego zdania.

Dotychczas przedstawiliśmy zapytania o interpretacje wybrane przez ekspertów. Jednak dla wyszukiwarki dostępne są wszystkie interpretacje wygnerowane przez analizator. Można się do nich odwołać specyfikując wierzchołek w podwójnych nawiasach kwadratowych [[]]. Tak więc następujące zapytanie wyszukuje wszystkie drzewa, dla których analizator automatyczny dopuścił istnienie frazy nominalnej w bierniku:

[[cat=fno & przypadek=bier]]
Zapis w pojedynczych nawiasach jest w istocie skrótem notacyjnym równoważnym dodaniu warunku, że wierzchołek ma ustawiony atrybut sel, sygnalizujący, że należy on do drzewa wybranego przez językoznawców. Tak więc zapytanie
[cat=fno & przypadek=bier]
jest równoważne
[[cat=fno & przypadek=bier & sel]]

W następującym zapytaniu szukamy fraz wymaganych, które zostały przez językoznawców uznane za przyimkowe (prepnp), a dla których analizator automatyczny proponował też interpretację jako przysłówkowe (advp):

[tfw=/prepnp.*/ & from=#f & to=#t] & [[tfw="advp" & from=#f & to=#t]]
Użycie zmiennych i atrybutów fromto zapewnia, że dwie znalezione jednostki są rozpięte (w różnych drzewach) nad tym samym fragmentem tekstu.