blob: ed4a225f3bc38302a60c3c950abf7c27da7f146b [file] [log] [blame]
Akron54740182017-06-17 14:17:23 +02001% layout 'main', title => 'KorAP: Poliqarp+';
2
Akron9490e3b2019-10-17 12:26:29 +02003%= page_title
Akron54740182017-06-17 14:17:23 +02004
Akron84b91992019-07-16 11:35:49 +02005<p>Die folgende Dokumentation präsentiert alle Funktionen, die unsere Version der Poliqarp Abfragesprache zur Verfügung stellt und enthält zusätzlich einige spezifische KorAP Erweiterungen.</p>
Akron54740182017-06-17 14:17:23 +02006
7<section id="segments">
8 <h3>Einfache Segmente</h3>
9
Akronae24e162018-02-13 18:48:44 +010010 <p>Die kleinsten Elemente von Poliqarp sind Segmente. Meistens repräsentieren Segmente Wörter und können leicht abgefragt werden:</p>
Akron54740182017-06-17 14:17:23 +020011
Akronbee660d2018-02-14 15:57:02 +010012 %= doc_query poliqarp => loc('Q_poliqarp_simple', '** Tree')
Akron54740182017-06-17 14:17:23 +020013
Akronae24e162018-02-13 18:48:44 +010014 <p>Abfolgen einfacher Segmente werden durch Leerzeichen getrennt:</p>
Akron54740182017-06-17 14:17:23 +020015
Akronbee660d2018-02-14 15:57:02 +010016 %= doc_query poliqarp => loc('Q_poliqarp_simpleseq', '** the Tree')
Akron54740182017-06-17 14:17:23 +020017
18 <p>Einfache Segmente beziehen sich immer auf die Oberflächenform eines Wortes. Wenn Sie nach einer Oberflächenform ohne Beachtung der Groß- und Kleinschreibung suchen, können Sie <code>/i</code> anfügen.</p>
19
Akronbee660d2018-02-14 15:57:02 +010020 %= doc_query poliqarp => loc('Q_poliqarp_simpleci', '** run/i')
Akron54740182017-06-17 14:17:23 +020021
Akronae24e162018-02-13 18:48:44 +010022 <p>Die Abfrage oben findet alle Vorkommen des Wortes unabhängig von ihrer Großschreibung.
Akron54740182017-06-17 14:17:23 +020023
24 <h4 id="regexp">Reguläre Ausdrücke</h4>
25
Akron3cfa26d2019-10-24 15:17:34 +020026 <p>Segmente können auch durch <%= embedded_link_to 'doc', 'Reguläre Ausdrücke', 'ql', 'regexp' %> abgefragt werden - indem das Segment mit doppelten Anführungszeichen umschlossen wird.</p>
Akron54740182017-06-17 14:17:23 +020027
Akronbee660d2018-02-14 15:57:02 +010028 %= doc_query poliqarp => loc('Q_poliqarp_re', '** "r(u|a)n"'), cutoff => 1
Akron54740182017-06-17 14:17:23 +020029
Akronae24e162018-02-13 18:48:44 +010030 <p>Reguläre Ausdrücke stimmen immer mit dem gesamten Segment überein,
31 d.h. die obige Abfrage findet Wörter, die mit dem ersten Buchstaben des Ausdrucks beginnen und mit dem letzten Buchstaben enden. Um Teilausdrücke zu unterstützen, können Sie das Flag <code>/x</code> verwenden.</p>
Akron54740182017-06-17 14:17:23 +020032
Akronbee660d2018-02-14 15:57:02 +010033 %= doc_query poliqarp => loc('Q_poliqarp_rex', '** "r(u|a)n"/x'), cutoff => 1
Akron54740182017-06-17 14:17:23 +020034
35 <p>Das <code>/x</code> flag sucht nach allen Segmenten, die eine Sequenz von Zeichen enthalten, die mit dem regulären Ausdruck übereinstimmen. Das bedeutet, dass die obige Abfrage äquivalent zu der Folgenden ist:</p>
36
Akronbee660d2018-02-14 15:57:02 +010037 %= doc_query poliqarp => loc('Q_poliqarp_recontext', '** ".*?r(u|a)n.*?"'), cutoff => 1
Akron54740182017-06-17 14:17:23 +020038
39 <p>Das <Code>/x</code> Flag kann auch in Verbindung mit exakten Ausdrücken verwendet werden, um nach Teilzeichenketten zu suchen:</p>
40
Akronbee660d2018-02-14 15:57:02 +010041 %= doc_query poliqarp => loc('Q_poliqarp_simplex', '** part/xi'), cutoff => 1
Akron54740182017-06-17 14:17:23 +020042
Akronae24e162018-02-13 18:48:44 +010043 <p>Die obige Abfrage findet alle Vorkommen von Segmenten mit der definierten Zeichenfolge - unabhängig von Groß-Kleinschreibung und unabhängig von ihrem Zeichenkontext.</p>
Akron54740182017-06-17 14:17:23 +020044
45 <blockquote class="warning">
Akronae24e162018-02-13 18:48:44 +010046 <p>Achtung: Diese Art von Abfragen (mit vorangestellten <code>.*</Code> Ausdrücken) können extrem langsam sein!</p>
Akron81afd282018-07-24 11:39:55 +020047 <p>In der ursprünglichen Poliqarp-Implementation konnten sowohl doppelte Anführungszeichen als auch einfache Anführungszeichen reguläre Ausdrücke markieren. In Poliqarp+ hingegen werden einfache Anführungszeichen für zeichengetreue Ausdrücke verwendet.</p>
Akron54740182017-06-17 14:17:23 +020048 </blockquote>
49
50 <p>Sie können das <code>/i</code> Flag erneut anwenden, um unabhängig von Groß-Kleinschreibung zu suchen.</p>
51
Akronbee660d2018-02-14 15:57:02 +010052 %= doc_query poliqarp => loc('Q_poliqarp_rexi', '** "r(u|a)n"/xi'), cutoff => 1
Akron54740182017-06-17 14:17:23 +020053
Akron852fb8a2023-07-21 07:48:13 +020054 <h4 id="reserved">Geschützte Begriffe</h4>
55
56 <p>Die folgenden Wörter sind Teil der Anfragesprache von Poliqarp+ und können daher nicht in der Kurzschreibung für einfache Segmente verwendet werden. Um dennoch nach ihnen suchen zu können, ist die Schreibung als <%= embedded_link_to 'doc', 'komplexe Segmente', 'ql', 'poliqarp-plus#complex'%> nötig (z.B. <code>[orth='contains']</code>):
57
58 <ul>
59 <li><code>contains</code></li>
60 <li><code>dependency</code></li>
61 <li><code>dominates</code></li>
62 <li><code>endswith</code></li>
63 <li><code>endsWith</code></li>
64 <li><code>focus</code></li>
65 <li><code>i</code> und <code>I</code></li>
66 <li><code>meta</code></li>
67 <li><code>matches</code></li>
68 <li><code>overlaps</code></li>
69 <li><code>relatesTo</code></li>
70 <li><code>split</code></li>
71 <li><code>startswith</code> und <code>startsWith</code></li>
72 <li><code>submatch</code></li>
73 <li><code>within</code></li>
74 <li><code>x</code> und <code>X</code></li>
75 </ul>
76
Akron54740182017-06-17 14:17:23 +020077</section>
78
79<section id="complex">
80 <h3>Komplexe Segmente</h3>
81
82 <p>Komplexe Segmente werden in eckigen Klammern ausgedrückt und enthalten zusätzliche Informationen über die Ressource des zu prüfenden Begriffs, indem sie Schlüssel/Wert-Paare enthalten, die durch ein Gleichheitszeichen getrennt sind.</p>
83
Akronae24e162018-02-13 18:48:44 +010084 <p>Die KorAP-Implementierung von Poliqarp bietet drei spezielle Segmentschlüssel: <code>orth</code> für Oberflächenformen, <code>base</code> für Lemmata und <code>pos</code> für Part-of-Speech-Annotationen. Die folgende komplexe Abfrage findet alle Oberflächenformen des eingegebenen Wortes.</p>
Akron54740182017-06-17 14:17:23 +020085
Akronae24e162018-02-13 18:48:44 +010086 %# Es gibt noch mehr spezielle Schlüssel in Poliqarp, aber KorAP bietet sie nicht an.
Akron54740182017-06-17 14:17:23 +020087
Akronbee660d2018-02-14 15:57:02 +010088 %= doc_query poliqarp => loc('Q_poliqarp_complexorth', '** [orth=Tree]')
Akron54740182017-06-17 14:17:23 +020089
90 <p>Die Abfrage entspricht also:</p>
91
Akronbee660d2018-02-14 15:57:02 +010092 %= doc_query poliqarp => loc('Q_poliqarp_simple', '** Tree')
Akron54740182017-06-17 14:17:23 +020093
94 <p>Komplexe Segmente erwarten einfache Ausdrücke als Werte, was bedeutet, dass auch der folgende Ausdruck gültig ist:</p>
95
Akronbee660d2018-02-14 15:57:02 +010096 %= doc_query poliqarp => loc('Q_poliqarp_complexre', '** [orth="r(u|a)n"/xi]'), cutoff => 1
Akron54740182017-06-17 14:17:23 +020097
Akron3cfa26d2019-10-24 15:17:34 +020098 <p>Ein weiterer spezieller Schlüssel ist <code>base</code>, bezogen auf die Lemma-Annotation der <%= embedded_link_to 'doc', 'Standard-Foundry', 'data', 'annotation'%>.
Akronae24e162018-02-13 18:48:44 +010099 Die folgende Abfrage findet alle Vorkommen von Segmenten, die mit dem eingegebenen Lemma in der Standard-Foundry annotiert wurden.</p>
Akron54740182017-06-17 14:17:23 +0200100
Akronbee660d2018-02-14 15:57:02 +0100101 %= doc_query poliqarp => loc('Q_poliqarp_complexlemma', '** [base=Tree]'), cutoff => 1
Akron54740182017-06-17 14:17:23 +0200102
Akron3cfa26d2019-10-24 15:17:34 +0200103 <p>Der dritte Sonderschlüssel ist <code>pos</code> und bezieht sich auf die Wortarten-Annotation der <%= embedded_link_to 'doc', 'Standard-Foundry', 'data', 'annotation'%>.
Akron54740182017-06-17 14:17:23 +0200104 Die folgende Abfrage findet alle attributiven Adjektive:</p>
105
Akronbee660d2018-02-14 15:57:02 +0100106 %= doc_query poliqarp => loc('Q_poliqarp_complexpos', '** [pos=ADJA]'), cutoff => 1
Akron54740182017-06-17 14:17:23 +0200107
Akronae24e162018-02-13 18:48:44 +0100108 <p>Komplexe Segmente, die weitere Token-Annotationen erfordern, können die <code>foundry/layer</code> Notation dem Suchschlüssel voranstellen.
109 Zum Beispiel, um alle Vorkommen von Plural-Wörtern in einer diese Information enthaltenden Foundry zu finden, können Sie mit der folgenden Abfrage suchen:</p>
Akron54740182017-06-17 14:17:23 +0200110
Akronbee660d2018-02-14 15:57:02 +0100111 %= doc_query poliqarp => loc('Q_poliqarp_complexplural', '** [mate/m=number:pl]'), cutoff => 1
Akron54740182017-06-17 14:17:23 +0200112
Akron81afd282018-07-24 11:39:55 +0200113 <p>Falls eine Annotation Sonderzeichen enthält, sorgen umschließende einfache Anführungszeichen für eine zeichengetreue Interpretation.</p>
114
115 %= doc_query poliqarp => loc('Q_poliqarp_complexverbatim', '** [mate/o=\'This is an annotation with space characters\']'), cutoff => 1
116
Akron54740182017-06-17 14:17:23 +0200117 <h4>Negation</h4>
Akronae24e162018-02-13 18:48:44 +0100118 <p>Die Negation von Termen in komplexen Ausdrücken kann durch Voranstellen eines Ausrufezeichens vor dem Gleichheitszeichen oder dem gesamten Term ausgedrückt werden.</p>
Akron54740182017-06-17 14:17:23 +0200119
Akronbee660d2018-02-14 15:57:02 +0100120 %= doc_query poliqarp => loc('Q_poliqarp_neg1', '** [pos!=ADJA]'), cutoff => 1
121 %= doc_query poliqarp => loc('Q_poliqarp_neg2', '** [!pos=ADJA]'), cutoff => 1
Akron54740182017-06-17 14:17:23 +0200122
123 <blockquote class="warning">
Akronae24e162018-02-13 18:48:44 +0100124 <p>Vorsicht: Negierte komplexe Segmente können nicht alleinstehend gesucht werden.
Akron3cfa26d2019-10-24 15:17:34 +0200125 Allerdings funktionieren sie, wenn sie Teil einer <%= embedded_link_to 'doc', 'Sequenz', 'ql', 'poliqarp-plus#syntagmatic-operators-sequence'%> sind.</p>
Akron54740182017-06-17 14:17:23 +0200126 </blockquote>
127
128 <h4 id="empty-segments">Leere Segmente</h4>
129
130 <p>Ein spezielles Segment ist das leere Segment, das jedem Wort im Index entspricht.</p>
131
Akronbee660d2018-02-14 15:57:02 +0100132 %= doc_query poliqarp => '[]', cutoff => 1
Akron54740182017-06-17 14:17:23 +0200133
Akron3cfa26d2019-10-24 15:17:34 +0200134 <p>Leere Segmente sind nützlich, um Abstände von Wörtern auszudrücken, indem sie <%= embedded_link_to 'doc', 'Wiederholungen', 'ql', 'poliqarp-plus#syntagmatic-operators-repetitions' %> verwenden.</p>
Akron54740182017-06-17 14:17:23 +0200135
136 <blockquote class="warning">
Akronae24e162018-02-13 18:48:44 +0100137 <p>Vorsicht: Leere Segmente können nicht alleinstehend gesucht werden.
Akron3cfa26d2019-10-24 15:17:34 +0200138 Allerdings funktionieren sie, wenn sie Teil einer <%= embedded_link_to 'doc', 'Sequenz', 'ql', 'poliqarp-plus#syntagmatic-operators-sequence' %> sind.</p>
Akron54740182017-06-17 14:17:23 +0200139 </blockquote>
140</section>
141
Akron54740182017-06-17 14:17:23 +0200142<section id="spans">
Akronae24e162018-02-13 18:48:44 +0100143 <h3>Span-Segmente</h3>
Akron54740182017-06-17 14:17:23 +0200144
Akron92e67302017-06-18 20:27:12 +0200145 <p>Nicht alle Segmente sind an Worte gebunden - manche sind an Konzepte gebunden, die mehrere Wörter überspannen, z. B. Nominalphrasen, Sätze oder Absätze.
Akronae24e162018-02-13 18:48:44 +0100146Span-Segmente können durch spitze Klammern anstelle von eckigen Klammern gesucht werden.</p>
Akron54740182017-06-17 14:17:23 +0200147
Akronbee660d2018-02-14 15:57:02 +0100148 %= doc_query poliqarp => loc('Q_poliqarp_span', '** <corenlp/c=NP>'), cutoff => 1
Akron54740182017-06-17 14:17:23 +0200149
Akron92e67302017-06-18 20:27:12 +0200150 <p>Ansonsten können sie genauso behandelt werden wie einfache oder komplexe Segmente.</p>
Akron54740182017-06-17 14:17:23 +0200151</section>
152
153<section id="paradigmatic-operators">
Akron92e67302017-06-18 20:27:12 +0200154 <h3>Paradigmatische Operatoren</h3>
Akron54740182017-06-17 14:17:23 +0200155
Akronae24e162018-02-13 18:48:44 +0100156 <p>Ein komplexes Segment kann mehrere Eigenschaften haben, die ein Token erfüllen muss. Zum Beispiel, um nach allen Wörtern einer bestimmten Oberflächenform eines bestimmten Lemmas (egal ob großgeschrieben oder nicht) zu suchen, können Sie folgende Abfrage nutzen:</p>
Akron54740182017-06-17 14:17:23 +0200157
Akronbee660d2018-02-14 15:57:02 +0100158 %= doc_query poliqarp => loc('Q_poliqarp_and', '** [orth=run/i & base=Run]'), cutoff => 1
Akron54740182017-06-17 14:17:23 +0200159
Akron92e67302017-06-18 20:27:12 +0200160 <p>Das Kaufmanns-Und kombiniert mehrere Eigenschaften mit einem logischen UND.
161Die Ausdrücke des komplexen Segments können negiert werden wie zuvor eingeführt.</p>
Akron54740182017-06-17 14:17:23 +0200162
Akronbee660d2018-02-14 15:57:02 +0100163 %= doc_query poliqarp => loc('Q_poliqarp_andneg1', '** [orth=run/i & base!=Run]'), cutoff => 1
Akron54740182017-06-17 14:17:23 +0200164
Akron92e67302017-06-18 20:27:12 +0200165 <p>Die folgende Abfrage ist daher äquivalent:</p>
Akron54740182017-06-17 14:17:23 +0200166
Akronbee660d2018-02-14 15:57:02 +0100167 %= doc_query poliqarp => loc('Q_poliqarp_andneg2', '** [orth=run/i & !base=Run]'), cutoff => 1
Akron54740182017-06-17 14:17:23 +0200168
Akron92e67302017-06-18 20:27:12 +0200169 <p>Alternativen können mit dem Balkensymbol ausgedrückt werden:</p>
Akron54740182017-06-17 14:17:23 +0200170
Akronbee660d2018-02-14 15:57:02 +0100171 %= doc_query poliqarp => loc('Q_poliqarp_or', '** [base=run | base=go]'), cutoff => 1
Akron54740182017-06-17 14:17:23 +0200172
Akron92e67302017-06-18 20:27:12 +0200173 <p>Alle diese Unterausdrücke können mit runden Klammern gruppiert werden, um komplexe boolesche Ausdrücke zu bilden:</p>
Akron54740182017-06-17 14:17:23 +0200174
Akronbee660d2018-02-14 15:57:02 +0100175 %= doc_query poliqarp => loc('Q_poliqarp_group', '** [(base=run | base=go) & tt/pos=VVFIN]'), cutoff => 1
Akron54740182017-06-17 14:17:23 +0200176</section>
177
178<section id="syntagmatic-operators">
Akron92e67302017-06-18 20:27:12 +0200179 <h3>Syntagmatische Operatoren</h3>
Akron54740182017-06-17 14:17:23 +0200180
Akron92e67302017-06-18 20:27:12 +0200181 <h4 id="syntagmatic-operators-sequence">Sequenzen</h4>
Akron54740182017-06-17 14:17:23 +0200182
Akronae24e162018-02-13 18:48:44 +0100183 <p>Sequenzen können verwendet werden, um Segmente in einer bestimmten Reihenfolge zu suchen. Hierfür werden die einfachen Ausdrücke mit Leerzeichen getrennt.</p>
Akron54740182017-06-17 14:17:23 +0200184
Akronbee660d2018-02-14 15:57:02 +0100185 %= doc_query poliqarp => loc('Q_poliqarp_seq', '** the old man'), cutoff => 1
Akron54740182017-06-17 14:17:23 +0200186
Akron92e67302017-06-18 20:27:12 +0200187 <p>Sie können natürlich auch mit komplexen Segmenten suchen:</p>
Akron54740182017-06-17 14:17:23 +0200188
Akronbee660d2018-02-14 15:57:02 +0100189 %= doc_query poliqarp => loc('Q_poliqarp_seqcomplex', '** [orth=the][orth=old][orth=man]'), cutoff => 1
Akron54740182017-06-17 14:17:23 +0200190
Akronae24e162018-02-13 18:48:44 +0100191 <p>Jetzt können Sie auch den Nutzen des leeren Segments erkennen, um nach Wörtern zu suchen, die Sie nicht kennen:</p>
Akron54740182017-06-17 14:17:23 +0200192
Akronbee660d2018-02-14 15:57:02 +0100193 %= doc_query poliqarp => loc('Q_poliqarp_seqcomplexempty', '** [orth=the][][orth=man]'), cutoff => 1
Akron54740182017-06-17 14:17:23 +0200194
Akronae24e162018-02-13 18:48:44 +0100195 <p>Sie können Segmente und Span-Segmente auch in Sequenzen mischen, um beispielsweise nach einem Wort am Anfang eines Satzes zu suchen (das als erstes Wort nach dem Ende eines Satzes interpretiert werden kann).</p>
Akron54740182017-06-17 14:17:23 +0200196
Akronbee660d2018-02-14 15:57:02 +0100197 %= doc_query poliqarp => loc('Q_poliqarp_seqspan', '** <base/s=s>[orth=The]'), cutoff => 1
Akron54740182017-06-17 14:17:23 +0200198
Akronae24e162018-02-13 18:48:44 +0100199 <h4>Gruppen</h4>
Akron54740182017-06-17 14:17:23 +0200200
201 ...
202
Akron92e67302017-06-18 20:27:12 +0200203 <h4>Alternativen</h4>
Akron54740182017-06-17 14:17:23 +0200204
Akronae24e162018-02-13 18:48:44 +0100205 <p>Alternativen erlauben die Suche nach alternativen Segmenten oder Sequenzen von Segmenten, ähnlich dem paradigmatischen Operator. Sie haben bereits gesehen, dass Sie nach alternativen Adjektiv-Sequenzen suchen können, indem Sie eingeben:</p>
Akron54740182017-06-17 14:17:23 +0200206
Akronbee660d2018-02-14 15:57:02 +0100207 %= doc_query poliqarp => loc('Q_poliqarp_seqor', '** the [orth=old | orth=young] man'), cutoff => 1
Akron54740182017-06-17 14:17:23 +0200208
Akronae24e162018-02-13 18:48:44 +0100209 <p>Allerdings bereitet dieser Ausdruck Probleme, falls Sie nach Alternativen von Sequenzen anstatt von Begriffen suchen möchten. In diesem Fall können Sie syntagmatische Alternativen und Gruppen verwenden:</p>
Akron54740182017-06-17 14:17:23 +0200210
Akronbee660d2018-02-14 15:57:02 +0100211 %= doc_query poliqarp => loc('Q_poliqarp_seqorgroup1', '** the (young man | old woman)'), cutoff => 1
Akron54740182017-06-17 14:17:23 +0200212
Akronae24e162018-02-13 18:48:44 +0100213 <p>Das Balkensymbol funktioniert genauso wie bei der paradigmatischen Alternative, unterstützt aber Sequenzen unterschiedlicher Länge als Operanden. Die obige Abfrage nach einem alternativen Adjektiv kann daher umformuliert werden als:</p>
Akron54740182017-06-17 14:17:23 +0200214
Akronbee660d2018-02-14 15:57:02 +0100215 %= doc_query poliqarp => loc('Q_poliqarp_seqorgroup2', '** the (old | young) man'), cutoff => 1
Akron54740182017-06-17 14:17:23 +0200216
Akron92e67302017-06-18 20:27:12 +0200217 <h4 id="syntagmatic-operators-repetitions">Wiederholungen</h4>
Akron54740182017-06-17 14:17:23 +0200218
Akron3cfa26d2019-10-24 15:17:34 +0200219 <p>Wiederholungen in Poliqarp werden wie in <%= embedded_link_to 'doc', 'regulären Ausdrücken', 'ql', 'regexp'%> realisiert, indem Quantifizierer in geschweifte Klammern gesetzt werden.</p>
Akron92e67302017-06-18 20:27:12 +0200220
Akronae24e162018-02-13 18:48:44 +0100221 <p>Um eine Sequenz von drei Vorkommen eines Wortes zu suchen, können Sie Ihre Abfrage auf eine der folgenden Arten formulieren - sie werden die selben Ergebnisse erhalten:</p>
Akron54740182017-06-17 14:17:23 +0200222
Akronbee660d2018-02-14 15:57:02 +0100223 %= doc_query poliqarp => loc('Q_poliqarp_repmanual', '** the the the'), cutoff => 1
224 %= doc_query poliqarp => loc('Q_poliqarp_repsimple', '** the{3}'), cutoff => 1
225 %= doc_query poliqarp => loc('Q_poliqarp_repcomplex', '** [orth=the]{3}'), cutoff => 1
Akron54740182017-06-17 14:17:23 +0200226
Akronae24e162018-02-13 18:48:44 +0100227 <p>Im Unterschied zu regulären Ausdrücken bezieht sich der Wiederholungsoperator nicht auf den Treffer, sondern auf das gegebene Muster. So gibt Ihnen die folgende Abfrage eine Sequenz von drei Wörtern mit einer definierten Zeichenfolge als Teilstring - aber die gefundenen Wörter müssen nicht identisch sein.</p>
Akron54740182017-06-17 14:17:23 +0200228
Akronbee660d2018-02-14 15:57:02 +0100229 %= doc_query poliqarp => loc('Q_poliqarp_repre', '** "ru.*?"/i{3}'), cutoff => 1
Akron54740182017-06-17 14:17:23 +0200230
Akronae24e162018-02-13 18:48:44 +0100231 <p>Das gleiche gilt für Annotationen. Die folgende Abfrage findet eine Folge von 3 bis 4 Adjektiven in einem definierten Kontext, wobei die Adjektive nicht identisch sein müssen.</p>
Akron54740182017-06-17 14:17:23 +0200232
Akronbee660d2018-02-14 15:57:02 +0100233 %= doc_query poliqarp => loc('Q_poliqarp_repanno', '** [base=the][tt/p=ADJA]{3,4}[tt/p=NOUN]'), cutoff => 1
Akron54740182017-06-17 14:17:23 +0200234
Akronae24e162018-02-13 18:48:44 +0100235 <p>Zusätzlich zu nummerierten Quantitäten ist es auch möglich, Wiederholungsinformationen als Kleene-Operatoren <code>?</code>, <code>*</code> und <code>+</code> anzugeben.</p>
Akron54740182017-06-17 14:17:23 +0200236
Akronae24e162018-02-13 18:48:44 +0100237 <p>Um nach einer Sequenz mit einem optionalen Segment zu suchen, können Sie Folgendes angeben:</p>
Akron54740182017-06-17 14:17:23 +0200238
Akronbee660d2018-02-14 15:57:02 +0100239 %= doc_query poliqarp => loc('Q_poliqarp_seqopt1', '** [base=the][tt/pos=ADJA]?[base=Tree]'), cutoff => 1
Akron54740182017-06-17 14:17:23 +0200240
Akron92e67302017-06-18 20:27:12 +0200241 <p>Diese Abfrage ist identisch mit der nummerierten Quantifizierung von:</p>
Akron54740182017-06-17 14:17:23 +0200242
Akronbee660d2018-02-14 15:57:02 +0100243 %= doc_query poliqarp => loc('Q_poliqarp_seqopt2', '** [base=the][tt/pos=ADJA]{,1}[base=Tree]'), cutoff => 1
Akron54740182017-06-17 14:17:23 +0200244
Akronae24e162018-02-13 18:48:44 +0100245 <p>Um nach den gleichen Sequenzen zu suchen, aber mit einer unbegrenzten Anzahl von Adjektiven, können Sie den Kleene-Stern benutzen:</p>
Akron54740182017-06-17 14:17:23 +0200246
Akronbee660d2018-02-14 15:57:02 +0100247 %= doc_query poliqarp => loc('Q_poliqarp_seqstar', '** [base=the][tt/pos=ADJA]*[base=Tree]'), cutoff => 1
Akron54740182017-06-17 14:17:23 +0200248
Akronae24e162018-02-13 18:48:44 +0100249 <p>Und um nach dieser Sequenz zu suchen, aber mit mindestens einem Adjektiv dazwischen, können Sie das Kleene Plus benutzen (alle Abfragen sind identisch):</p>
Akron54740182017-06-17 14:17:23 +0200250
Akronbee660d2018-02-14 15:57:02 +0100251 %= doc_query poliqarp => loc('Q_poliqarp_seqplus1', '** [base=the][tt/pos=ADJA]+[base=Tree]'), cutoff => 1
252 %= doc_query poliqarp => loc('Q_poliqarp_seqplus2', '** [base=the][tt/pos=ADJA]{1,}[base=Tree]'), cutoff => 1
253 %= doc_query poliqarp => loc('Q_poliqarp_seqplus3', '** [base=the][tt/pos=ADJA][tt/pos=ADJA]*[base=Tree]'), cutoff => 1
Akron54740182017-06-17 14:17:23 +0200254
255 <blockquote class="warning">
Akronae24e162018-02-13 18:48:44 +0100256 <p>Wiederholungsoperatoren wie <code>{,n}</code>, <code>?</code> und <code>*</code> machen Segmente oder Gruppen von Segmenten optional. Falls diese Abfragen getrennt und nicht als Teil einer Sequenz verwendet werden (und es keine obligatorischen Segmente in der Abfrage gibt), werden Sie vom System gewarnt, dass Ihre Abfrage nicht als optional behandelt wird.</p>
257 <p>Denken Sie daran, dass Optionalität auf unterschiedliche Arten <i>vererbt</i> sein kann, zum Beispiel wird eine ganze Abfrage optional, sobald ein Segment der Alternative optional ist.</p>
Akron54740182017-06-17 14:17:23 +0200258 </blockquote>
259
Akron3cfa26d2019-10-24 15:17:34 +0200260 <p>Die Wiederholung kann auch verwendet werden, um Distanzen zwischen Segmenten auszudrücken, indem Sie <%= embedded_link_to 'doc', 'leere Segmente', 'ql', 'poliqarp-plus # leere Segmente'%> verwenden.</p>
Akron54740182017-06-17 14:17:23 +0200261
Akronbee660d2018-02-14 15:57:02 +0100262 %= doc_query poliqarp => loc('Q_poliqarp_seqdistance1', '** [base=the][][base=Tree]'), cutoff => 1
263 %= doc_query poliqarp => loc('Q_poliqarp_seqdistance2', '** [base=the][]{2}[base=Tree]'), cutoff => 1
264 %= doc_query poliqarp => loc('Q_poliqarp_seqdistance3', '** [base=the][]{2,}[base=Tree]'), cutoff => 1
265 %= doc_query poliqarp => loc('Q_poliqarp_seqdistance4', '** [base=the][]{,3}[base=Tree]'), cutoff => 1
Akron54740182017-06-17 14:17:23 +0200266
Akron92e67302017-06-18 20:27:12 +0200267 <p>Selbstverständlich können auch Kleene-Operatoren mit leeren Segmenten eingesetzt werden.</p>
Akron54740182017-06-17 14:17:23 +0200268
Akronbee660d2018-02-14 15:57:02 +0100269 %= doc_query poliqarp => loc('Q_poliqarp_seqdistanceopt', '** [base=the][]?[base=Tree]'), cutoff => 1
270 %= doc_query poliqarp => loc('Q_poliqarp_seqdistancestar', '** [base=the][]*[base=Tree]'), cutoff => 1
271 %= doc_query poliqarp => loc('Q_poliqarp_seqdistanceplus', '** [base=the][]+[base=Tree]'), cutoff => 1
Akron54740182017-06-17 14:17:23 +0200272
Akron92e67302017-06-18 20:27:12 +0200273 <h4>Positionen</h4>
Akron54740182017-06-17 14:17:23 +0200274
Akron3cfa26d2019-10-24 15:17:34 +0200275 <p>Sequenzen wie oben können in weiteren komplexen Abfragen verschachtelt und als Unterabfragen behandelt werden (siehe <%= embedded_link_to 'doc', 'Klassenoperatoren', 'ql', 'poliqarp-plus#class-operator' %>, um direkten Zugriff auf Unterabfragen zu erhalten).</p>
Akron92e67302017-06-18 20:27:12 +0200276
Akronae24e162018-02-13 18:48:44 +0100277 <p>Positionsoperatoren vergleichen zwei Treffer von Unterabfragen und ergeben einen Treffer, falls eine bestimmte Bedingung bezüglich der Position von beiden wahr ist.</p>
Akron92e67302017-06-18 20:27:12 +0200278
Akronae24e162018-02-13 18:48:44 +0100279 <p>Der Befehl <code>contains()</code> ergibt einen Treffer, wenn eine zweite Unterabfrage innerhalb der Spanne einer ersten Unterabfrage liegt.</p>
Akron54740182017-06-17 14:17:23 +0200280
Akronbee660d2018-02-14 15:57:02 +0100281 %= doc_query poliqarp => loc('Q_poliqarp_poscontains', '** contains(<base/s=s>, [tt/p=KOUS])'), cutoff => 1
Akron54740182017-06-17 14:17:23 +0200282
Akron92e67302017-06-18 20:27:12 +0200283 <p>Die <code>startsWith()</code> Operation ergibt einen Treffer, wenn eine zweite Unterabfrage am Anfang der Spanne einer ersten Unterabfrage vorkommt.</p>
Akron54740182017-06-17 14:17:23 +0200284
Akronbee660d2018-02-14 15:57:02 +0100285 %= doc_query poliqarp => loc('Q_poliqarp_posstartswith', '** startsWith(<base/s=s>, [tt/p=KOUS])'), cutoff => 1
Akron54740182017-06-17 14:17:23 +0200286
Akron92e67302017-06-18 20:27:12 +0200287 <p>Die Operation <code>endsWith()</code> ergibt einen Treffer, wenn eine zweite Unterabfrage am Ende der Spanne einer ersten Unterabfrage vorkommt.</p>
Akron54740182017-06-17 14:17:23 +0200288
Akronbee660d2018-02-14 15:57:02 +0100289 %= doc_query poliqarp => loc('Q_poliqarp_posendswith', '** endsWith(<base/s=s>, [opennlp/p=NN])'), cutoff => 1
Akron54740182017-06-17 14:17:23 +0200290
Akron92e67302017-06-18 20:27:12 +0200291 <p>Die Operation <code>matches()</code> ergibt einen Treffer, wenn eine zweite Unterabfrage die gleiche Spanne einer ersten Unterabfrage hat.</p>
Akron54740182017-06-17 14:17:23 +0200292
Akronbee660d2018-02-14 15:57:02 +0100293 %= doc_query poliqarp => loc('Q_poliqarp_posmatches', '** matches(<base/s=s>,[tt/p=CARD][tt/p="N.*"])'), cutoff => 1
Akron54740182017-06-17 14:17:23 +0200294
Akron92e67302017-06-18 20:27:12 +0200295 <p>Die Operation <code>overlaps()</code> ergibt einen Treffer, wenn eine zweite Unterabfrage mit der Spanne einer ersten Unterabfrage überlappt.</p>
Akron54740182017-06-17 14:17:23 +0200296
Akronbee660d2018-02-14 15:57:02 +0100297 %= doc_query poliqarp => loc('Q_poliqarp_posoverlaps', '** overlaps([][tt/p=ADJA],{1:[tt/p=ADJA]}[])'), cutoff => 1
Akron54740182017-06-17 14:17:23 +0200298
299 <blockquote class="warning">
Akron92e67302017-06-18 20:27:12 +0200300 <p>Positionsoperatoren sind noch experimentell und können sich in bestimmten Aspekten in Zukunft ändern (obwohl das definierte Verhalten stabil ist). Es gibt auch falsches Verhalten, das in zukünftigen Versionen korrigiert wird.</p>
Akronae24e162018-02-13 18:48:44 +0100301 <p>Optionale Operanden in Positionsoperatoren müssen derzeit obligatorisch sein und werden umformuliert um mindestens einmal vorzukommen.</p>
Akron92e67302017-06-18 20:27:12 +0200302 <p>Dieses Verhalten kann sich in Zukunft ändern.</p>
Akron54740182017-06-17 14:17:23 +0200303 </blockquote>
304
305 <!--
306 <blockquote>
Akronae24e162018-02-13 18:48:44 +0100307 <p>Die KorAP-Implementierung von Poliqarp unterstützt auch den Postfix <code>within</ code> Operator, der ähnlich wie der <code>contains()</ code> Operator funktioniert, aber nicht schachtelbar ist.</p>
Akron54740182017-06-17 14:17:23 +0200308 </blockquote>
309 -->
310
311</section>
312
313<section id="class-operators">
Akronae24e162018-02-13 18:48:44 +0100314 <h3>Klassen-Operatoren</h3>
Akron54740182017-06-17 14:17:23 +0200315
Akronae24e162018-02-13 18:48:44 +0100316 <p>Klassen werden verwendet, um Teiltreffer durch umgebende geschweifte Klammern und eine Klassennummer <code>{1: ...}</code> zu gruppieren. Klassen können verwendet werden, um auf Teiltreffer in einer Abfrage zu verweisen, ähnlich wie bei Captures in regulären Ausdrücken. In Poliqarp+ haben Klassen mehrere Zwecke, wobei die Hervorhebung der Intuitivste ist:</p>
Akron54740182017-06-17 14:17:23 +0200317
Akronbee660d2018-02-14 15:57:02 +0100318 %= doc_query poliqarp => loc('Q_poliqarp_classes', '** the {1:{2:[]} man}'), cutoff => 1
Akron54740182017-06-17 14:17:23 +0200319
Akronae24e162018-02-13 18:48:44 +0100320 <p>In KorAP können Klassen von 1 bis 128 definiert werden. Wenn eine Klassennummer fehlt, ist die Klasse standardmäßig auf die Klassennummer 1 gesetzt: <code>{...}</code> ist gleich <code>{1: ...}</code>.</p>
Akron54740182017-06-17 14:17:23 +0200321
Akron92e67302017-06-18 20:27:12 +0200322 <h4>Treffer-Modifikation</h4>
Akron54740182017-06-17 14:17:23 +0200323
Akron92e67302017-06-18 20:27:12 +0200324 <p>Basierend auf Klassen können Treffer geändert werden. Der Operator <code>focus()</code> beschränkt die Spanne eines Treffers auf die Grenzen einer bestimmten Klasse.</p>
Akron54740182017-06-17 14:17:23 +0200325
Akronbee660d2018-02-14 15:57:02 +0100326 %= doc_query poliqarp => loc('Q_poliqarp_focus', '** focus(the {Tree})'), cutoff => 1
Akron54740182017-06-17 14:17:23 +0200327
Akronae24e162018-02-13 18:48:44 +0100328 <p>Die obige Abfrage sucht nach einer Sequenz, wobei der Treffer auf das zweite Segment beschränkt wird. Sie können das erste Segment in dieser Abfrage als <i>positive look-behind zero-length assertion</i> in regulären Ausdrücken verstehen.</p>
Akron54740182017-06-17 14:17:23 +0200329
Akronae24e162018-02-13 18:48:44 +0100330 <p>Aber Fokussieren ist weitaus nützlicher, wenn Sie nach Treffern suchen, ohne die Oberflächenform zu kennen. Um beispielsweise alle Wörter zwischen zwei definierten Wörtern zu finden, können Sie suchen:</p>
Akron54740182017-06-17 14:17:23 +0200331
Akronbee660d2018-02-14 15:57:02 +0100332 %= doc_query poliqarp => loc('Q_poliqarp_focusempty', '** focus(the {[]} Tree)'), cutoff => 1
Akron54740182017-06-17 14:17:23 +0200333
Akronae24e162018-02-13 18:48:44 +0100334 <p>Dies beschränkt die Treffer auf alle interessanten Begriffe zwischen der definierten Sequenz. Oder Sie können nach allen Wörtern, die einer Sequenz unmittelbar folgen suchen:</p>
Akron54740182017-06-17 14:17:23 +0200335
Akronbee660d2018-02-14 15:57:02 +0100336 %= doc_query poliqarp => loc('Q_poliqarp_focusextension', '** focus(the old and {[]})'), cutoff => 1
Akron54740182017-06-17 14:17:23 +0200337
Akronbee660d2018-02-14 15:57:02 +0100338 <p><code>focus()</code> ist besonders nützlich, wenn Sie in bestimmten Bereichen nach Treffern suchen, zum Beispiel in Zitaten mit Positionsoperatoren.
339 Während Sie sich nicht für das ganze Zitat interessieren, können Sie das Ergebnis darauf fokussieren, was für Sie relevant ist.</p>
Akron54740182017-06-17 14:17:23 +0200340
Akronbee660d2018-02-14 15:57:02 +0100341 %= doc_query poliqarp => loc('Q_poliqarp_focusrelevance', '** focus(contains(she []{,10} said, {Tree}))'), cutoff => 1
Akron54740182017-06-17 14:17:23 +0200342
Akronae24e162018-02-13 18:48:44 +0100343 <p>Falls eine Klassennummer fehlt, setzt der Fokusoperator standardmäßig auf die Klassennummer 1: <code>focus(...)</code> entspricht <code>focus(1: ...)</code>.</p>
Akron54740182017-06-17 14:17:23 +0200344
345 <blockquote class="warning">
Akron92e67302017-06-18 20:27:12 +0200346 <p>Da Zahlen in geschweiften Klammern unter bestimmten Umständen zweideutig sein können (beispielsweise kann <code>[]{3}</code> entweder als &quot;irgendein Wort dreimal wiederholt&quot; gelesen werden oder als &quot;irgendein Wort, gefolgt von der Zahl 3, die als Klassennummer 1 hervorgehoben ist&quot;), sollten Zahlen immer als <code>[orth=3]</code> für den letzteren Fall ausgedrückt werden.</p>
Akron54740182017-06-17 14:17:23 +0200347 </blockquote>
348</section>