2 ANNIS: Interface und Suchabfragesprache

In diesem Kapitel werfen wir zunächst einen genaueren Blick auf das ANNIS-Interface und lernen dann anhand eines Beispiels Grundelemente der Suchabfragesprache kennen. Dabei kann dieses Tutorial allerdings die Auseinandersetzung mit der Dokumentation von ANNIS und seiner Suchabfragesprache nicht ersetzen.

2.1 ANNIS-Interface

Das ANNIS-Interface besteht aus drei Teilen: Links oben sehen wir die Suchmaske, darunter die Korpusauswahl, rechts sehen wir zunächst eine Seite mit Beispielanfragen und Zugang zur Hilfe, die eine sehr umfangreiche englischsprachige Dokumentation zu ANNIS und seinen Funktionen bietet.

ANNIS-Interface

Fig. 2.1: ANNIS-Interface

2.2 Suchabfragesprache

ANNIS arbeitet mit der ANNIS Query Language, die hier dokumentiert ist. Da ANNIS v.a. für syntaktisch annotierte Korpora entwickelt wurde (ANNIS steht für “Annotation of Information Structure”), entfaltet die Suchabfragesprache ihr volles Potential in sog. Baumbanken. Beispiele hierfür sind die Deutsche Diachrone Baumbank und die Mercurius-Baumbank, die ebenfalls über die oben verlinkte Berliner ANNIS-Instanz zugänglich sind. Im Folgenden konzentrieren wir uns jedoch auf sehr einfache Suchanfragen auf Tokenebene.

AQL funktioniert, wie die meisten anderen Suchanfragesprachen, nach dem Prinzip, dass man nach Variable-Wert-Paaren sucht, z.B. pos="NN", wenn man nach Substantiven (genauer: Appellativen) suchen möchte. (Das verwendete Tagset für Wortarten ist das Stuttgart-Tübingen-Tagset, kurz STTS, das hier dokumentiert ist).

Bei komplexeren Suchanfragen muss man die einzelnen Variable-Wert-Paare quasi miteinander verketten, d.h. man muss angeben, in welcher Relation sie zueinander stehen. Beispielsweise bedeutet pos="ART" . pos="NN", dass wir einen Artikel suchen, gefolgt von einem Substantiv - denn der Punkt dient in AQL als Indikator für “direkte Präzedenz”. Alternativ kann man diese Suchanfrage auch wie folgt schreiben:

pos="ART" & pos="NN" & #1 . #2

In dieser ausführlichen Schreibweise spezifizieren wir zunächst die einzelnen Variable-Wert-Paare und nehmen dann durch Zahlen auf sie Bezug. Die Anfrage ist wie folgt zu lesen: Wir suchen einen Artikel (#1), und wir suchen ein Substantiv (#2). In welchem Verhältnis stehen sie zueinander? #1 geht #2 unmittelbar voran. Die Suchanfrage bringt genau das gleiche Ergebnis wie die kurze Variante weiter oben. Diese ausführliche Schreibweise hat jedoch gerade bei komplexeren Suchanfragen den Vorteil, dass man leichter den Überblick behält und ggf. noch fehlende Elemente in der Suchanfrage entdeckt.

Aufgabe: Finden Sie über die AQL-Dokumentation heraus, wie wir die Suchanfrage modifizieren müssen, um zu erlauben, dass a) bis zu 3 Wörter zwischen dem Artikel und dem Substantiv stehen, b) mindestens 1 Wort und maximal 5 Wörter zwischen dem Artikel und dem Substantiv stehen, c) beliebig viele (bzw. bis zu 50) Wörter zwischen dem Artikel und dem Subsnativ stehen.

Soweit der kurze “Primer” zur Suchanfragesprache - wie bereits angekündigt, bleiben wir hier sehr an der Oberfläche. Für die vertiefte Beschäftigung mit der Anfragesprache empfehle ich die Dokumentation und die auf Seite 1 verlinkten Tutorials.

Nun wollen wir uns dem versprochenen konkreten Beispiel zuwenden. Hier soll es darum gehen, Diminutive, also Verkleinerungsformen, zu finden.

