blob: 757c407b6c7783a8df7353bef9014c6a91725349 [file] [log] [blame]
Akron54740182017-06-17 14:17:23 +02001% layout 'main', title => 'KorAP: Poliqarp+';
2
Akron1120a582017-10-17 12:29:16 +02003<h2 id="tutorial-top">Poliqarp+</h2>
Akron54740182017-06-17 14:17:23 +02004
5<p>Das folgende Tutorial präsentiert alle Features, 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
10 <p>Die einzelnen 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
12 %= doc_query poliqarp => 'Baum'
13
14 <p>Abfolgen einfacher Segmenten werden durch Leerzeichen getrennt:</p>
15
16 %= doc_query poliqarp => 'der Baum'
17
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
20 %= doc_query poliqarp => 'laufen/i'
21
22 <p>Die Abfrage oben findet alle Vorkommen von <code>laufen</code> unabhängig von der Großschreibung von Buchstaben, so wird <code>wir laufen</code> genauso gefunden wie <code>das Laufen</code> und sogar <code>&quot;GEH LAUFEN!&quot;</code>.
23
24 <h4 id="regexp">Reguläre Ausdrücke</h4>
25
26 <p>Segmente können auch durch <%= doc_link_to 'Reguläre Ausdrücke', 'ql', 'regexp' %> abgefragt werden - indem das Segment mit doppelten Anführungszeichen umschlossen wird.</p>
27
28 %= doc_query poliqarp => '"l(au|ie)fen"'
29
30 <p>Reguläre Ausdrücke stimmen immer mit dem gesamten Segment überein, d.h. die obige Abfrage findet Wörter, die mit <code>l</code> beginnen und mit <code>n</code> enden. Um Teilausdrücke zu unterstützen, können Sie das Flag <code>/x</code> verwenden.</p>
31
32 %= doc_query poliqarp => '"l(au|ie)fen"/x', cutoff => 1
33
34 <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>
35
36 %= doc_query poliqarp => '".*?l(au|ie)fen.*?"', cutoff => 1
37
38 <p>Das <Code>/x</code> Flag kann auch in Verbindung mit exakten Ausdrücken verwendet werden, um nach Teilzeichenketten zu suchen:</p>
39
40 %= doc_query poliqarp => 'trenn/xi', cutoff => 1
41
42 <p>Die obige Abfrage findet alle Vorkommen von Segmenten mit der Zeichenfolge <code>trenn</code> unabhängig von Groß-Kleinschreibung, wie &quot;Trennung&quot;, &quot;unzertrennlich&quot; oder &quot;Wettrennen&quot;.</p>
43
44 <blockquote class="warning">
45 <p>Achtung: Diese Art von Abfragen (mit vorangestellten <code>.*</Code> Ausdrücken) sind extrem langsam!</p>
46 </blockquote>
47
48 <p>Sie können das <code>/i</code> Flag erneut anwenden, um unabhängig von Groß-Kleinschreibung zu suchen.</p>
49
50 %= doc_query poliqarp => '"l(au|ie)fen"/xi', cutoff => 1
51
52</section>
53
54<section id="complex">
55 <h3>Komplexe Segmente</h3>
56
57 <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>
58
59 <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 von <code>Baum</code>.</p>
60
61 %# Es gibt mehr spezielle Schlüssel in Poliqarp, aber KorAP bietet sie nicht an.
62
63 %= doc_query poliqarp => '[orth=Baum]'
64
65 <p>Die Abfrage entspricht also:</p>
66
67 %= doc_query poliqarp => 'Baum'
68
69 <p>Komplexe Segmente erwarten einfache Ausdrücke als Werte, was bedeutet, dass auch der folgende Ausdruck gültig ist:</p>
70
71 %= doc_query poliqarp => '[orth="l(au|ie)fen"/xi]', cutoff => 1
72
73 <p>Ein weiterer spezieller Schlüssel ist <code>base</code>, bezogen auf die Lemma-Annotation der <%= doc_link_to 'Standard-Foundry', 'data', 'annotation'%>.
74 Die folgende Abfrage findet alle Vorkommen von Segmenten, die als Lemma <code>Baum</code> durch die Standard-Foundry annotiert wurden.</p>
75
76 %= doc_query poliqarp => '[base=Baum]'
77
Akronccd71a42017-06-30 18:09:19 +020078 <p>Der dritte Sonderschlüssel ist <code>pos</code> und bezieht sich auf die Wortarten-Annotation der <%= doc_link_to 'Standard-Foundry', 'data', 'annotation'%>.
Akron54740182017-06-17 14:17:23 +020079 Die folgende Abfrage findet alle attributiven Adjektive:</p>
80
81 %= doc_query poliqarp => '[pos=ADJA]'
82
83 <p>Komplexe Segmente, die weitere Token-Annotationen anfordern, können Schlüssel der <code>foundry/layer</code> Notation folgend haben.
84 Zum Beispiel, um alle Vorkommen von mehreren Wörtern in der <code>mate</code> Foundry zu finden, können Sie mit der folgenden Abfrage suchen:</p>
85
86 %= doc_query poliqarp => '[mate/m=number:pl]'
87
88 <h4>Negation</h4>
89 <p>Die Negation von Termen in komplexen Ausdrücken kann durch Voranstellen eines Ausrufezeichen vor dem Gleichheitszeichen oder dem gesamten Term ausgedrückt werden.</p>
90
91 %= doc_query poliqarp => '[pos!=ADJA]'
92 %= doc_query poliqarp => '[!pos=ADJA]'
93
94 <blockquote class="warning">
95 <p>Vorsicht: Negierte komplexe Segmente können nicht alleinstehend im Lucene-Index gesucht werden.
96 Allerdings funktionieren sie, wenn sie Teil einer <%= doc_link_to 'Sequenz', 'ql', 'poliqarp-plus#syntagmatic-operators-sequence'%> sind.</p>
97 </blockquote>
98
99 <h4 id="empty-segments">Leere Segmente</h4>
100
101 <p>Ein spezielles Segment ist das leere Segment, das jedem Wort im Index entspricht.</p>
102
103 %= doc_query poliqarp => '[]'
104
105 <p>Leere Segmente sind nützlich, um Abstände von Wörtern auszudrücken, indem sie <%= doc_link_to 'Wiederholungen', 'ql', 'poliqarp-plus#syntagmatic-operators-repetitions' %> verwenden.</p>
106
107 <blockquote class="warning">
108 <p>Vorsicht: Leere Segmente können nicht alleinstehend im Lucene-Index gesucht werden.
109 Allerdings arbeiten sie, falls sie Teil eines <%= doc_link_to 'sequence', 'ql', 'poliqarp-plus#syntagmatic-operators-sequence' %> sind.</p>
110 </blockquote>
111</section>
112
Akron54740182017-06-17 14:17:23 +0200113<section id="spans">
Akron92e67302017-06-18 20:27:12 +0200114 <h3>Span Segmente</h3>
Akron54740182017-06-17 14:17:23 +0200115
Akron92e67302017-06-18 20:27:12 +0200116 <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.
117Spansegmente können durch spitze Klammern anstelle von eckigen Klammern gesucht werden.</p>
Akron54740182017-06-17 14:17:23 +0200118
119 %= doc_query poliqarp => '<xip/c=INFC>'
120
Akron92e67302017-06-18 20:27:12 +0200121 <p>Ansonsten können sie genauso behandelt werden wie einfache oder komplexe Segmente.</p>
Akron54740182017-06-17 14:17:23 +0200122</section>
123
124<section id="paradigmatic-operators">
Akron92e67302017-06-18 20:27:12 +0200125 <h3>Paradigmatische Operatoren</h3>
Akron54740182017-06-17 14:17:23 +0200126
Akron92e67302017-06-18 20:27:12 +0200127 <p>Ein komplexes Segment kann mehrere Eigenschaften haben, die ein Token erfüllen muss. Zum Beispiel, um nach allen Wörtern mit der Oberflächenform <code>laufe</code> (egal ob großgeschrieben oder nicht) zu suchen, die das Lemma <code>lauf</code> haben (und nicht z. B. <code>laufen</code>, was ein Verb oder ein Gerundium angeben würde), können Sie suchen nach:</p>
Akron54740182017-06-17 14:17:23 +0200128
129 %= doc_query poliqarp => '[orth=laufe/i & base=Lauf]'
130
Akron92e67302017-06-18 20:27:12 +0200131 <p>Das Kaufmanns-Und kombiniert mehrere Eigenschaften mit einem logischen UND.
132Die Ausdrücke des komplexen Segments können negiert werden wie zuvor eingeführt.</p>
Akron54740182017-06-17 14:17:23 +0200133
134 %= doc_query poliqarp => '[orth=laufe/i & base!=Lauf]'
135
Akron92e67302017-06-18 20:27:12 +0200136 <p>Die folgende Abfrage ist daher äquivalent:</p>
Akron54740182017-06-17 14:17:23 +0200137
138 %= doc_query poliqarp => '[orth=laufe & !base=Lauf]'
139
Akron92e67302017-06-18 20:27:12 +0200140 <p>Alternativen können mit dem Balkensymbol ausgedrückt werden:</p>
Akron54740182017-06-17 14:17:23 +0200141
142 %= doc_query poliqarp => '[base=laufen | base=gehen]'
143
Akron92e67302017-06-18 20:27:12 +0200144 <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 +0200145
146 %= doc_query poliqarp => '[(base=laufen | base=gehen) & tt/pos=VVFIN]'
147</section>
148
149<section id="syntagmatic-operators">
Akron92e67302017-06-18 20:27:12 +0200150 <h3>Syntagmatische Operatoren</h3>
Akron54740182017-06-17 14:17:23 +0200151
Akron92e67302017-06-18 20:27:12 +0200152 <h4 id="syntagmatic-operators-sequence">Sequenzen</h4>
Akron54740182017-06-17 14:17:23 +0200153
Akron92e67302017-06-18 20:27:12 +0200154 <p>Sequenzen können verwendet werden, um Segmente in einer Reihe zu suchen. Zum Beispiel um nach dem Wort &quot;alte&quot; zu suchen, vorangestellt mit &quot;der&quot; und gefolgt von &quot;Mann&quot;, können Sie einfach nach der Reihenfolge der einfachen Ausdrücke, die durch Leerzeichen getrennt sind, suchen.</p>
Akron54740182017-06-17 14:17:23 +0200155
156 %= doc_query poliqarp => 'der alte Mann'
157
Akron92e67302017-06-18 20:27:12 +0200158 <p>Sie können natürlich auch mit komplexen Segmenten suchen:</p>
Akron54740182017-06-17 14:17:23 +0200159
160 %= doc_query poliqarp => '[orth=der][orth=alte][orth=Mann]'
161
Akron92e67302017-06-18 20:27:12 +0200162 <p>Jetzt können Sie den Nutzen des leeren Segments erkennen, um nach Wörtern zu suchen, die Sie nicht kennen:</p>
Akron54740182017-06-17 14:17:23 +0200163
164 %= doc_query poliqarp => '[orth=der][][orth=Mann]'
165
Akron92e67302017-06-18 20:27:12 +0200166 <p>Sie können auch Segmente und Span Segmente in Sequenzen mischen, um beispielsweise nach dem Wort &quot;Der&quot; 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 +0200167
168 %= doc_query poliqarp => '<base/s=s>[orth=Der]'
169
170 <h4>Groups</h4>
171
172 ...
173
Akron92e67302017-06-18 20:27:12 +0200174 <h4>Alternativen</h4>
Akron54740182017-06-17 14:17:23 +0200175
Akron92e67302017-06-18 20:27:12 +0200176 <p>Alternativen erlauben die Suche nach alternativen Segmenten oder Sequenzen von Segmenten, ähnlich dem paradigmatischen Operator. Sie haben bereits gesehen, dass Sie nach beiden Sequenzen von <code>der alte Mann</code> und <code>der junge Mann</code> suchen können, indem Sie eingeben:</p>
Akron54740182017-06-17 14:17:23 +0200177
178 %= doc_query poliqarp => 'der [orth=alte | orth=junge] Mann'
179
Akron92e67302017-06-18 20:27:12 +0200180 <p>Allerdings macht dieser Ausdruck Probleme, falls Sie nach Alternativen von Sequenzen anstatt von Begriffen suchen möchten. Wenn Sie nach beiden Sequenzen von <code>dem jungen Mann</code> und <code>der alte Mann</code> suchen möchten, können Sie syntagmatische Alternationen und Gruppen verwenden:</p>
Akron54740182017-06-17 14:17:23 +0200181
182 %= doc_query poliqarp => '(dem jungen | der alte) Mann'
183
Akron92e67302017-06-18 20:27:12 +0200184 <p>Das Balkensymbol funktioniert genauso wie bei der paradigmatischen Alternative, unterstützt aber Sequenzen unterschiedlicher Länge als Operanden. Die obige Abfrage für <code>der alte Mann</code> und <code>der junge Mann</code> kann daher umformuliert werden als:</p>
Akron54740182017-06-17 14:17:23 +0200185
186 %= doc_query poliqarp => 'der (junge | alte) Mann'
187
Akron92e67302017-06-18 20:27:12 +0200188 <h4 id="syntagmatic-operators-repetitions">Wiederholungen</h4>
Akron54740182017-06-17 14:17:23 +0200189
Akron92e67302017-06-18 20:27:12 +0200190 <p>Wiederholungen in Poliqarp werden wie in <%= doc_link_to 'regulären Ausdrücken', 'ql', 'regexp'%> realisiert, indem Quantifizierer in geschweifte Klammern gesetzt werden.</p>
191
192 <p>Um eine Sequenz von drei Vorkommen von <code>der</code> zu suchen, können Sie Ihre Abfrage auf eine der folgenden Arten formulieren - sie werden dieselben Ergebnisse erhalten:</p>
Akron54740182017-06-17 14:17:23 +0200193
194 %= doc_query poliqarp => 'der der der'
195 %= doc_query poliqarp => 'der{3}'
196 %= doc_query poliqarp => '[orth=der]{3}'
197
Akron92e67302017-06-18 20:27:12 +0200198 <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 dem Begriff <code>der</code> als Teilstring - aber die Wörter müssen nicht identisch sein. Die folgende Abfrage findet beispielsweise eine Sequenz von drei Wörtern, die alle mit <code>la</code> beginnen.</p>
Akron54740182017-06-17 14:17:23 +0200199
200 %= doc_query poliqarp => '"la.*?"/i{3}'
201
Akron92e67302017-06-18 20:27:12 +0200202 <p>Das gleiche gilt für Annotationen. Die folgende Abfrage findet eine Folge von 3 bis 4 Adjektiven, wie sie von der TreeTagger-Foundry annotiert wurden, dem das Lemma <code>ein</code> vorausgeht, wie es von der Standard-Foundry annotatiert wurde, gefolgt von einem Substantiv, wie es von der XIP-Foundry annotiert wurde.</p>
Akron54740182017-06-17 14:17:23 +0200203
204 %= doc_query poliqarp => '[base=ein][tt/p=ADJA]{3,4}[xip/p=NOUN]'
205
Akron92e67302017-06-18 20:27:12 +0200206 <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 +0200207
Akron92e67302017-06-18 20:27:12 +0200208 <p>Um nach einer Sequenz des Lemmas <code>der</code> (Standard-Foundry), gefolgt von dem Lemma <code>baum</code> (Standard-Foundry) mit einem optionalen Adjektiv von der TreeTagger Foundry annotiert dazwischen zu suchen, können Sie folgendes angeben:</p>
Akron54740182017-06-17 14:17:23 +0200209
210 %= doc_query poliqarp => '[base=die][tt/pos=ADJA]?[base=Baum]'
211
Akron92e67302017-06-18 20:27:12 +0200212 <p>Diese Abfrage ist identisch mit der nummerierten Quantifizierung von:</p>
Akron54740182017-06-17 14:17:23 +0200213
214 %= doc_query poliqarp => '[base=die][tt/pos=ADJA]{,1}[base=Baum]'
215
Akron92e67302017-06-18 20:27:12 +0200216 <p>Um nach den gleichen Sequenzen zu suchen, aber mit unbegrenzten Adjektiven dazwischen wie von der TreeTagger-Foundry annotiert, können Sie den Kleene-Stern benutzen:</p>
Akron54740182017-06-17 14:17:23 +0200217
218 %= doc_query poliqarp => '[base=die][tt/pos=ADJA]*[base=Baum]'
219
Akron92e67302017-06-18 20:27:12 +0200220 <p>Und um nach dieser Sequenz zu suchen, aber mit mindestens einem Adjektiv dazwischen, kannst du das Kleene Plus benutzen (alle Abfragen sind identisch):</p>
Akron54740182017-06-17 14:17:23 +0200221
222 %= doc_query poliqarp => '[base=die][tt/pos=ADJA]+[base=Baum]', cutoff => 1
223 %= doc_query poliqarp => '[base=die][tt/pos=ADJA]{1,}[base=Baum]', cutoff => 1
224 %= doc_query poliqarp => '[base=die][tt/pos=ADJA][tt/pos=ADJA]*[base=Baum]', cutoff => 1
225
226 <blockquote class="warning">
Akron92e67302017-06-18 20:27:12 +0200227 <p>Wiederholungsoperatoren wie <code>{,4}</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>
228 <p>Denken Sie daran, dass Optionalität auf unterschiedliche Arten <i>vererbt</i> sein kann, zum Beispiel, wenn Sie nach <code>(junge | alte)? | Tote</code> suchen, ist ein Segment der Alternation optional, was die ganze Abfrage optional macht.</p>
Akron54740182017-06-17 14:17:23 +0200229 </blockquote>
230
Akron92e67302017-06-18 20:27:12 +0200231 <p>Die Wiederholung kann auch verwendet werden, um Distanzen zwischen Segmenten auszudrücken, indem Sie <%= doc_link_to 'leere Segmente', 'ql', 'poliqarp-plus # leere Segmente'%> verwenden.</p>
Akron54740182017-06-17 14:17:23 +0200232
233 %= doc_query poliqarp => '[base=die][][base=Baum]'
234 %= doc_query poliqarp => '[base=die][]{2}[base=Baum]', cutoff => 1
235 %= doc_query poliqarp => '[base=die][]{2,}[base=Baum]', cutoff => 1
236 %= doc_query poliqarp => '[base=die][]{,3}[base=Baum]', cutoff => 1
237
Akron92e67302017-06-18 20:27:12 +0200238 <p>Selbstverständlich können auch Kleene-Operatoren mit leeren Segmenten eingesetzt werden.</p>
Akron54740182017-06-17 14:17:23 +0200239
240 %= doc_query poliqarp => '[base=die][]?[base=Baum]'
241 %= doc_query poliqarp => '[base=die][]*[base=Baum]', cutoff => 1
242 %= doc_query poliqarp => '[base=die][]+[base=Baum]', cutoff => 1
243
Akron92e67302017-06-18 20:27:12 +0200244 <h4>Positionen</h4>
Akron54740182017-06-17 14:17:23 +0200245
Akron92e67302017-06-18 20:27:12 +0200246 <p>Sequenzen wie oben gezeigt können in weiteren komplexen Abfragen verschachtelt und als Unterabfragen behandelt werden (siehe <%= doc_link_to 'Klassenoperatoren', 'ql', 'poliqarp-plus#class-operator' %>, um direkten Zugriff auf auf Unterabfragen zu erhalten).</p>
247
248 <p>Positionsoperatoren vergleichen zwei Varianten von Unterabfragen und ergeben einen Treffer, falls eine bestimmte Bedingung bezüglich der Position von beiden wahr ist.</p>
249
250 <p>Der Befehl <code>contains()</code> ergibt einen Treffer, wenn die zweite Unterabfrage innerhalb der Spanne einer ersten Unterabfrage liegt.</p>
Akron54740182017-06-17 14:17:23 +0200251
252 %= doc_query poliqarp => 'contains(<base/s=s>, [tt/p=KOUS])', cutoff => 1
253
Akron92e67302017-06-18 20:27:12 +0200254 <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 +0200255
256 %= doc_query poliqarp => 'startsWith(<base/s=s>, [tt/p=KOUS])', cutoff => 1
257
Akron92e67302017-06-18 20:27:12 +0200258 <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 +0200259
260 %= doc_query poliqarp => 'endsWith(<base/s=s>, [opennlp/p=NN])', cutoff => 1
261
Akron92e67302017-06-18 20:27:12 +0200262 <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 +0200263
264 %= doc_query poliqarp => 'matches(<base/s=s>,[tt/p=CARD][tt/p="N.*"])', cutoff => 1
265
Akron92e67302017-06-18 20:27:12 +0200266 <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 +0200267
268 %= doc_query poliqarp => 'overlaps([][tt/p=ADJA],{1:[tt/p=ADJA]}[])', cutoff => 1
269
270 <blockquote class="warning">
Akron92e67302017-06-18 20:27:12 +0200271 <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>
272 <p>Optionale Operanden in Positionsoperatoren wie in <code>contains(&lt;s&gt;, [orth=Baum]*)</code> müssen derzeit obligatorisch sein und werden umformuliert um mindestens einmal vorzukommen.</p>
273 <p>Dieses Verhalten kann sich in Zukunft ändern.</p>
Akron54740182017-06-17 14:17:23 +0200274 </blockquote>
275
276 <!--
277 <blockquote>
Akron92e67302017-06-18 20:27:12 +0200278 <p>Die KorAP-Implementierung von Poliqarp unterstützt auch den Postfix <code> innerhalb </ code> Operator, der ähnlich wie der <code> enthält () </ code> Operator funktioniert, aber nicht schachtelbar ist.</p>
Akron54740182017-06-17 14:17:23 +0200279 </blockquote>
280 -->
281
282</section>
283
284<section id="class-operators">
Akron92e67302017-06-18 20:27:12 +0200285 <h3>Klassen Operatoren</h3>
Akron54740182017-06-17 14:17:23 +0200286
Akron92e67302017-06-18 20:27:12 +0200287 <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 natürlichste ist:</p>
Akron54740182017-06-17 14:17:23 +0200288
289 %= doc_query poliqarp => 'der {1:{2:[]} Mann}'
290
291 %#= doc_query poliqarp => 'der {1:{2:[]{1,4}} {3:Baum}} {4:[]}'
292
Akron92e67302017-06-18 20:27:12 +0200293 <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> voreingestellt.</p>
Akron54740182017-06-17 14:17:23 +0200294
Akron92e67302017-06-18 20:27:12 +0200295 <h4>Treffer-Modifikation</h4>
Akron54740182017-06-17 14:17:23 +0200296
Akron92e67302017-06-18 20:27:12 +0200297 <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 +0200298
299 %= doc_query poliqarp => 'focus(der {Baum})'
300
Akron92e67302017-06-18 20:27:12 +0200301 <p>Die obige Abfrage sucht nach der Sequenz <code>der Baum</code>, aber der Treffer wird auf <code>Baum</code> beschränkt. Sie können <code>der</code> in dieser Abfrage als positive look-behind zero-length assertion in regulären Ausdrücken verstehen.</p>
Akron54740182017-06-17 14:17:23 +0200302
Akron92e67302017-06-18 20:27:12 +0200303 <p>Aber Fokussieren ist weitaus nützlicher, wenn Sie nach Treffern suchen, ohne die Oberflächenform zu kennen. Um beispielsweise alle Begriffe zwischen den Worten &quot;der&quot; und &quot;Mann&quot; zu finden, können Sie suchen:</p>
Akron54740182017-06-17 14:17:23 +0200304
305 %= doc_query poliqarp => 'focus(der {[]} Mann)'
306
Akron92e67302017-06-18 20:27:12 +0200307 <p>Dies beschränkt die Treffer auf alle interessanten Begriffe zwischen &quot;der&quot; und &quot;Mann&quot;. Oder Sie können nach allen Wörtern, die der Sequenz &quot;der alte und&quot; unmittelbar folgen suchen:</p>
Akron54740182017-06-17 14:17:23 +0200308
309 %= doc_query poliqarp => 'focus(der alte und {[]})'
310
311 <!--
Akron92e67302017-06-18 20:27:12 +0200312 <p><code>focus()</code> ist besonders nützlich, wenn Sie in bestimmten Bereichen nach Treffern suchen, zum Beispiel in Anführungszeichen mit Positionsoperatoren. Während Sie sich nicht für das ganze Zitat interessieren, können Sie sich darauf konzentrieren, was für Sie wirklich wichtig ist.</p>
Akron54740182017-06-17 14:17:23 +0200313
Akron92e67302017-06-18 20:27:12 +0200314 %= doc_query poliqarp => 'focus(1:contains(er []{,10} sagte, {1:Baum}))'
Akron54740182017-06-17 14:17:23 +0200315 -->
316
Akron92e67302017-06-18 20:27:12 +0200317 <p>Falls eine Klassennummer entfernt wird, setzt der Fokusoperator standardmäßig auf die Klassennummer 1: <code>focus(...)</code> entspricht <code>focus(1: ...)</code>.</p>
Akron54740182017-06-17 14:17:23 +0200318
319 <blockquote class="warning">
Akron92e67302017-06-18 20:27:12 +0200320 <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 +0200321 </blockquote>
322</section>