flowchart TD dok["Dokument D"] brief["Brief B"] seite["Seite P"] absatz["Absatz A"] satz["Satz S"] fn["Fussnote F"] abb["Abbildung G"] dok --> brief dok --> seite brief -->|"fx_enthalten, n zu m"| seite seite --> absatz seite --> satz seite --> fn seite --> abb
Evidenzobjekte
Was ein Beleg sein kann, wo es in DuckDB steht und woher es in der DTD kommt
Ein Evidenzobjekt ist eine Einheit der Collection, die Beleg einer Antwort sein kann — ein Satz, ein Absatz, eine Fußnote, eine Abbildung, eine Seite, ein Brief, ein Dokument —, mit Art, Schlüssel, DTD-Herkunft und Platz in der Gliederung; alle Evidenzobjekte einer Collection stehen als Zeilen in DuckDB, und nur sie kann eine Suche zurückgeben. Eine Art ist der Träger: an ihren Objekten wird der Raum verbucht.
Ein Objekt vorweg
S:10-6_fromm_carl_1921_1937#52.8
Art Satz; Schlüssel doc_id = 10-6_fromm_carl_1921_1937, pidx = 52, sent_idx = 8; Teil der Seite P:10-6_fromm_carl_1921_1937#52, die zum Dokument D:10-6_fromm_carl_1921_1937 gehört; enthalten im Brief B:10-6_fromm_carl_1921_1937/035; Herkunft page:main (Stanza zerlegt den Haupttext der Seite in Sätze).
Attribute (Zeilen in fx_post): person.genannt = P007304 (NER), form.text = hitler, lemma.text = Hitler|en und die Lemmata und Formen der übrigen Wörter.
Die Id ist der Schlüssel selbst, mit einem Kürzel für die Art davor. Aus ihr lassen sich Text, Seite und Faksimile wieder holen; die Suche gibt nur die Id zurück und den Grund, warum das Objekt die Frage erfüllt.
Die Arten
| Objektart | Id | Schlüssel | DuckDB | DTD | Teil von | im Brief über | Anzahl |
|---|---|---|---|---|---|---|---|
| Dokument | D: |
doc_id |
fq_documents (Sidecar) |
— | — | — | 1.066 |
| Brief | B: |
letter_id |
fq_letters (Sidecar) |
letter:letter |
dokument | — | 15.976 |
| Seite | P: |
doc_id, pidx |
stz_pages (Stanza) |
page:page |
dokument | fq_letter_pages |
38.213 |
| Absatz | A: |
doc_id, pidx, par_idx |
fq_paragraphs (Sidecar) |
page:p |
seite | fq_paragraphs.letter_id |
482.693 |
| Satz | S: |
doc_id, pidx, sent_idx |
stz_sentences (Stanza) |
— | seite | fq_letter_sentences |
663.972 |
| Fußnote | F: |
doc_id, pidx, fn_no |
fq_footnotes (Sidecar) |
page:fn |
seite | fq_letter_pages |
4.612 |
| Abbildung | G: |
doc_id, pidx, ref |
fq_figures (Sidecar) |
page:figure |
seite | fq_figures.letter_id |
0 |
Die Gliederung ist nicht nur ein Baum. Ein Dokument (eine Archivmappe) enthält Seiten; ein Brief belegt einige dieser Seiten, und eine Seite kann zu zwei Briefen gehören, wenn der eine auf ihr endet und der nächste beginnt. Deshalb steht das Enthaltensein in einer eigenen Tabelle:
Satz und Absatz sind Geschwister, nicht Teil und Ganzes: Stanza zerlegt den Haupttext der Seite in Sätze, der Absatz kommt aus der Seiten-XML (p, marginal, table), und in dieser Collection gibt es keine Zuordnung zwischen beiden.
Von der Seite in die DuckDB
Jede Seite der Collection ist eine XML-Datei nach page_letter.dtd. Ihre Teile kommen auf drei Wegen in DuckDB:
| Element der Seiten-XML | Tabelle | Objekt |
|---|---|---|
page |
stz_pages (Stanza), fq_letter_pages |
Seite |
main (Haupttext) |
stz_sentences, stz_tokens, stz_deps, stz_feats (Stanza) |
Satz, mit Token, Lemma, Wortart, Abhängigkeit |
p, marginal, table |
fq_paragraphs (Sidecar) |
Absatz, mit kind |
footnotes/fn |
fq_footnotes (Sidecar) |
Fußnote |
figure |
fq_figures (Sidecar) |
Abbildung |
letter-head (sender, addressee, place, date, regest) und letter@… |
fq_letters, fq_letter_entities, fq_letter_topics, fq_acts |
Brief und seine Kopf- und Inhaltsattribute |
Die Personen, Orte und Institutionen sind keine Zeichenketten, sondern Einzeldinge des Registers (_register/register.duckdb, ind_einzelding, ind_name): fq_entities führt jede ent_id der Collection auf ihre ind_id, und eine Nennung im Text (fq_mentions) trägt die ent_id, an die NER und Register den Namen gebunden haben, und ihre Lesart (Person, Eponym, kein Name).
Aus diesen Quelltabellen baut evidenzraum/bau.py (Aufruf scripts/build_fq_index.py) die Tabellen der Evidenzobjekte, im Kármán-Nachlass im Sidecar (karman-nachlass_fql.duckdb):
fx_meta: die Trägerart der Collection (brief) und ihr Name;fx_traeger: jeder Träger, das heißt jedes Objekt der Art, an der der Raumbeweis verbucht wird (hier jeder Brief);fx_objekt: jedes Evidenzobjekt mit Id, Art, Schlüsselspalten, Eltern, DTD-Herkunft und Quelle;fx_enthalten: welcher Träger welches Objekt enthält;fx_deck: welche Träger Objekte welcher Art haben (daraus folgt, wann ein Textblatt unentschieden bleibt);fx_post: die Attribute, eine Zeile je Attribut, Rolle, Schlüssel und Objekt; dazufx_formen, der Vorrat der gefalteten Wortformen, undfx_lemma_form, die Lemmaklassen jeder Form.
1.206.532 Evidenzobjekte (663.972 Sätze, 482.693 Absätze, 38.213 Seiten, 15.976 Briefe, 4.612 Fußnoten, 1.066 Dokumente, 0 Abbildungen), 20.196.883 Postings, 1.242.958 Zeilen Enthaltensein.
Der Bau braucht rund 20 Sekunden. Eine Zeile gate:fx in fq_build_meta hält die Zahlen je Objektart und die Zahl der Postings fest; jede Suche prüft sie, bevor sie den Tabellen traut, und bricht ab, wenn sie nicht mehr stimmen. Aus derselben Zeile wird der Name des Körpers gebildet, auf den sich der Raumbeweis bezieht (karman-nachlass@fx-…): ein Neubau, der eine Zahl ändert, ändert den Körper.
Fallstricke, die der Bau abfängt
- Satzschlüssel.
sent_idxbeginnt auf jeder Seite neu. Ein Satz ist nur durch das Tripel(doc_id, pidx, sent_idx)bestimmt. - Fußnoten. Stanza liest nur
main; der Text einer Fußnote hat keine Sätze im Stanza-Korpus. Fußnoten sind deshalb eigene Evidenzobjekte mit eigenen Wortformen. - Wiederholte Fußnotennummern. Auf einigen Seiten stehen mehrere Fußnotentexte unter derselben Nummer (auf einer Seite neun unter „1“). Die Id trägt dann das Vorkommen:
fn1,fn1.2, … - Abbildungen.
fq_figureshat in dieser Collection keine Zeile. Die Objektart ist deklariert und wird als Lücke gemeldet, nicht still weggelassen. - Absender. 6.899 Briefe haben keinen verzeichneten Absender und auch keinen rohen Namen (
sender_rawist leer); 6.727 von ihnen haben Text. Eine Lesung der Unterschrift wäre eine weitere Quelle, ist aber nicht gebaut.
Neun Collections
Die Filterung läuft auf neun Collections. Vier sind Korrespondenzen, ihr Träger ist der Brief. Wäfler, Kepler und Copernicus sind Bücher und Aufsätze; ihr Träger ist das Dokument.
| Collection | Träger | Dokument | Brief | Seite | Absatz | Satz | Fußnote | Abbildung | Postings | Bau | Träger mit Text |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Kármán-Nachlass | Brief | 1.066 | 15.976 | 38.213 | 482.693 | 663.972 | 4.612 | 0 | 20.196.883 | 20,2 s | 15.799 von 15.976 |
| Hevelius | Brief | 4 | 2.970 | 2.450 | 15.643 | 29.380 | 4.266 | 76 | 1.752.909 | 2,5 s | 534 von 2.970 |
| Euler, Briefwechsel (IVA) | Brief | 8 | 3.393 | 6.294 | 14.479 | 153.669 | 236 | 90 | 4.154.190 | 7,4 s | 194 von 3.393 |
| Pirckheimer | Brief | 1 | 354 | 526 | 0 | 10.492 | 0 | 0 | 228.722 | 0,6 s | 147 von 354 |
| Wäfler, Primärquellen | Dokument | 15 | 0 | 4.198 | 69.613 | 98.015 | 530 | 1.766 | 1.845.269 | 78,4 s | 15 von 15 |
| Wäfler, Sekundärliteratur | Dokument | 15 | 0 | 2.431 | 37.793 | 61.801 | 8.560 | 354 | 2.417.436 | 53,9 s | 15 von 15 |
| Kepler, Gesammelte Werke | Dokument | 27 | 0 | 14.864 | 140.543 | 459.698 | 9.984 | 898 | 14.098.496 | 168,3 s | 27 von 27 |
| Kepler, Sekundärliteratur | Dokument | 18 | 0 | 5.375 | 46.436 | 1.045 | 7.127 | 981 | 1.725.696 | 69,5 s | 18 von 18 |
| Copernicus, Primärquellen | Dokument | 10 | 0 | 3.644 | 37.091 | 79.908 | 3.362 | 287 | 3.074.485 | 47,5 s | 10 von 10 |
„Träger mit Text“ zählt die Träger, die Sätze oder Fußnoten enthalten. Für die anderen bleibt jedes Textblatt unentschieden. Das ist keine Lücke des Baus, sondern die Überlieferung:
- Registerbände tragen keinen Brieftext. Hevelius Tome I (2.436 Briefe) und Euler IVA 1 (2.353 Briefe) verzeichnen Briefe, sie edieren sie nicht. Ihre Seitenangaben zeigen auf den Registereintrag. Der Bau ordnet nur Seiten zu, die eine Collection ausdrücklich als Seiten des Briefs führt (
fq_letter_pages,fq_letter_sentences), nie einen Seitenbereich; sonst stünde der Text des Registers als Text des Briefs im Raum. Das Kopfblattkopf/ueberlieferung/bandtrennt Registerband und Edition. - Euler, Editionsbände. Von den übrigen Bänden ordnet nur IVA 4 (
978-3-0348-0892-7) Seiten zu. 844 Briefe in sechs weiteren Bänden haben im Sidecar keine Seitenzuordnung; das ist eine Lücke des Sidecar-Baus, nicht der Überlieferung, und ihre Textblätter bleiben unentschieden, bis er sie schließt. - Pirckheimer hat im Sidecar weder Satz- noch Seitenzuordnung. Die Hauptdatenbank führt in
letter_pagesdie Seiten von 147 Briefen; die Karte sagtseite.im_brief: haupt:letter_pages, und die Sätze dieser Seiten werden die Sätze des Briefs. Die übrigen 207 Briefe haben hier keinen Text. - Wäfler, Kepler und Copernicus haben kein FQL-Sidecar. Der Bau legt je eine eigene Datenbank an (
waefler-prim_fx.duckdb,kepler-prim_fx.duckdb,kepler-sec_fx.duckdb,copernicus-prim_fx.duckdb): die Dokumente ausbiblio.xmlundpdai-config.json, Absätze, Fußnoten und Abbildungen aus der Seiten-XML mit dem Seitenparser des Sidecar-Baus (ai_lemma_index.sidecar.fql_build._page_rows, derselbe, der die Kármán-Absätze schrieb), die Sätze aus Stanza. Das DokumentWaefler2001hat keinen eigenen Ordner, nur Seiten und Sätze im Stanza-Korpus; es ist ein Träger mit leerem bibliographischem Datensatz. Inkepler-sechat Stanza nur einen Teil der Seiten gelesen; die übrigen Seiten tragen Absätze aus der Seiten-XML, aber keine Sätze. Das Gate bricht ab, wenn ein Objekt ohne Träger bliebe.