2.3 Beispiel: Diminutive in RIDGES

Dafür müssen wir zunächst in der Korpusauswahlspalte links unten das richtige Korpus finden. Wir verwenden das Korpus RIDGES_Herbology_Version9.0 (da RIDGES regelmäßig aktualisiert wird, gibt es allerdings möglicherweise schon eine neuere Version, wenn Sie dieses Tutorial lesen; evtl. funktionieren dann die im Folgenden angegebenen Links nicht mehr, die Suchanfragen sollten aber trotzdem noch funktionieren).

Eine sehr einfache Suchanfrage auf Lemmaebene könnte nun lauten: lemma=/.*chen|.*lein/. Diese Suchanfrage verwendet reguläre Ausdrücke. Um in ANNIS regulare Ausdrücke zu verwenden, muss man die Anfrage in Slashes (/…/) einschließen statt, wie in den Beispielen oben, in Anführungszeichen. Einen Einstieg in reguläre Ausdrücke bietet die sehr empfehlenswerte Seite https://www.regular-expressions.info/. Außerdem gebe ich in diesem Tutorial sowie im folgenden Video, das ich 2020 für einen Korpuslinguistik-Online-Kurs erstellt habe, einen ausführlichen Überblick über reguläre Ausdrücke. Um das Video zu sehen, klicken Sie wieder den entsprechenden Abschnitt auf:

klick mich

Schauen wir uns nun die mit unserer Suchanfrage erzielten Treffer genauer an. Unschwer ist zu erkennen, dass es sehr viele Fehltreffer gibt: Beispielsweise werden machen und allein gefunden. Daher verfeinern wir die Suchanfrage etwas, indem wir nur nach spezifizieren, dass wir nur nach Substantiven suchen. Da prinzipiell auch Eigennamen (“NE”) diminuiert werden können, suchen wir nach der Wortart /N./, wobei der Punkt bei regulären Ausdrücken für “irgendein Zeichen” steht. Auf diese Weise suchen wir sowohl nach Eigennamen (“NE”) als auch nach Appellativen (“NN”).

lemma=/.*chen|.*lein/ & pos=/N./ & #1 _=_ #2

Mit dem “=”-Operator geben wir an, dass sich beide Variable-Wert-Paare auf die gleiche Spanne (d.h. in unserem Fall: auf das gleiche Token) beziehen. Wir suchen also nach solchen Tokens, die auf der Lemma-Ebene mit “chen” oder “lein” enden und auf der POS-Ebene mit N plus einem weiteren Zeichen annotiert sind, also als Substantive getaggt sind.

Mit 1677 Treffern sind die Ergebnisse nun schon etwas stärker ausgedünnt. Um zu überprüfen, ob sich dennoch (womöglich tokenfrequente) Fehltreffer eingeschlichen haben, lohnt es sich, einen Blick auf die Frequenzliste der Treffer zu werfen. Dafür klicken wir auf More > Frequency Analysis, wie in 2.2 gezeigt. Defaultmäßig will ANNIS nun nach Lemma und POS auszählen, weil das die Annotationsebenen sind, auf denen wir gesucht haben. Da wir aber nur nach Lemma auszählen möchten, entfernen wir zunächst POS und initiieren dann die Frequenzanalyse, ebenfalls wie in @ref(fig:freq_analysis) gezeigt.

Frequenzanalyse initiieren

Fig. 2.2: Frequenzanalyse initiieren

Wir sehen nun eine Liste der häufigsten Lemmas, die ich hier noch einmal angebe:

