Die Technik:
Verwandtschaften in einer Textgruppe analysieren
- III.
Auswertung der Daten
In diesem Kapitel wird die Anwendung der zuvor entwickelten Strategie beschrieben
Datenverarbeitungstechnik | Die Daten sammeln und vorbereiten | Die wörtlichen Übereinstimmungen auswerten | Übereinstimmungen in der Inhaltsreihenfolge auswerten |-
Datenverarbeitungstechnik
Eine Datenbank bietet die besten Möglichkeiten, aus den Texten jede Art von Informationen zu gewinnen, auch solche, die für ihre Verwandtschaftsverhältnisse relevant sind. Man kann nämlich mit stärkeren und schnelleren Abfragewerkzeugen auf den Inhalt einer Datenbank zugreifen als auf einfache Textdateien. Die Daten werden bereits Eine Voraussetzung dafür ist bereits die strukturierte Art, wie die Daten abgelegt werden: in Feldern und Zeilen: in Zeilen (auch Datensätze genannt) werden die Werte der verschiedenen Eigenschaften einer Einheit angeordnet, in Feldern Werte derselben Eigenschaft für verschiedene Einheiten. Der Zugriff auf jeden beliebigen Wert ist dann über Feldnamen und Kriterien zur Auswahl bestimmter Datensätze möglich. Ein "relationales" Datenbankmanagementsystem (DMS) speichert zusätzlich Regeln für Beziehungen zwischen Daten in verschiedenen Feldern und Indizes über ausgewählte Felder. Dadurch schützt sie die Integrität der Daten gegenüber Eingabefehlern[#1], und beschleunigt das Suchen.[#2]
[#1] indem sie jeden Versuch verhindert, Daten so hinzuzufügen oder zu verändern, daß die vorgegebenen Regeln verletzt würden.
[#2] Andreas Kelz, Relationale Datenbanken, http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/.
Um die Daten auszuwerten, benutzt man genormte Abfragesprachen, allen voran "Standard Query Language" (SQL). Man gibt in SQL die Felder an, aus denen man Daten abfragen möchte und hat ansonsten praktisch unbegrenzte Möglichkeiten, durch Kriterien die Datensätze einzugrenzen, deren Werte berücksichtigt werden sollen; die gefundenen Werte kann man einzeln anzeigen lassen oder aber gleich ihre Summe, ihren Mittelwert oder was auch immer berechnen lassen; außer zum Abfragen von Daten kann man SQL auch benutzen, um bestimmte Daten zu ändern, zu löschen oder hinzuzufügen.
Ich habe für meine Untersuchung ein relationales DMS benutzt, das mir wie sehr vielen PC-Besitzern als Teil des Microsoft-Office-Softwarepakets nun einmal zur Verfügung gestanden hat: MS Access (in der Version 97). Es wird zwar landläufig nur zur Verwaltung von Kunden- oder Artikeldaten in kleinen und mittelgroßen Unternehmen eingesetzt, hat sich aber, vor allem durch die eingebaute Programmiersprache VBA als an die verschiedensten Erfordernisse der Textuntersuchung (zum Erstaunen auch erfahrener Access-Programmierer) hervorragend anpaßbar erwiesen. Da alle entscheidenden Schritte der Untersuchung aus SQL-Anweisungen bestehen, ist jedoch das ganze Projekt nicht auf MS Access angewiesen sondern ohne Probleme auf andere relationale DMS portierbar.
SALEMANS läßt die Verkettung der Textgruppen übrigens von einer Software namens PAUP durchführen, die in der biologischen Systematik entwickelt worden ist, um die Position von Pflanzen- oder Tierarten in der Entwicklungsgeschichte aufgrund von Ausprägungen einzelner Merkmale zu bestimmen. Dieses Programm ist leider nicht frei erhältlich, die für unsere Zwecke wichtigen Funktionen lassen sich aber in VBA gut nachbauen.
Sind die Texte erst einmal in einer Datenbank, kann man sie nicht nur statistisch auswerten, sondern auch sehr komfortabel nach bestimmten Stellen suchen, die man zum Nachweis von Verwandtschaft benötigt.
-
Die Daten sammeln und vorbereiten
-
Die Texte digitalisieren
Aus Texten, die gedruckt vorliegen, wurden mithilfe eines Scanners und der Texterkennungssoftware FineReader© maschinenlesbare Dokumente hergestellt.[1] Bisher ungedruckte Texte wurden nach Handschriftenfotos oder -Kopien, die die Archive freundlicherweise zur Verfügung gestellt haben per Tastatur in den Computer eingegeben. Für den Import in die Datenbank hätte es genügt, die Texte als txt-Dateien zu speichern. Es wurden jedoch auch Word-Dokumente und html-Versionen davon erzeugt, die letzteren stehen im Internet unter www.mittelalter-hospitaeler.de/editionen als html-Dateien zur Verfügung.
[1] Eine ausführliche Beschreibung dieses Vorgangs geben SAHLE/SCHAßAN, Hansisches UB digital#8276#, im WWW unter http://uk-web2.rrz.uni-koeln.de:8008/projekte/hub/inhalt.htm veröffentlicht, wobei die Idee mit dem selbsterstellten Wörterbuch zur Rechtschreibkontrolle mittelalterlicher Texte (http://uk-web2.rrz.uni-koeln.de:8008/projekte/hub/doku2.htm) aus einem Beitrag von mir in der Mailing-Liste MEDIAEVISTIK vom 23. 2. 2000 stammt. (http://www.uni-bayreuth.de/departments/aedph/2000/0054.html)
-
Eine Datenbank mit den Daten der Texte anlegen
Beim Import in eine neue Datenbank habe ich jeden Text in einer eigenen Tabelle gespeichert. Dieser Vorgang wäre automatisierbar gewesen. Alle Tabellen haben die gleiche Struktur: sie bestehen aus drei Spalten.[2]
Eine enthält die Wörter des Textes in ihrer originalen Reihenfolge, und zwar immer nur ein Wort pro Zeile, so daß jedes Wort als eigener Datensatz behandelt werden kann. Als Datentyp für dieses Feld muß man "Text" wählen, um in dem Feld suchen und nach dem Feldinhat sortieren zu können.
Eine zweite Spalte vom Typ Integer wird als Auto-Wert-Feld angelegt. In ihr wird bei Einfügung des Textes zu jedem Wort automatisch eine eindeutige Identifikationsnummer erzeugt, beim ersten Wort mit 1 beginnend und von Wort zu Wort um 1 ansteigend. Die eindeutige Numerierung der Wörter hält deren originale Reihenfolge fest,[3] und sie erlaubt es, die Position jedes Worts im Kontext durch Zahlen auszudrücken. Die Länge einer übereinstimmenden Wortfolge zum Beispiel läßt sich mit Hilfe der Nummern als Differenz aus der Nummer des letzten und ersten Worts bestimmen.
In einer dritten Spalte habe ich im Anschluß an den Import durch eine besondere Prozedur zu jeden Wort ein Synonym hinzufügen lassen, das dieses Wort in vereinheitlichter Schreibweise darstellt. Beim Vergleich werden anstelle der originalen Wörter diese Synonyme verglichen, damit die orthographische Vielfalt der mittelalterlichen Texte das Erkennen gleicher Wörter nicht beeinträchtigt.[4]
-
-
Die wörtlichen Übereinstimmungen auswerten
-
Wortfolgenkonkordanzen finden
Dazu habe ich eine Prozedur geschrieben, die folgende Arbeitsschritte erldigt:
Sie öffnet der Reihe nach alle möglichen Paare von Text-Tabellen, um jeden Text einmal mit jedem zu vergleichen.[5]
Aus allen diesen Textpaaren bildet sie zunächst das Kreuzprodukt aus den Wörtern beider Texte),[6] das heißt sie kombiniert jedes Vorkommen jedes Wortes in dem einen Text (definiert durch die laufende Nummer des Worts) mit jedem in dem anderen Text. Alle jene Wortpaare, deren beide Hälften gleich sind, speichert sie mit den zugehörigen Wort-Nummern in einer Hilfstabelle, die, nachdem sie ihren Zweck erfüllt hat. wieder gelöscht wird.
Diese "Einzelwörterkonkordanzen" dienen als Datengrundlage bei der Suche nach längeren Folgen übereinstimmender Wörter. Von jedem der Paare in der Liste der Einzelwörterkonkordanzen ausgehend, wird gefragt, ob auch die jeweils darauffolgenden Wörter (also die Wörter mit der nächstgrößeren Wort-Nummer) in derselben Liste stehen. Wenn sie in beiden Texten gleich sind, muß das der Fall sein. In diesem Fall wird die Frage bezüglich der nächsten beiden Wörter wiederholt, so lang, bis die Übereinstimmung aufhört. Dann werden der Wortlaut der Wortfolgenkonkordanz und die Anfangs- und Endpositionen aus beiden Texten in einer Tabelle "Wortfolgenkonkordanzen" abgelegt. Das Wortpaar in der Einzelwörterkonkordanzenliste, von dem die Suche ausgegangen war, wird nun als erledigt gelöscht und die nächste Suche beginnt beim nächsten Wortpaar.
Man kann in diese Suchprozedur noch eine gewisse Fehlertoleranz einbauen, indem man programmiert: falls eine Übereinstimmung nur durch ein Paar (einstellbar wären auch 2, 3 ? Paare) verschiedener Wörter unterbrochen wird und beim nächsten Wortpaar weitergeht, soll bei dem ungleichen Wortpaar nicht abgebrochen werden. In der Ergebnistabelle soll es durch Auslassungspunkte kenntlich gemacht werden. Ich habe den Vergleich mit dieser Einstellung durchgeführt, um die Gefahr der Verfälschung des Ergebnisses durch bloß orthographische Abweichungen oder geringe sprachliche Freiheiten noch weiter zu minimieren. Will man die Ergebnisse ohne diese unvollständigen Übereinstimmungen sehen, ist es später ein Leichtes, sie auszublenden.[7]
Als Ergebnis der Datenerfassung habe ich eine Tabelle mit 290510 Wortfolgenkonkordanzen erhalten.
-
Daten der Wortfolgenkonkordanzen normalisieren
Diese Tabelle zeigt jeden Konkordanzfund mit dem Textpaar, in dem er vorkommt, für sich an. Das ist noch nicht ganz der Gesamtüberblick über die Beziehungen zwischen Wortfolgen und Texten, den ich brauche, um Textgruppen anhand der Wortfolgen (anstelle der Varianten in Salemans' Verfahren) als Kriterium bilden zu können.
Zu jeder Wortfolge sollen also alle Texte, in denen sie vorkommt, angezeigt werden und zu jedem Text alle Wortfolgen, die er mit andern gemeinsam hat. Durch ein paar Datenumformungen ist das jetzt leicht zu erreichen. Beim Suchen nach Wortfolgenkonkordanzen geich jeden Fund daraufhin zu prüfen, ob die Wortfolge neu oder schon in anderen Texten gefunden worden ist, hätte die Such-Prozedur übermäßig belastet, das Erkennen von Wortfolgen-Duplikaten ist nämlich recht aufwendig, müssen doch orthographische Varianten auch hierbei ausgeschlossen bleiben.
Deswegen will ich die in der Tabelle "Wortfolgenkonkordanzen" enthaltenen RohDaten "normalisieren", indem ich sie in drei miteinander verknüpfte Tabellen verteile: In einer sollen nur die wirklich verschiedenen Texte stehen, in einer anderen nur die wirklich verschiedenen Wortfolgen und eine dritte soll als Verknüpfungstabelle darüber Auskunft geben, zu welchen Texten welche Wortfolgen gehören. So wird das Tabellenvolumen verkleinert, die Abfragegeschwindgkeit gesteigert, und die Eindeutigkeit der Daten gesichert, denn die Verknüpfungstabelle akzeptiert nur noch Verweise auf eindeutigen Datensätze der Text- und der Wortfolgentabelle - und dazu die Incipit- und Explicit-Nummern.[8]
1. Die eindeutige Text-Tabelle habe ich bereits beim Textimport angelegt.
2. Eine eindeutige Wortfolgentabelle erhalte ich mit Hilfe eines "INSERT-INTO"-SQL-Statements aus der Tabelle mit den Wortfolgenkonkordanzen. Dabei muß jedoch verhindert werden, daß Duplikate oder orthographische Synonyme von Wortfolgenkonkordanzen in die neue Tabelle übertragen werden. Um orthographische Synonyme zu erkennen, wende ich dieselbe Methode an wie beim Finden der Wortfolgenkonkordanzen: In einer neuen Spalte füge ich das SoundEx-Synonym der jeweiligen Wortfolge hinzu.[9] Die drei Auslassungspunkte, die beim Aufzeichnen der Wortfolgenkonkordanzen gesetzt worden sind, wo zwei Texte in einem einzigen Wort inmitten einer längeren Wortfolgenkonkordanz voneinander abweichen, ersetze ich in den Synonymen durch einen "Regulären Ausdruck", der ein beliebiges Wort vertritt.[10] Nach diesen Synonymen gruppiere ich dann die gesamte Tabelle. Nur den jeweils ersten Wert jeder Gruppe übertrage ich in die neue Tabelle.[11] Da ich die Wortfolgen in Zukunft nicht mehr sortieren oder durchsuchen brauche, brauche ich als Felddatentyp jetzt nicht mehr "Text" mit der Längenbeschränkung auf 255 Zeichen zu wählen und kann den Wortlaut derer, die bisher unvollständig eingetragen waren, vervollständigen. Es zeigt sich, daß es 10.518 verschiedene Wortfolgen gibt, die in mindestens 2 Texten vorkommen.
Abschließend füge ich der neuen Tabelle schon jetzt ein Feld hinzu, in dem ich die Länge der Wortfolge in Wörtern berechnen lasse (aus der Differenz von Explicit- und Incipit-Wortnummer in der alten Tabelle),[12] das spart später Rechenleistung. Die Längen liegen zwischen 485 und 2 Wörtern.
3. Nun ist noch aus der Tabelle "Wortfolgenkonkordanzen" eine Tabelle "WortfolgenUndTexte" zu erstellen, die in einer Spalte Texte und in der anderen die darin vorkommenden Wortfolgen zeigen soll, dazu noch 2 Spalten für Anfangs- und Endwortnummer der Wortfolge in dem Text.
Dazu füge ich der alten Tabelle zunächst ein numerisches Feld "Wortfolge_Nr" hinzu, das das Textfeld "Wortfolge" ersetzen soll. Nun verknüpfe ich die Felder "Synonym" in beiden Tabellen miteinander und setze daraufhin alle Werte im Feld "Wortfolge_Nr" in der alten Tabelle auf die Werte der Wortfolgennummer in der neuen Tabelle.[13] Schließlich ändere ich die Beziehung zur Wortfolgenkonkordanzen-Tabelle dahin, daß sie statt der Synonym-Felder die beiden Wortfolge_Nr-Felder umfaßt. Von der Tabelle Wortfolgenkonkordanzen aus kann nun über den Verweis auf die eindeutigen Wortfolgen in der neuen Tabelle zugegriffen werden, was man durch eine Abfrage testen kann.[14] Die Felder "Wortfolgen" und "Synonym" in der alten Tabelle sind jetzt überflüssig geworden, und ich könnte sie löschen , wenn ich nicht die alte Tabelle sowieso durch eine neue Grundtabelle "WortfolgenUndTexte" ersetzen würde.
Danach kann ich aus "Text1" und "Text2" der Wortfolgenkonkordanzen-Tabelle durch eine UNION-Abfrage eine einzige Spalte "Text" bilden[14] und daraus die neue Grundtabelle erstellen,[15] die künftig "Wortfolgenkonkordanzen" ersetzen soll. Dies ist eine Tabelle mit nur noch 53.530 Datensätzen gegenüber den mehr als 290.000 in "Wortfolgenkonkordanzen".
-
Textgruppen finden und ihre Daten normalisieren
Zu jeder Wortfolge in dieser Tabelle "WortfolgenUndTexte" kann ich nun durch eine ganz einfache Abfrage alle Texte finden, die sie überliefern.[16] Das sind die gesuchten Textgruppen. Da sich die Daten nicht mehr ändern, kann ich die Textgruppen fest in eine neue Tabelle "Textgruppen" schreiben; das spart bei künftigen Berechnungen Rechenleistung.[17] Ich frage zu jeder Wortfolge aus der Tabelle "Wortfolgen" die zugehörigen Text-Nummern als alphabetisch sortierte Aufzählung ab und fülle damit die zweite Spalte der neuen Tabelle, in der ersten sollen die Textgruppen eindeutig numeriert werden. Fast alle Textgruppen verdanken sich nicht nur einer sondern mehreren Wortfolgenkonkordanzen, daher gibt es unter ihnen noch Duplikate, die sich aber leicht ausblenden lassen. In einer zusätzlichen Spalte der Tabelle "Wortfolgen" verweise ich dann auf die Nummern der zugehörigen Textgruppen.
Die Zahl der zugehörigen Texte und die Nummern der zugrundeliegenden gemeinsamen Wortfolgen ebenfalls als sortierte Zeichenkette kann ich nun dank der Beziehungen zwischen den Tabellen problemlos feststellen und in zusätzliche Spalten der Textgruppen-Tabelle eintragen lassen.[18]
Um die Textgruppen nun gleich zu einer Kette zusammensetzen zu können, muß zuvor bekannt sein, welche Textgruppen Teilmengen von anderen sind. Das herauszufinden ist wieder etwas aufwendiger, es geht nicht per SQL-Befehl, sondern nur mithilfe einer Prozedur. Die vergleicht jede Textgruppe mit allen anderen, die größer sind als sie selbst, und sucht aus diesen alle heraus, in denen sämtliche Mitglieder der kleineren enthalten sind. Sie legt ihre Ergebnisse (Textgruppe_Nr und Nummer der möglichen Vater-Textgruppe) in der neuen Tabelle "Textgruppenbeziehungen" ab.
Die gleiche Prozedur habe ich auch auf die Wortfolgen angewendet, um auch von diesen zu wissen, welche kürzeren möglicherweise Teilstücke von längeren sind (wobei natürlich die Reihenfolge der Wörter zu berücksichtigen war).
Abbildung 1 gibt nun einen Überblick über alle Tabellen, wie sie als Ergebnis der Normalisierung und Feststellung der internen Beziehungen zwischen Textgruppen und Wortfolgen miteinander verknüpft sind. Die Zeichen "1" und "∞" an den Enden der Beziehungslinien charakterisieren die verschiedenen Seiten von 1:n-Beziehungen, also Beziehungen, die genau einen Datensatz in der einen Tabelle mit einem oder mehreren Datensätzen in der anderen verknüpfen. Für alle diese 1:n-Beziehungen stellt das DMS übrigens die "referentielle Integrität" sicher, das heißt, es wacht darüber, daß auf der n-Seite kein Wert eingetragen wird, der auf der 1-Seite nicht schon vorhanden sind.
-
Verwandtschaftswahrscheinlichkeiten berechnen
Die Verwandtschaftswahrscheinlichkeit und noch einige zusätzliche Kenndaten zu ihr erhalte ich nun sehr leicht durch Abfragen, die die Beziehungen zwischen den Tabellen nutzen, um pro Textgruppe die Daten der zugehörigen Wortfolgen[19] und der zugehörigen Texte[20] auszuwerten und beides zusammenfügen.[21]
Es ergeben sich für die Verwandtschaftswahrscheinlichkeit Werte von 0,964 bis 0,00286. Die Gesamtkonkordanzenlänge schwankt zwischen 6743 und 2. Die Anzahl Wortfolgenkonkordanzen liegt zwischen 594 und 1. Die grösste Wortfolgenkonkordanzlänge reicht von 485 bis 2, die kleinste von 47 bis 2 und die mittlere von 102,231 bis 2.
Die Textgruppe mit der größten Gesamkonkordanzenlänge hat auch die meisten Wortfolgenkonkordanzen sowie insgesamt die höchste Verwandtschaftswahrscheinlichkeit: Roma S. Spirito 1316—Roma S. Spirito 1564. Die Textguppe mit der längsten Wortfolgenkonkordanz hat auch die höchste mittlere Wortfolgenkonkordanzlänge: Bruxelles 1211—Bruxelles 1223.
-
Ketten verwandter Texte erstellen
Damit ist alles vorbereitet für die Rekonstruktion der Verwandtschafts-Ketten Ich beginne mit den kleinsten Textgruppen und beziehe nach und nach immer größere ein. Komme ich zu einer Textgruppe, die ganz neu ist, lasse ich sie unten hinzufügen; steht eines ihrer Elemente bereits in der Liste, füge ich diese Gruppe nicht unten an, sondern verbinde das oder die noch nicht vorhandenen Elemente direkt mit dem schon vorhandenen. Soweit folge ich der Vorgehensweise SALEMANS'.
Anders als er, bewerte ich aber die Textgruppen nach ihrer Verwandtschaftswahrscheinlichkeit. Die Liste, aus der ich die Textgruppen an die Kette anfüge, habe ich außer nach zunehmender Gruppengröße auch nach abnehmender Verwandtschaftswahrscheinlichkeit sortieren lassen.
Das Zusammenfügen der Kette wäre sicher auch völlig automatisierbar, da es sich bei mir aber nur um 55 Texte handelt, mache ich es "halbautomatisch".
Alle 55 Texte lassen sich aus Zweier-Textgruppen einfügen;[22] größere Textgruppen brauche ich also gar nicht zu berücksichtigen. Um jeden Text entsprechend seiner größten Verwandtschaftswahrscheinlichkeit nur einmal an die Kette anzufügen, lasse ich mir also eine nach fallender Verwandtschaftswahrscheinlichkeit sortierte Liste der Zweier-Textgruppen anzeigen, in der jeder Text nur einmal vorkommt und zu jedem Text nur die Textgruppe mit der höchsten Verwandtschaftswahrscheinlichkeit angezeigt wird. In dieser Liste lasse ich Textgruppen, die völlig neu sind, an ihrem Platz stehen, aber Textgruppen, von denen ein Element bereits weiter oben vorgekommen ist, verschiebe ich unter die Textgruppe, zu denen sie gehören und rücke sie dort um einen Tabulatorschritt ein.
Das führt nicht zu einer zusammenhängenden Kette, sondern zu 8 Teilketten.
-
-
Übereinstimmungen in der Inhaltsreihenfolge auswerten
Dieser prinzipiell wichtige Arbeitsschritt ist vorerst hintangestellt. Verschiedensprachige Texte habe ich zunächst noch nicht in den Vergleich einbezogen, und die Struktur der Beziehungen zwischen den lateinischen hat sich auf Grundlage der Wortfolgenkonkordanzen bereits so gut aufklären lassen, daß es genügt, im folgenden an einigen wenigen "neuralgischen" Stellen, an die die Ergebnisse der Wortfolgenkonkordanz-Untersuchung hinführen, auch nach der Inhaltsreihenfolge zu sehen, um die Entstehungsgeschichte dieser Texte aufzuklären. Dafür ist keine Untersuchung der Kapitelfolgenkonkordanzen aller Texte nötig. Die Einbeziehung auch der volkssprachlichen Hospitalregeltexte ist demnächst geplant.
-




-Symbol bei einem Zitat in Kurzform unter '(Grafik-)Eigenschaften' den direkten Link zum vollständigen Titel bietet.
Mit noch nicht voll HTML-4-fähigen Browsern (wie dem MS IE) finden Sie diese Angaben im