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 archiwalną 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. Udostępniane są dwa warianty korpusu: pełne lasy składniowe wygenerowane przez parser z oznaczonym drzewem poprawnym (forests) oraz same drzewa poprawne (chosen trees). Ta druga postać pozwala na szybsze wykonywanie zapytań.

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=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=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, przy czym tę realizację A uzyskano z użyciem reguły gramatyki o symbolu 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 bezpośrednio poprzedza B (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
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) w lesie składniowym istnieje drzewo zawierające jednocześnie 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(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=zdanie] > [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=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=acc]]
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=acc]
jest równoważne
[[cat=fno & przypadek=acc & 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 xp:

[tfw=/prepnp.*/ & from=#f & to=#t] & [[tfw=/xp.*/ & 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.