lemma count
Blümlein 86
Blättlein 85
Blättchen 43
Quintlein 42
Männlein 37
Säcklein 34
Tüchlein 32
Kräutlein 31
Keuchen 28
Peterlein 27
Zeichen 27
Weiblein 26
Knöpflein 25
Blümchen 21
Quäntchen 20
Büchlein 18
Erbrechen 18
Bälglein 17
Zweiglein 17
Quentchen 17
Ährchen 16
Fässchen 16
Eiche|Eichen 15
Quäntlein 15
Stänglein 14
Früchtchen 14
Gertlein 14
Ästlein 13
Kochen 12
Seitenstechen 12
Stücklein 12
Mausöhrlein 12
Sämlein 11
Brechen 10
Kuchen 9
Bürdlein 9
Samentierchen 9
Zäpflein 9
Öhrchen 8
Pflänzlein 8
Zeltlein 8
Küchlein 8
Fässlein 8
Säckchen 8
Rechen 7
Täschlein 7
Gläslein 7
Bäumlein 7
Weibchen 7
Wörtlein 7
Köpflein 7
Würmlein 7
Reich|Reiche|Reichen 7
Ästchen 7
Stielchen 6
Nebenästlein 6
Kügelchen 6
Träublein 6
Becherlein 6
Stechen 6
Pontischen 6
Stäudlein 6
Blätterlein 6
Kennzeichen 6
Fisch|Fischen 6
Gamanderlein 5
Röhrlein 5
Männchen 5
Leinentüchlein 5
Kräuterbüchlein 5
Honiggrübchen 5
Kätzchen 5
Schößlein 5
Tröpflein 4
Nüsschen 4
Deckblättchen 4
Stöcklein 4
Pfaffenröhrlein 4
Samenkörnlein 4
Stengelein 4
Blumenblättchen 4
Körnlein 4
Grübchen 4
Händlein 4
Zäserlein 4
Gewerblein 4
Windröschen 4
Zünglein 4
Löchlein 4
Schließfrüchtchen 3
Lache|Lachen 3
Gipfelein 3
Bächlein 3
Bläslein 3
Näglein 3
Mutterzäpflein 3
Waldenburgischen 3
Bürstlein 3
Kindlein 3
Äderlein 3
Maiblümlein 3
Keimbläschen 3
Corsischen 3
Blütenköpfchen 3
Kölblein 3
Hülslein 3
Köpfchen 3
Grüblein 3
Schifflein 3
Blatthäutchen 3
Würzlein 3
Häuptlein 3
Fächlein 3
Desgleichen 3
Schüssellein 3
Herzgrüblein 3
Häklein 3
Härchen 3
Gartenpeterlein 3
Nägelein 3
Fäserlein 2
Sälblein 2
Seidentüchlein 2
Drache|Drachen 2
Pfännlein 2
Säulchen 2
Kräuterlein 2
Bläschen 2
Bützlein 2
Blumenknöpflein 2
Gläschen 2
Knöpfchen 2
Kränzelein 2
Teiglein 2
Teilchen 2
Krüglein 2
Gärtlein 2
Auswaschen 2
Katzenträublein 2
Käferlein 2
Paradeisgärtlein 2
Steinlein 2
Trünklein 2
Samenkeimchen 2
Nebenzinklein 2
Steinbrechen 2
Hörnlein 2
Leinensäcklein 2
Samenhäuslein 2
Würznelklein 2
Flöcklein 2
Stückchen 2
Ansuchen 2
Kardamömlein 2
Öhrlein 2
Sprösslein 2
Zinklein 2
Zipperlein 2
Stämmchen 2
Hühnlein 2
Pestilenzischen 2
Würzelein 2
Freischlein 2
Körnchen 2
Rohrbüschen 2
Nebenblättchen 2
Sieblein 2
Leistenbrüchen 2
Zirbelnüsslein 2
Hüttlein 2
Pflänzchen 2
Nebenzweiglein 2
Schwämmlein 2
Häublein 2
Häuslein 2
Würzelchen 2
Konfekttäflein 2
Stabwurz-Männlein 2
Magsaatköpflein 2
Knochen 2
Nelklein 2
Schälchen 2
Weiche|Weichen 2
Scheiblein 2
Kätzlein 2
Brüstlein 2
Beetlein 2
Faserchen 2
Priestleyischen 2
Zitterschen 2
Podagrämischen 1
Letschen 1
Blutäderlein 1
Pollenschläuchen 1
Jenaischen 1
Erlenbüschen 1
Hausgärtlein 1
Nebenschößlein 1
Retortchen 1
Hödlein 1
Monatrettichen 1
Dölderlein 1
Eichenfässlein 1
Pfündlein 1
Zwitterblümchen 1
Rachen 1
Balglein 1
Kränzlein 1
Nachforschen 1
Heschen 1
Einweichen 1
Gewürznelklein 1
Hütchen 1
verrauchen 1
Schüppchen 1
Knöchlein 1
Säumlein 1
Weinbeerlein 1
Imgleichen 1
Sieche|Siechen 1
Bäuchlein 1
Saurachbeerlein 1
Heumachen 1
Röslein 1
Bündlein 1
Judenkirschen 1
Eichstättischen 1
Engländischen 1
Podagrischen 1
Rüblein 1
Rüdlein 1
Schröpfhörnlein 1
Rütlein 1
Krönchen 1
Krönlein 1
Kirmsgästchen 1
Zweieimerfässchen 1
Büchschen 1
Ziegelstücklein 1
Luftröhrlein 1
orientischen 1
Gleichlein 1
Rietlein 1
Gewürznäglein 1
Rosenkuchen 1
Nebenäderlein 1
Feldseuchen 1
Zuckergläschen 1
Töpflein 1
Knäblein 1
Kalendermachen 1
Mäuseöhrlein 1
Leibesgebrechen 1
Waldeckischen 1
Johannisbeerlein 1
Maßliebchen 1
Porselein 1
Ringlein 1
Kamillenkräutlein 1
Pimpernüsslein 1
Butterbletschen 1
Steinchen 1
Äpfelchen 1
Kleeblättlein 1
Ripplein 1
Vorwitzchen 1
Tüpfelein 1
Traktätlein 1
Windlein 1
Saftblättchen 1
Dergleichen 1
Seitenblättchen 1
Sprößlein 1
Kornnägelein 1
Krautkuchen 1
Garkochen 1
Zimtröhrlein 1
Meeträublein 1
Sternlein 1
Granatenbäumlein 1
Glaichen 1
Töchterlein 1
Fabesbletschen 1
Goldwürmlein 1
Neglein 1
Messerspitzlein 1
Träubchen 1
Knödlein 1
Knötlein 1
Drachen 1
Majoranstöcklein 1
Tiegelein 1
Margen-Frauen-Himmel-Röslein 1
Trunklein 1
Samenhäuschen 1
Verbrechen 1
Infusionstierchen 1
Martialischen 1
Räuchlein 1
Reislein 1
Blümelein 1
Linzeichen 1
Mönchsköpflein 1
Sterbestündlein 1
Spreublättchen 1
Stübichen 1
Oberhäutchen 1
Steinpeterlein 1
Zypressennüsslein 1
Täflein 1
Ehrenpreisweiblein 1
Gränchen 1
Samenfächlein 1
Fittichen 1
Knüpflein 1
Flecklein 1
Schwertlein 1
Tertianischen 1
Essenkochen 1
Tüpflein 1
Büschlein 1
Haarlein 1
Eierkuchen 1
Nebenwürzlein 1
Maiblümchen 1
Städtlein 1
Leberlein 1
Blackwellischen 1
Werklein 1
Unkochen 1
äusländischen 1
Korianderblättlein 1
Hühnerdarmblättchen 1
Aehrchen 1
Laxiersäcklein 1
Wacholdersträuchen 1
Endblättchen 1
Zierlichen 1
Blumensträußlein 1
Schlaffkräutlein 1
Seitenwürzelchen 1
Zipflein 1
Alpenröschen 1
Werschlabeschen 1
Feinchen 1
Tridentiarischen 1
Dampfzäpflein 1
Stämmlein 1
Spitzlein 1
Gartensachen 1
Hüllblättchen 1
Strichlein 1
Keimchen 1
Hülschen 1
Erbsenbrühlein 1
Waldhähnchen 1
Brühlein 1
Käslein 1
Stuhlzäpflein 1
Dinglein 1
Einmachen 1
Verrauchen 1
Saftblätchen 1
Pünktlein 1
Weiberchen 1
Fesselein 1
Kerblein 1
Mägdelein 1
Wermutknöpfchen 1
Wermutknöpflein 1
Strohhelmlein 1
Wiedröslein 1
Büchenholzaschen 1
Messerlein 1
Samanderlein 1
Schnittlein 1
Mützlein 1
Ehrenpreismännlein 1
Berlinischen 1
Wundkräutlein 1
Leberäderlein 1
Großnäglein 1
Häufchen 1
Groschen 1
ɡleichen 1
Kelchläppchen 1
Mutterregelein 1
Rüttlein 1
Nägelblümlein 1
Küniglein 1
Brettlein 1
Johannisträublein 1
Pflästerlein 1
Zuckerwürzlein 1
Wännlein 1
Wermutsknöpfchen 1
Schildchen 1
Wässerlein 1
Zuckerküchlein 1
Küglein 1
Badstüblein 1
Waldglöcklein 1
Rosmarinstöcklein 1
Goldblättlein 1
Fingerlein 1
Megalensischen 1
Wetterröslein 1
Nervensiechen 1
Trichterlein 1
Bindlein 1
Ihresgleichen 1
Püplein 1
Benehmungsteilchen 1
Erstlichen 1
Büttelein 1
Hasenfüßlein 1
monoecischen 1
Päcklein 1
Bisslein 1
Nelkenblümlein 1
Farrnkrautmännchen 1
Blumblättchen 1
Zehenlein 1
Kämmlein 1
Labaschen 1
Äuglein 1
Kännlein 1
Laugenschäfflein 1
Fläschchen 1
Nestlein 1
Neuhochdeutschen 1
Herzstechen 1
Schliessfrüchtchen 1
Beerlein 1
Schösslein 1
Straussfederlein 1
Sträuchlein 1
Schötelein 1
Purgirlein 1
Schöttlein 1
Kreuzchen 1
Träctätlein 1
Kinderlein 1
Schweißlöchlein 1
Waldbächen 1
gelblättchen 1
Großäderlein 1
Schönchen 1
Schötlein 1
Feuerlein 1
Lavendelblümlein 1
Häflein 1
Kelchlein 1
Härlein 1
Engelein 1
Amylum-Kügelchen 1
Herzpochen 1
Ochsenzungenblümlein 1
Gesträuchen 1
Aachen 1
Glöckchen 1
Glöcklein 1
Kindelein 1
Gartennäglein 1
Atemgebrechen 1
Strünkchen 1
Centaurblümlein 1
Rebenzinklein 1
Schlafbettlein 1
Eichen 1
Rädchen 1
Därmlein 1
Kröseäderlein 1

