Evidenzobjekte

Was ein Beleg sein kann, wo es in DuckDB steht und woher es in der DTD kommt

Veröffentlichungsdatum

8. Oktober 2026

TippEvidenzobjekte in einem Satz

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:

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

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; dazu fx_formen, der Vorrat der gefalteten Wortformen, und fx_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

WarnungWas die Quelle nicht hergibt
  • Satzschlüssel. sent_idx beginnt 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_figures hat 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_raw ist 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 Kopfblatt kopf/ueberlieferung/band trennt 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_pages die Seiten von 147 Briefen; die Karte sagt seite.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 aus biblio.xml und pdai-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 Dokument Waefler2001 hat keinen eigenen Ordner, nur Seiten und Sätze im Stanza-Korpus; es ist ein Träger mit leerem bibliographischem Datensatz. In kepler-sec hat 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.