Im vierten Kapitel werden wir noch einmal ausführlicher auf die Frequenzanalyse eingehen und darauf, wie man sich Frequenzlisten nach verschiedenen Annotationen und Metadaten hin ausgeben lassen kann.

Es zeigt sich, dass noch immer einige Fehltreffer zu verzeichnen sind, z.B. keuchen, erbrechen, Eiche bzw. Eichen und Zeichen. Bei den weniger frequenten finden sich sicherlich noch einige Fehltreffer mehr, aber wir wollen zunächst einmal einfach die genannten, relativ tokenfrequenten Fehltreffer ausschließen, um auf diesem Weg möglichst viele Fehltreffer auf einmal loszuwerden - alle weiteren können wir bei Bedarf später noch aussortieren.

Wir modifizieren die Suchanfrage daher wie folgt:

lemma=/.*chen|.*lein/ & pos=/N./ & lemma!=/Keuchen|Erbrechen|Eichen?|Zeichen/ & #1 _=_ #2 & #2 _=_ #3

Mit dem Ungleich-Operator != geben wir an, dass das Lemma keinem der Strings entsprechen soll, die innerhalb der Slashes /…/ mit dem ODER-Operator | voneinander abgetrennt sind.

Nun haben wir die Trefferzahl einigermaßen eingegrenzt und können zum Export übergehen.