diff --git a/authorship_attribution_lb/notebooks/00_setup_guide.ipynb b/authorship_attribution_lb/notebooks/00_setup_guide.ipynb
index 1a7605ef74f0270a854b22561bd0b81baef2dc9d..d9b2a4ff7d5398bb13e835f6443e753c3f25b4a1 100644
--- a/authorship_attribution_lb/notebooks/00_setup_guide.ipynb
+++ b/authorship_attribution_lb/notebooks/00_setup_guide.ipynb
@@ -4,10 +4,13 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "Installing Python and required libraries\n",
-    "Setting up a working environment\n",
-    "Basic Jupyter notebook usage\n",
-    "Loading and accessing the course materials"
+    "Introduction to Jupyter Lab and Markdown.\n",
+    "- Dateibrowser\n",
+    "- Tabs und Kernels\n",
+    "- Gliederungsansicht\n",
+    "- Edit & Command Mode\n",
+    "Introduction to Arbeitsumgebungen:\n",
+    "- conda und venv"
    ]
   }
  ],
diff --git "a/authorship_attribution_lb/notebooks/01_einf\303\274hrung.ipynb" "b/authorship_attribution_lb/notebooks/01_einf\303\274hrung.ipynb"
index d95325c93b7f3ee5765ca7b50a29a58f86dadc18..114d008aeffe036d324ecbbc426614c9810e4f69 100644
--- "a/authorship_attribution_lb/notebooks/01_einf\303\274hrung.ipynb"
+++ "b/authorship_attribution_lb/notebooks/01_einf\303\274hrung.ipynb"
@@ -4,34 +4,55 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "# Einführung in die Autorschaftsattribution\n",
-    "\n",
-    "## Lernziele\n",
-    "Nach Abschluss dieses Notebooks können Sie:\n",
-    "- Das Konzept und die Anwendungsbereiche der Autorschaftsattribution erklären\n",
-    "- Die historische Entwicklung der computergestützten Autorschaftsanalyse nachvollziehen\n",
-    "- Grundlegende stilometrische Merkmale verstehen\n",
-    "- Textdateien in Python einlesen und verarbeiten\n",
-    "- Einfache Textanalysen durchführen und visualisieren\n"
+    "# Einführung in Authorship Attribution\n",
+    "\n",
+    "Eine wichtige Aufgabe der historischen Quellenkritik ist es, die Autor:innen der Quellen zu identifizieren. Oftmals ist dies jedoch nicht zweifelsfrei möglich. In solchen Fällen müssen vergleichende stilistische Analysen durchgeführt werden, um etwaige Anhaltspunkte zu erfassen und kritisch auszuwerten, die Rückschlüsse auf mögliche Autorenschaften des Textes erlauben.\n",
+    "\n",
+    "Die computergestützte Autorschaftsattribution bietet uns heute die Möglichkeit, diese Analysen automatisiert und unter weitgehendem Ausschluss persönlicher Intuitionen oder Vorannahmen durchführen zu können. Die Texte werden dabei in ihre Einzelteile zerlegt und u.a. mit Hilfe der Verfahren des unüberwachten Maschinellen Lernens analysiert.\n",
+    "\n",
+    "In diesem Notebook werden Sie:\n",
+    "- Die Grundlagen der Autorschaftsattribution kennenlernen\n",
+    "- Erste praktische Erfahrungen mit der computergestützten Textanalyse sammeln\n",
+    "- Verstehen, wie Texte für die maschinelle Verarbeitung vorbereitet werden"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Grundkenntnisse\n",
+    "\n",
+    "Für dieses Notebook werden grundlegende Python-Kenntnisse vorausgesetzt, insbesondere:\n",
+    "- Verständnis von Variablen und Datentypen\n",
+    "- Arbeit mit Listen und Dictionaries\n",
+    "- Grundlegende Kontrollstrukturen (if/else, Schleifen)\n",
+    "- Funktionsdefinitionen\n",
+    "\n",
+    "Wenn Sie diese Konzepte auffrischen oder neu lernen möchten, empfehlen wir das [Python für Historiker:innen Jupyter Book](https://digital-history-berlin.github.io/Python-fuer-Historiker-innen/home.html). Nach Durcharbeiten der dort vermittelten Grundlagen können Sie mit diesem Notebook fortfahren."
    ]
   },
   {
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "## 1. Was ist Autorschaftsattribution?\n",
+    "## 1. Was ist Authorship Attribution?\n",
     "\n",
-    "Autorschaftsattribution ist die wissenschaftliche Untersuchung von Texten mit dem Ziel, deren Verfasser:innen zu identifizieren. Die Methode basiert auf der Annahme, dass Autor:innen charakteristische Schreibstile haben, die sich quantitativ erfassen und vergleichen lassen.\n",
+    "Authorship Attribution oder Autorschaftsattribution ist die wissenschaftliche Untersuchung von Texten mit dem Ziel, deren Verfasser:innen zu identifizieren. Die Methode basiert auf der Annahme, dass Autor:innen charakteristische Schreibstile haben, die sich quantitativ erfassen und vergleichen lassen. Wir sprechen konkret über die mit Mitteln der Statistik durchgeführte stilometrische Analyse zur Identifikation von unbekannten und unklaren Autorenschaften.\n",
     "\n",
     "### Ein historisches Beispiel: Die Federalist Papers\n",
     "\n",
-    "Die Federalist Papers sind ein Schlüsselbeispiel für die Entwicklung der Autorschaftsattribution:\n",
+    "Die Federalist Papers stellen einen Meilenstein in der Geschichte der Autorschaftsattribution dar. Diese Sammlung von 85 Essays wurde zwischen 1787 und 1788 unter dem Pseudonym \"Publius\" veröffentlicht. Sie dienten der Unterstützung der Ratifizierung der US-Verfassung und wurden von Alexander Hamilton, James Madison und John Jay verfasst.\n",
+    "\n",
+    "Während die Autorschaft der meisten Essays bekannt war, gab es bei 12 Texten jahrzehntelange Debatten darüber, ob sie von Hamilton oder Madison stammten. Diese Kontroverse wurde erst 1964 durch die bahnbrechende Arbeit von Frederick Mosteller und David Wallace gelöst. Sie verwendeten erstmals computergestützte statistische Methoden für die Autorschaftsattribution und konnten mit hoher Wahrscheinlichkeit Madison als Autor identifizieren.\n",
     "\n",
-    "- Sammlung von 85 Texten zur politischen Theorie (1787-1788)\n",
-    "- Verfasst von Alexander Hamilton, James Madison und John Jay unter dem Pseudonym \"Publius\"\n",
-    "- Zentral für die Ratifizierung der US-Verfassung\n",
-    "- Jahrzehntelange Debatten über die Autorschaft einzelner Texte\n",
-    "- Erst 1964 durch computergestützte Analyse weitgehend geklärt"
+    "Ihre Methodik basierte auf:\n",
+    "- Statistischer Analyse von Wortverwendungen\n",
+    "- Bayesscher Wahrscheinlichkeitstheorie\n",
+    "- Vergleich mit bekannten Texten der Autoren\n",
+    "\n",
+    "Diese Arbeit gilt als Grundstein der modernen computergestützten Autorschaftsattribution.\n",
+    "\n",
+    "[Quelle: Mosteller & Wallace (1964): Inference and Disputed Authorship: The Federalist]"
    ]
   },
   {
@@ -40,26 +61,29 @@
    "source": [
     "## 2. Erste praktische Schritte\n",
     "\n",
-    "### Einlesen der Textdaten"
+    "*Text zur Einführung in die Schritte, mit Erklärung welche Daten wir hier benutzen und dem Vermerk das ihr gerne eigene .txt Dateien benutzen könnt*\n",
+    "\n",
+    "### Einlesen der Textdaten\n",
+    "\n",
+    "Für unsere Analyse verwenden wir Textdateien (*.txt). Diese haben mehrere Vorteile:\n",
+    "- Einfaches, universelles Format\n",
+    "- Plattformunabhängig\n",
+    "- Keine versteckten Formatierungen\n",
+    "- Geringer Speicherbedarf\n",
+    "\n",
+    "Die Textdateien in unserem Datensatz stammen aus dem frühen 19. Jahrhundert und enthalten Reiseberichte von Goethe und Humboldt. \n",
+    "\n",
+    "Möchten Sie eigene Texte analysieren? Sie können Dokumente aus anderen Formaten (z.B. PDF, DOCX) in TXT konvertieren:\n",
+    "- Mit kostenlosen Tools wie Pandoc (https://pandoc.org)\n",
+    "- Über Online-Konverter\n",
+    "- Durch Copy & Paste in einen einfachen Texteditor"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Erste 100 Zeichen des Goethe-Texts:\n",
-      "Den 23. August 1792.\n",
-      "\n",
-      "Gleich nach meiner Ankunft in Mainz besuchte ich Herrn von Stein den\n",
-      "Älteren, \n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "# Texte einlesen\n",
     "with open('../data/sitzung_1/goethe.txt', 'r', encoding='utf8') as f:\n",
@@ -68,7 +92,7 @@
     "with open('../data/sitzung_1/humboldt.txt', 'r', encoding='utf8') as f:\n",
     "    humboldt = f.read()\n",
     "\n",
-    "# Kurzer Einblick in den Text\n",
+    "# Kurzer Einblick in den Text zur verifizierung\n",
     "print(\"Erste 100 Zeichen des Goethe-Texts:\")\n",
     "print(goethe[:100])"
    ]
@@ -77,22 +101,16 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "### Texte in einer Liste speichern"
+    "### Texte in einer Liste speichern\n",
+    "\n",
+    "Nun speichern wir unsere beiden Texte in eine Liste damit wir auf diese gleichzeitig zugreifen können."
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Anzahl der Texte in der Liste: 2\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "# Liste für alle Texte erstellen\n",
     "text_list = []\n",
@@ -110,28 +128,49 @@
    "source": [
     "### Tokenisierung und Textbereinigung\n",
     "\n",
-    "Ein wichtiger Schritt der Textanalyse ist die Tokenisierung - die Zerlegung des Texts in einzelne Wörter:\n"
+    "Die Tokenisierung ist ein fundamentaler Schritt in der digitalen Textanalyse. Dabei werden Texte in bedeutungstragende Einheiten - die \"Tokens\" - zerlegt. In den einfachsten Fällen entspricht ein Token einem Wort, aber es gibt verschiedene Ansätze zur Tokenisierung:\n",
+    "\n",
+    "#### Arten der Tokenisierung:\n",
+    "\n",
+    "1. **Wort-Tokenisierung** (die wir hier verwenden)\n",
+    "   - Zerlegung am Leerzeichen\n",
+    "   - Behandlung von Satzzeichen\n",
+    "   - Umgang mit Zahlen und Sonderzeichen\n",
+    "\n",
+    "2. **Zeichen-Tokenisierung**\n",
+    "   - Zerlegung in einzelne Buchstaben\n",
+    "   - Wichtig für bestimmte stilometrische Analysen\n",
+    "\n",
+    "3. **N-Gram Tokenisierung**\n",
+    "   - Sequenzen von n aufeinanderfolgenden Zeichen oder Wörtern\n",
+    "   - Beispiel: \"Der Hund\" → [\"Der\", \"er \", \"r H\", \" Hu\", \"Hun\", \"und\"]\n",
+    "\n",
+    "Falls ihr mehr zu Tokenisierung lernen wollt, empfehlen wir Hvitfeldt & Silge (2022): Supervised Machine Learning for Text Analysis in R, [Kapitel 2](https://smltar.com/tokenization).\n",
+    "\n",
+    "#### Herausforderungen der Tokenisierung:\n",
+    "\n",
+    "- **Zusammengesetzte Wörter**: \"Dampfschifffahrtsgesellschaft\" - ein Token oder mehrere?\n",
+    "- **Interpunktion**: Wie behandeln wir Bindestriche, Apostrophe?\n",
+    "- **Großschreibung**: Sollen alle Tokens kleingeschrieben werden?\n",
+    "- **Zahlen und Sonderzeichen**: Behalten oder entfernen?\n",
+    "\n",
+    "In unserem Beispiel verwenden wir eine einfache, aber effektive Tokenisierungsstrategie:"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "\n",
-      "Erste 10 Tokens aus dem Goethe-Text:\n",
-      "['den', '23', 'august', '1792', 'gleich', 'nach', 'meiner', 'ankunft', 'in', 'mainz']\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "def tokenize_and_clean(text):\n",
     "    \"\"\"\n",
-    "    Tokenisiert einen Text und entfernt Satzzeichen.\n",
+    "    Tokenisiert einen Text und bereinigt die Tokens.\n",
+    "    \n",
+    "    Diese Funktion:\n",
+    "    1. Zerlegt den Text an Leerzeichen\n",
+    "    2. Entfernt Satzzeichen\n",
+    "    3. Konvertiert alles zu Kleinbuchstaben\n",
     "    \n",
     "    Args:\n",
     "        text (str): Eingabetext\n",
@@ -139,7 +178,7 @@
     "    Returns:\n",
     "        list: Liste der bereinigten Tokens\n",
     "    \"\"\"\n",
-    "    # Definition der Satzzeichen die entfernt werden sollen\n",
+    "    # Definition der zu entfernenden Satzzeichen\n",
     "    puncts = '\",.!?-:;_'\n",
     "    \n",
     "    # Text in Wörter zerlegen\n",
@@ -154,40 +193,98 @@
     "        for punct in puncts:\n",
     "            token = token.replace(punct, '')\n",
     "        # Zu Kleinbuchstaben konvertieren und zur Liste hinzufügen\n",
-    "        clean_tokens.append(token.lower())\n",
+    "        # Leere Tokens werden nicht hinzugefügt\n",
+    "        if token:\n",
+    "            clean_tokens.append(token.lower())\n",
     "        \n",
     "    return clean_tokens\n",
     "\n",
     "# Beispiel mit Goethe-Text\n",
     "tokens_goethe = tokenize_and_clean(goethe)\n",
+    "tokens_humboldt = tokenize_and_clean(humboldt)\n",
     "print(\"\\nErste 10 Tokens aus dem Goethe-Text:\")\n",
-    "print(tokens_goethe[:10])\n"
+    "print(tokens_goethe[:10])\n",
+    "print(\"\\nErste 10 Tokens aus dem Humboldt-Text:\")\n",
+    "print(tokens_humboldt[:10])\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "#### Alternative Tokenisierungsansätze\n",
+    "\n",
+    "Für fortgeschrittene Analysen gibt es spezialisierte Tokenisierer:\n",
+    "\n",
+    "1. **NLTK (Natural Language Toolkit)**\n",
+    "   - Reich an Funktionen für verschiedene Sprachen\n",
+    "   - Berücksichtigt sprachspezifische Regeln\n",
+    "\n",
+    "2. **spaCy**\n",
+    "   - Moderne NLP-Bibliothek\n",
+    "   - Sehr schnell und präzise\n",
+    "   - Unterstützt viele Sprachen inkl. Deutsch\n",
+    "\n",
+    "3. **Specialised Historical Tokenizer**\n",
+    "   - Angepasst an historische Texte\n",
+    "   - Berücksichtigt historische Schreibweisen\n",
+    "   - Behandelt Variationen in der Orthographie\n",
+    "\n",
+    "In späteren Sitzungen werden wir fortgeschrittenere Tokenisierungsmethoden kennenlernen und deren Vor- und Nachteile diskutieren.\n",
+    "\n",
+    "#### Warum diese einfache Tokenisierung für unseren Zweck?\n",
+    "\n",
+    "Für die grundlegende Autorschaftsattribution ist unsere einfache Tokenisierung ausreichend, weil:\n",
+    "- Sie transparent und nachvollziehbar ist\n",
+    "- Die grundlegenden Textmerkmale erhalten bleiben\n",
+    "- Sie robust gegenüber verschiedenen Textarten ist\n",
+    "- Die Vergleichbarkeit zwischen Texten gewährleistet ist"
    ]
   },
   {
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "### Wortlängenanalyse\n",
+    "### Wortlängenanalyse: Von Mendenhall zur modernen Stilometrie\n",
+    "\n",
+    "Die Analyse von Wortlängen ist eine der ältesten Methoden der quantitativen Textanalyse. T.C. Mendenhall führte 1887 erstmals systematische Untersuchungen durch, bei denen er Wortlängenverteilungen als \"charakteristische Kurven\" verschiedener Autoren identifizierte.\n",
+    "\n",
+    "#### Historischer Kontext\n",
+    "\n",
+    "Mendenhalls Pionierarbeit basierte auf der Hypothese, dass Autor:innen unbewusst bestimmte Wortlängen bevorzugen. Seine Methode:\n",
+    "- Zählung der Buchstaben in jedem Wort\n",
+    "- Erstellung von Häufigkeitsverteilungen\n",
+    "- Vergleich der resultierenden Kurven\n",
+    "\n",
+    "Mendenhall untersuchte unter anderem:\n",
+    "- Werke von Shakespeare und Bacon\n",
+    "- Texte von Charles Dickens\n",
+    "- Übersetzungen verschiedener Sprachen\n",
+    "\n",
+    "[Siehe: Mendenhall (1887): The characteristics curves of composition. & Mendenhall (1901): A mechanical solution of a literary problem.]\n",
+    "\n",
+    "#### Grenzen der Methode\n",
+    "\n",
+    "Die Wortlängenanalyse allein ist für eine zuverlässige Autorschaftsattribution nicht ausreichend:\n",
+    "- Zu grobe Messung des Schreibstils\n",
+    "- Abhängigkeit von Genre und Thema\n",
+    "- Keine Berücksichtigung des Wortschatzes\n",
+    "- Mögliche Verfälschung durch Editionspraktiken\n",
     "\n",
-    "Eine der einfachsten aber effektiven Methoden der Stilometrie ist die Analyse der Wortlängen:\n"
+    "Dennoch ist sie als Teil eines größeren Methodensets wertvoll, besonders für:\n",
+    "- Erste explorative Analysen\n",
+    "- Schnelle Überblicksgewinnung\n",
+    "- Kombination mit anderen Merkmalen\n",
+    "\n",
+    "[Quelle: Zheng & Jin (2022): Is word length inaccurate for authorship attribution]\n",
+    "#### Praktische Umsetzung"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "\n",
-      "Wortlängenverteilung bei Goethe:\n",
-      "{0: 18, 1: 44, 2: 3944, 3: 14607, 4: 6544, 5: 6307, 6: 6113, 7: 3861, 8: 3412, 9: 2622, 10: 2109, 11: 1674, 12: 1123, 13: 726, 14: 393, 15: 209, 16: 160, 17: 49, 18: 54, 19: 22, 20: 12, 21: 9, 22: 5, 23: 1, 24: 3, 25: 1, 26: 3}\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "from collections import Counter\n",
     "\n",
@@ -209,8 +306,23 @@
     "\n",
     "# Analyse für Goethe durchführen\n",
     "goethe_lengths = analyze_word_lengths(tokens_goethe)\n",
+    "humboldt_lengths = analyze_word_lengths(tokens_humboldt)\n",
     "print(\"\\nWortlängenverteilung bei Goethe:\")\n",
-    "print(dict(sorted(goethe_lengths.items())))\n"
+    "print(dict(sorted(goethe_lengths.items())))\n",
+    "print(\"\\nWortlängenverteilung bei Humboldt:\")\n",
+    "print(dict(sorted(humboldt_lengths.items())))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# zur Verifizierung schauen wir uns die längsten Tokens genau an\n",
+    "longest_tokens = sorted(tokens_goethe, key=len, reverse=True)[:5]\n",
+    "print(\"Die 5 längsten Tokens aus dem Goethe-Text:\")\n",
+    "print(longest_tokens)"
    ]
   },
   {
@@ -229,31 +341,107 @@
    "outputs": [],
    "source": [
     "import matplotlib.pyplot as plt\n",
-    "%matplotlib inline\n",
     "\n",
-    "def plot_word_lengths(lengths, title):\n",
+    "# Vergleichende Visualisierung\n",
+    "def plot_comparative_lengths(lengths1, lengths2, author1=\"Goethe\", author2=\"Humboldt\"):\n",
     "    \"\"\"\n",
-    "    Visualisiert die Wortlängenverteilung.\n",
-    "    \n",
-    "    Args:\n",
-    "        lengths (Counter): Gezählte Wortlängen\n",
-    "        title (str): Titel für den Plot\n",
+    "    Erstellt einen vergleichenden Plot der Wortlängenverteilungen.\n",
     "    \"\"\"\n",
+    "    plt.figure(figsize=(12, 6))\n",
+    "    \n",
     "    # Daten vorbereiten\n",
-    "    sorted_lengths = sorted(lengths.items())\n",
-    "    x_values = [x[0] for x in sorted_lengths[:15]]  # Nur die ersten 15 Längen\n",
-    "    y_values = [x[1] for x in sorted_lengths[:15]]\n",
+    "    max_length = max(max(lengths1.keys()), max(lengths2.keys()))\n",
+    "    x = range(1, max_length + 1)\n",
+    "    \n",
+    "    # Relative Häufigkeiten berechnen\n",
+    "    total1 = sum(lengths1.values())\n",
+    "    total2 = sum(lengths2.values())\n",
+    "    y1 = [lengths1.get(i, 0)/total1 * 100 for i in x]\n",
+    "    y2 = [lengths2.get(i, 0)/total2 * 100 for i in x]\n",
     "    \n",
     "    # Plot erstellen\n",
-    "    plt.figure(figsize=(10, 6))\n",
-    "    plt.plot(x_values, y_values, marker='o')\n",
-    "    plt.title(title)\n",
-    "    plt.xlabel('Wortlänge')\n",
-    "    plt.ylabel('Häufigkeit')\n",
-    "    plt.grid(True)\n",
+    "    plt.plot(x, y1, 'b-', label=author1, marker='o')\n",
+    "    plt.plot(x, y2, 'r-', label=author2, marker='s')\n",
+    "    \n",
+    "    plt.title(\"Vergleich der Wortlängenverteilungen\")\n",
+    "    plt.xlabel(\"Wortlänge (Anzahl Buchstaben)\")\n",
+    "    plt.ylabel(\"Relative Häufigkeit (%)\")\n",
+    "    plt.grid(True, alpha=0.3)\n",
+    "    plt.legend()\n",
+    "    \n",
+    "    # Statistische Kennzahlen\n",
+    "    print(f\"Durchschnittliche Wortlänge {author1}: {sum(i*v for i,v in lengths1.items())/total1:.2f}\")\n",
+    "    print(f\"Durchschnittliche Wortlänge {author2}: {sum(i*v for i,v in lengths2.items())/total2:.2f}\")\n",
+    "    \n",
     "    plt.show()\n",
     "\n",
-    "plot_word_lengths(goethe_lengths, \"Wortlängenverteilung in Goethes Text\")"
+    "plot_comparative_lengths(goethe_lengths, humboldt_lengths)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "#### Interpretation der Ergebnisse\n",
+    "\n",
+    "##### Generelle Anmerkungen \n",
+    "\n",
+    "Bei der Interpretation der Wortlängenverteilungen sollten wir beachten:\n",
+    "\n",
+    "1. **Textspezifische Faktoren**\n",
+    "   - Genre und Textsorte\n",
+    "   - Entstehungszeit\n",
+    "   - Thematischer Kontext\n",
+    "   \n",
+    "2. **Sprachliche Besonderheiten**\n",
+    "   - Deutsche Komposita (zusammengesetzte Wörter)\n",
+    "   - Historische Schreibweisen\n",
+    "   - Fachsprachliche Elemente\n",
+    "\n",
+    "3. **Statistische Aspekte**\n",
+    "   - Verteilungsform\n",
+    "   - Durchschnittliche Wortlänge\n",
+    "   - Streuung der Werte\n",
+    "\n",
+    "##### Humboldt v. Goethe Worlängenverteilung\n",
+    "\n",
+    "Die Analyse zeigt interessante Muster in den Wortlängenverteilungen beider Autoren:\n",
+    "\n",
+    "1. **Durchschnittliche Wortlängen**\n",
+    "   - Goethe: 5,57 Buchstaben pro Wort\n",
+    "   - Humboldt: 5,13 Buchstaben pro Wort\n",
+    "   Diese Differenz von 0,44 Buchstaben ist bemerkenswert und könnte auf unterschiedliche Schreibstile hinweisen.\n",
+    "\n",
+    "2. **Verteilungsmuster**\n",
+    "   - Beide Autoren zeigen eine charakteristische Glockenkurve mit einem Peak bei 3 Buchstaben\n",
+    "   - Häufigste Wortlänge bei beiden Autoren ist 3 Buchstaben:\n",
+    "     * Goethe: 14.607 Wörter\n",
+    "     * Humboldt: 29.621 Wörter\n",
+    "   - Der steile Abfall nach dem Peak ist bei Humboldt etwas ausgeprägter\n",
+    "\n",
+    "3. **Besonderheiten**\n",
+    "   - Sehr lange Wörter (>20 Buchstaben):\n",
+    "     * Goethe: vereinzelte Wörter bis 26 Buchstaben\n",
+    "     * Humboldt: Maximum bei 24 Buchstaben\n",
+    "   - Kurze Wörter (1-2 Buchstaben):\n",
+    "     * Goethe: verhältnismäßig weniger (44 einbuchstabige Wörter)\n",
+    "     * Humboldt: deutlich mehr (453 einbuchstabige Wörter)\n",
+    "\n",
+    "4. **Textspezifische Beobachtungen**\n",
+    "   - Die hohe Anzahl kurzer Wörter bei beiden Autoren entspricht der typischen deutschen Sprachstruktur (Artikel, Präpositionen, etc.)\n",
+    "   - Die langen Wörter (>15 Buchstaben) sind wahrscheinlich Komposita oder Fachbegriffe\n",
+    "   - Der unterschiedliche Umfang der Texte (Humboldt hat mehr Wörter) muss bei der Interpretation berücksichtigt werden\n",
+    "\n",
+    "Diese Verteilungen allein lassen noch keine eindeutige Autorschaftszuordnung zu, bieten aber erste Hinweise auf stilistische Unterschiede zwischen den Autoren.\n",
+    "\n",
+    "#### Weiterentwicklung der Methode\n",
+    "\n",
+    "Die moderne Stilometrie hat Mendenhalls Ansatz weiterentwickelt:\n",
+    "- Integration in komplexere statistische Modelle\n",
+    "- Kombination mit anderen Textmerkmalen\n",
+    "- Nutzung maschinellen Lernens\n",
+    "\n",
+    "In den folgenden Sitzungen werden wir diese fortgeschritteneren Methoden kennenlernen und anwenden."
    ]
   },
   {
@@ -262,60 +450,146 @@
    "source": [
     "### Ein modernes Beispiel: QAnon\n",
     "\n",
-    "Die Methoden der Autorschaftsattribution sind heute relevanter denn je:\n",
+    "Das QAnon-Phänomen zeigt die aktuelle Relevanz der Autorschaftsattribution. Ab Oktober 2017 erschienen auf verschiedenen Online-Plattformen mysteriöse Nachrichten eines anonymen Users \"Q\", der behauptete, hochrangiger Regierungsinsider zu sein. Diese \"Q-Drops\" führten zur Entstehung einer weltweiten Verschwörungsbewegung.\n",
+    "\n",
+    "2022 führten zwei unabhängige Forscherteams Autorschaftsanalysen der Q-Drops durch:\n",
+    "- Claude-Alain Roten und Lionel Pousaz (OrphAnalytics) verwendeten Drei-Zeichen-Sequenzen\n",
+    "- Florian Cafiero und Jean-Baptiste Camps nutzten maschinelles Lernen\n",
+    "\n",
+    "Beide Teams identifizierten mit hoher Wahrscheinlichkeit zwei Hauptautoren: Paul Furber und Ron Watkins. \n",
     "\n",
-    "- Analyse von Social Media Posts und Online-Kommunikation\n",
-    "- Untersuchung der \"Q Drops\" (ca. 5000 Posts, 2017-2020)\n",
-    "- Besondere Herausforderungen:\n",
-    "  - Kurze Texte\n",
-    "  - Spezielle Sprache und Abkürzungen\n",
-    "  - Verschleierungsversuche\n"
+    "Besondere Herausforderungen der Analyse:\n",
+    "- Sehr kurze Texte\n",
+    "- Ungewöhnliche Sprache und Abkürzungen\n",
+    "- Bewusste Verschleierungsversuche\n",
+    "\n",
+    "[Quelle: Kirkpatrick, D. (2022): \"Who Is Behind QAnon? Linguistic Detectives Find Fingerprints\", New York Times]"
    ]
   },
   {
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "## 2. Wie funktioniert Autorschaftsattribution?\n",
+    "## 3. Von der traditionellen zur computergestützten Autorschaftsattribution\n",
     "\n",
-    "### Grundprinzipien der Stilometrie\n",
+    "Die Entwicklung der Autorschaftsattribution lässt sich in drei Phasen einteilen:\n",
     "\n",
-    "Die Stilometrie basiert auf der quantitativen Analyse verschiedener Textmerkmale:\n",
+    "1. Frühe manuelle Analysen (19. Jahrhundert)\n",
+    "   - Mendenhall's Wortlängenkurven\n",
+    "   - Erste systematische Textvergleiche\n",
+    "   - Basierend auf Expert:innenwissen\n",
+    "   - Qualitative Textanalyse\n",
+    "   - Subjektive Interpretationen\n",
+    "   - Beschränkt auf wenige, meist literarische Texte\n",
     "\n",
-    "1. Lexikalische Merkmale:\n",
-    "   - Wortfrequenzen\n",
-    "   - Vokabularreichtum\n",
-    "   - Wortlängenverteilungen\n",
+    "2. Computergestützte Pionierarbeit (1960er)\n",
+    "- Beginn mit Mosteller und Wallace (1964) und den Federalist Papers\n",
+    "- Entwicklung der Stilometrie als quantitative Methode\n",
+    "- Computer-assistiert, nicht vollautomatisch\n",
+    "- Hauptprobleme:\n",
+    "  * Sehr lange, stilistisch heterogene Texte\n",
+    "  * Wenige Vergleichsautoren\n",
+    "  * Keine standardisierte Evaluation\n",
+    "  * Meist nur visuelle Inspektion der Ergebnisse\n",
+    "\n",
+    "3. Moderne computergestützte Phase (seit späten 1990ern)\n",
+    "- Einfluss von maschinellem Lernen und Natural Language Processing\n",
+    "- Standardisierte Evaluationsmethoden\n",
+    "- Behandlung großer Textmengen\n",
+    "- Neue Textarten (E-Mails, Blogs, Social Media)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 4. Stilometrie: Quantifizierung des Schreibstils\n",
+    "\n",
+    "Stilometrie ist die Wissenschaft der quantitativen Erfassung von Schreibstilen. Sie bildet die methodische Grundlage der modernen Autorschaftsattribution.\n",
+    "\n",
+    "### Merkmalsebenen der Stilometrie\n",
+    "\n",
+    "1. **Lexikalische Merkmale**\n",
+    "   - Einfach zu extrahieren\n",
+    "   - Sprachunabhängig\n",
+    "   - Beispiele:\n",
+    "     * Wortlängen und -frequenzen\n",
+    "     * Satzlängen\n",
+    "     * Funktionswörter\n",
+    "   - Analysemethoden:\n",
+    "     * Häufigkeitsverteilungen (wie in unserer Wortlängenanalyse)\n",
+    "     * Burrows' Delta basierend auf Wortfrequenzen\n",
+    "     * Multidimensionale Analyse häufiger Wörter mittels PCA\n",
+    "\n",
+    "2. **Zeichenbasierte Merkmale**\n",
+    "   - Sehr robust\n",
+    "   - Sprachunabhängig\n",
+    "   - Beispiele:\n",
+    "     * Buchstabenhäufigkeiten\n",
+    "     * N-Gramme (Sequenzen von n Zeichen)\n",
+    "     * Interpunktionsmuster\n",
+    "   - Analysemethoden:\n",
+    "     * Verteilungsanalysen\n",
+    "     * N-Gramm-Profile\n",
+    "\n",
+    "3. **Syntaktische Merkmale**\n",
+    "   - Komplexer zu extrahieren\n",
+    "   - Sprachabhängig\n",
+    "   - Beispiele:\n",
+    "     * Wortarten (POS-Tags)\n",
+    "     * Syntaktische Muster\n",
+    "     * Abhängigkeitsstrukturen\n",
+    "   - Analysemethoden:\n",
+    "     * Syntaktische Netzwerkanalyse\n",
+    "     * Mustererkennung in Satzstrukturen\n",
+    "\n",
+    "4. **Semantische Merkmale**\n",
+    "   - Sehr komplex\n",
+    "   - Stark sprachabhängig\n",
+    "   - Noch wenig erforscht\n",
+    "   - Beispiele:\n",
+    "     * Bedeutungsfelder\n",
+    "     * Thematische Rollen\n",
+    "     * Semantische Netzwerke\n",
+    "   - Experimentelle Analysemethoden:\n",
+    "     * Topic Modeling\n",
+    "     * Semantische Ähnlichkeitsanalyse\n",
+    "   - Beispiele:\n",
+    "     * Wortarten (POS-Tags)\n",
+    "     * Syntaktische Muster\n",
+    "     * Abhängigkeitsstrukturen\n",
+    "\n",
+    "4. **Semantische Merkmale**\n",
+    "   - Sehr komplex\n",
+    "   - Stark sprachabhängig\n",
+    "   - Noch wenig erforscht\n",
+    "   - Beispiele:\n",
+    "     * Bedeutungsfelder\n",
+    "     * Thematische Rollen\n",
+    "\n",
+    "[Quelle: Stamatatos (2008): A survey of modern authorship attribution methods]"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 4. Von der Theorie zur Praxis\n",
     "\n",
-    "2. Syntaktische Merkmale:\n",
-    "   - Satzlänge\n",
-    "   - Zeichensetzung\n",
-    "   - Wortarten-Muster\n",
+    "Nach der Einführung in die theoretischen Grundlagen der Autorschaftsattribution wollen wir nun erste praktische Erfahrungen sammeln. Wir werden zwei grundlegende Analysen durchführen:\n",
+    "1. Einfache Textstatistiken berechnen\n",
+    "2. Texte stilometrisch vergleichen\n",
     "\n",
-    "3. Zeichenbasierte Merkmale:\n",
-    "   - Buchstabenhäufigkeiten\n",
-    "   - Character n-gramme\n",
+    "### Grundlegende Textanalyse\n",
     "\n",
-    "Lassen Sie uns ein einfaches Beispiel anschauen:"
+    "Zunächst entwickeln wir eine Funktion, die grundlegende statistische Informationen aus einem Text extrahiert:"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "\n",
-      "Analyseergebnisse:\n",
-      "wortanzahl: 9\n",
-      "durchschnittliche_wortlaenge: 6.777777777777778\n",
-      "haeufigste_woerter: [('die', 1), ('stilometrie', 1), ('ist', 1), ('eine', 1), ('faszinierende', 1)]\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "import re\n",
     "from collections import Counter\n",
@@ -324,13 +598,18 @@
     "    \"\"\"\n",
     "    Grundlegende Analyse eines Textes.\n",
     "    \n",
+    "    Diese Funktion:\n",
+    "    - Zerlegt den Text in Wörter\n",
+    "    - Bereinigt die Wörter von Satzzeichen\n",
+    "    - Berechnet grundlegende Statistiken\n",
+    "    \n",
     "    Args:\n",
     "        text (str): Zu analysierender Text\n",
     "    \n",
     "    Returns:\n",
     "        dict: Einfache Textstatistiken\n",
     "    \"\"\"\n",
-    "    # Text in Wörter zerlegen\n",
+    "    # Text in Wörter zerlegen und bereinigen\n",
     "    words = text.lower().split()\n",
     "    words = [re.sub(r'[^\\w\\s]', '', word) for word in words]\n",
     "    \n",
@@ -343,7 +622,7 @@
     "    \n",
     "    return stats\n",
     "\n",
-    "# Beispielanalyse\n",
+    "# Beispielanalyse mit Erklärung\n",
     "beispiel_text = \"Die Stilometrie ist eine faszinierende Methode der Digital Humanities.\"\n",
     "ergebnis = analyse_text(beispiel_text)\n",
     "print(\"\\nAnalyseergebnisse:\")\n",
@@ -355,60 +634,25 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "## 3. Historische Entwicklung der Methoden\n",
-    "\n",
-    "### Von manuellen zu computergestützten Analysen\n",
-    "\n",
-    "1. Frühe manuelle Analysen (19. Jahrhundert)\n",
-    "   - Mendenhall's Wortlängenkurven\n",
-    "   - Erste systematische Textvergleiche\n",
-    "\n",
-    "2. Computergestützte Pionierarbeit (1960er)\n",
-    "   - Mosteller & Wallace: Analyse der Federalist Papers\n",
-    "   - Erste Anwendung statistischer Methoden\n",
-    "\n",
-    "3. Moderne Methoden\n",
-    "   - Burrows' Delta\n",
-    "   - Machine Learning\n",
-    "   - Deep Learning"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "## 4. Praktische Übung\n",
+    "### Vergleichende Analyse\n",
     "\n",
-    "Versuchen Sie selbst eine einfache Analyse durchzuführen:"
+    "Für die Autorschaftsattribution ist der Vergleich von Texten zentral. Hier entwickeln wir eine einfache Vergleichsfunktion:"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 11,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Vergleich der Texte:\n",
-      "\n",
-      "Text 1:\n",
-      "wortanzahl: 10\n",
-      "durchschnittliche_wortlaenge: 10.4\n",
-      "haeufigste_woerter: [('die', 1), ('digital', 1), ('humanities', 1), ('verbinden', 1), ('traditionelle', 1)]\n",
-      "\n",
-      "Text 2:\n",
-      "wortanzahl: 8\n",
-      "durchschnittliche_wortlaenge: 11.75\n",
-      "haeufigste_woerter: [('computergestützte', 1), ('analysen', 1), ('ermöglichen', 1), ('neue', 1), ('perspektiven', 1)]\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "def vergleiche_texte(text1, text2):\n",
     "    \"\"\"\n",
-    "    Vergleicht zwei Texte hinsichtlich grundlegender stilometrischer Merkmale.\n",
+    "    Vergleicht zwei Texte hinsichtlich ihrer stilometrischen Merkmale.\n",
+    "    \n",
+    "    Diese Funktion demonstriert, wie wir:\n",
+    "    - Texte systematisch vergleichen können\n",
+    "    - Unterschiede quantifizieren können\n",
+    "    - Erste stilometrische Merkmale extrahieren\n",
     "    \n",
     "    Args:\n",
     "        text1 (str): Erster Vergleichstext\n",
@@ -426,26 +670,26 @@
     "    for key, value in stats2.items():\n",
     "        print(f\"{key}: {value}\")\n",
     "\n",
-    "# Beispieltexte zum Vergleich\n",
+    "# Beispielvergleich mit typischen Digital Humanities Texten\n",
     "text1 = \"\"\"Die Digital Humanities verbinden traditionelle geisteswissenschaftliche \n",
     "          Forschung mit computergestützten Methoden.\"\"\"\n",
     "text2 = \"\"\"Computergestützte Analysen ermöglichen neue Perspektiven auf \n",
     "          geisteswissenschaftliche Fragestellungen.\"\"\"\n",
     "\n",
-    "vergleiche_texte(text1, text2)\n"
+    "vergleiche_texte(text1, text2)"
    ]
   },
   {
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "## 5. Ausblick auf die kommenden Sitzungen\n",
+    "## 5. Ausblick und nächste Schritte\n",
     "\n",
-    "In den nächsten Wochen werden wir:\n",
-    "- Verschiedene stilometrische Methoden kennenlernen\n",
-    "- Mit echten historischen Datensätzen arbeiten\n",
-    "- Eigene Analysetools entwickeln\n",
-    "- Komplexere statistische Verfahren verstehen"
+    "In den kommenden Sitzungen werden wir:\n",
+    "- Komplexere stilometrische Methoden kennenlernen\n",
+    "- Mit größeren historischen Datensätzen arbeiten\n",
+    "- Fortgeschrittenere Analysewerkzeuge entwickeln\n",
+    "- Statistische Verfahren wie Burrows' Delta einführen"
    ]
   },
   {
@@ -470,7 +714,7 @@
     "\n",
     "**Aufgabe: Häufigkeiten der Wortlänge aller Texte**\n",
     "\n",
-    "Führen Sie für alle bereitgestellten Texte eine Häufigkeitszählung der Wortlängen nach der Vorlage aus dem Seminar durch. \n",
+    "Führen Sie für alle bereitgestellten Texte in *data/sitzung_1* eine Häufigkeitszählung der Wortlängen nach der Vorlage aus dem Seminar durch. \n",
     "\n",
     "Anforderungen:\n",
     "- Sie können wählen, ob Sie mit einer for-Schleife vorgehen oder die Auszählung jeweils einzeln vornehmen\n",
@@ -478,9 +722,7 @@
     "- Nutzen Sie Markdown-Zellen zur weiteren Dokumentation\n",
     "- Speichern Sie die Ergebnisse Ihrer Häufigkeitszählung in einer csv-Datei (oder in vier verschiedenen Dateien)\n",
     "\n",
-    "*Abgabe: Bitte laden Sie Ihre Dateien bis Montagabend, 9.5., 19 Uhr hoch.*\n",
-    "\n",
-    "Als Vorlage können Sie das Notebook `stilo-test.ipynb` aus der Seminarsitzung verwenden.\n"
+    "Als Vorlage können Sie dieses Notebook verwenden.\n"
    ]
   },
   {
@@ -489,15 +731,18 @@
    "source": [
     "## Literatur und weiterführende Ressourcen\n",
     "\n",
-    "- Mosteller & Wallace (1964): Inference and Disputed Authorship: The Federalist\n",
     "- Burrows (2002): Delta: A Measure of Stylistic Difference\n",
-    "- [Programming Historian: Stilometrie mit Python](https://programminghistorian.org/en/lessons/introduction-to-stylometry-with-python)"
+    "- Kirkpatrick, D. (2022): \"Who Is Behind QAnon? Linguistic Detectives Find Fingerprints\", New York Times\n",
+    "- Mosteller & Wallace (1964): Inference and Disputed Authorship: The Federalist\n",
+    "- [Programming Historian: Stilometrie mit Python](https://programminghistorian.org/en/lessons/introduction-to-stylometry-with-python)\n",
+    "- Stamatatos (2008): A survey of modern authorship attribution methods\n",
+    "- Zheng & Jin (2022): Is word length inaccurate for authorship attribution\n"
    ]
   }
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": ".venv",
+   "display_name": "Python 3",
    "language": "python",
    "name": "python3"
   },
@@ -511,7 +756,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.12.6"
+   "version": "3.11.9"
   }
  },
  "nbformat": 4,
diff --git a/authorship_attribution_lb/notebooks/02_fortsetzung.ipynb b/authorship_attribution_lb/notebooks/02_fortsetzung.ipynb
new file mode 100644
index 0000000000000000000000000000000000000000..5e8ad9331f16f77139d8e6283b354939598d0386
--- /dev/null
+++ b/authorship_attribution_lb/notebooks/02_fortsetzung.ipynb
@@ -0,0 +1,376 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Stilometrie und Textvorverarbeitung am Beispiel mittelalterlicher Texte\n",
+    "\n",
+    "## Lernziele\n",
+    "\n",
+    "In diesem Notebook werden Sie:\n",
+    "- Stilometrische Methoden an einem historischen Fallbeispiel kennenlernen\n",
+    "- Die Bedeutung von Textmerkmalen für die Autorschaftsattribution verstehen\n",
+    "- Mit mittelalterlichen lateinischen Texten arbeiten\n",
+    "- Das Classical Language Toolkit (CLTK) für historische Textanalyse nutzen\n",
+    "- Kritisch über die Grenzen computationeller Methoden in der historischen Forschung reflektieren"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Der historische Kontext: Hildegard von Bingen und das Problem der Autorschaft\n",
+    "\n",
+    "### Historischer Hintergrund und Forschungsproblem\n",
+    "\n",
+    "Hildegard von Bingen (1098-1179) gehört zu den faszinierendsten Persönlichkeiten des europäischen Mittelalters:\n",
+    "\n",
+    "1. **Historische Bedeutung**\n",
+    "   - Benediktinerin und Äbtissin des Klosters Rupertsberg\n",
+    "   - Bedeutende Mystikerin und Visionärin ihrer Zeit\n",
+    "   - Verfasserin theologischer, naturkundlicher und medizinischer Werke\n",
+    "   - Komponistin geistlicher Musik\n",
+    "   - Politische Beraterin und Korrespondenzpartnerin wichtiger Zeitgenossen\n",
+    "\n",
+    "2. **Besonderheiten ihrer Textproduktion**\n",
+    "   - Diktierte ihre Texte aufgrund mangelnder Lateinkenntnisse\n",
+    "   - Arbeitete mit verschiedenen Sekretären zusammen\n",
+    "   - Komplexe Überlieferungssituation ihrer Werke\n",
+    "   - Unterschiedliche Entstehungskontexte der Texte\n",
+    "\n",
+    "### Die Forschungsfrage: Das \"Guibert-Problem\"\n",
+    "\n",
+    "In ihren letzten Lebensjahren (1177-1179) arbeitete Hildegard eng mit Guibert von Gembloux zusammen:\n",
+    "\n",
+    "1. **Historische Quellenlage**\n",
+    "   - Guibert war ihr letzter Sekretär\n",
+    "   - Intensive Zusammenarbeit in Hildegards späten Jahren\n",
+    "   - Zwei zentrale Texte aus dieser Zeit:\n",
+    "     * *Visio de Sancto Martino*\n",
+    "     * *Visio ad Guibertum missa*\n",
+    "\n",
+    "2. **Das Autorschaftsproblem**\n",
+    "   - Traditionelle Zuschreibung an Hildegard\n",
+    "   - Stilistische Auffälligkeiten in beiden Texten\n",
+    "   - Guiberts mögliche Rolle als Co-Autor\n",
+    "   - Fragen nach dem Grad seiner Einflussnahme\n",
+    "\n",
+    "3. **Relevanz für die Forschung**\n",
+    "   - Bedeutung für Hildegard-Biographie\n",
+    "   - Fragen nach mittelalterlichen Autorschaftskonzepten\n",
+    "   - Rolle von Sekretären in der mittelalterlichen Textproduktion\n",
+    "   - Methodische Herausforderungen der Autorschaftsattribution\n",
+    "\n",
+    "### Computationelle Analyse als Lösungsansatz\n",
+    "\n",
+    "Warum eignet sich dieser Fall besonders für eine computationelle Analyse?\n",
+    "\n",
+    "1. **Quellensituation**\n",
+    "   - Ausreichend Vergleichstexte beider Autoren\n",
+    "   - Gut dokumentierte Entstehungskontexte\n",
+    "   - Klare zeitliche Eingrenzung\n",
+    "   - Definiertes Textkorpus\n",
+    "\n",
+    "2. **Methodische Vorteile**\n",
+    "   - Quantifizierbare stilistische Merkmale\n",
+    "   - Möglichkeit der systematischen Vergleichsanalyse\n",
+    "   - Objektivierbare Kriterien\n",
+    "   - Reproduzierbare Ergebnisse\n",
+    "\n",
+    "3. **Grenzen des Ansatzes**\n",
+    "   - Komplexität mittelalterlicher Textproduktion\n",
+    "   - Überlieferungsproblematik\n",
+    "   - Sprachliche Besonderheiten\n",
+    "   - Kulturelle Kontexte"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 1. Stilometrische Merkmale für historische Texte\n",
+    "\n",
+    "Bei der Analyse historischer Texte müssen wir besondere Faktoren berücksichtigen:\n",
+    "\n",
+    "### 1.1 Spezifische Herausforderungen mittelalterlicher Texte\n",
+    "\n",
+    "1. **Überlieferungssituation**\n",
+    "   - Textvarianten und Abschriften\n",
+    "   - Mögliche Schreiberfehler\n",
+    "   - Fragmentarische Überlieferung\n",
+    "\n",
+    "2. **Sprachliche Besonderheiten**\n",
+    "   - Mittelalterliches Latein\n",
+    "   - Regionale Varianten\n",
+    "   - Orthographische Inkonsistenzen\n",
+    "\n",
+    "3. **Produktionsbedingungen**\n",
+    "   - Rolle von Sekretären und Schreibern\n",
+    "   - Kollaborative Textproduktion\n",
+    "   - Institutionelle Kontexte\n",
+    "\n",
+    "### 1.2 Relevante stilometrische Merkmale\n",
+    "\n",
+    "Für unsere Analyse nutzen wir verschiedene Textmerkmale:\n",
+    "\n",
+    "1. **Autorensignale**\n",
+    "   - Funktionswörter (besonders wichtig für Lateinische Texte)\n",
+    "   - Wortlängenverteilung\n",
+    "   - Syntaktische Muster\n",
+    "\n",
+    "2. **Genresignale**\n",
+    "   - Typische Formulierungen\n",
+    "   - Textstruktur\n",
+    "   - Fachvokabular\n",
+    "\n",
+    "*Wichtig: Die Unterscheidung zwischen Autoren- und Genresignalen ist besonders bei mittelalterlichen Texten komplex, da oft starke Genrekonventionen existierten.*"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 2. Vorbereitung der Analyseumgebung\n",
+    "\n",
+    "Zunächst installieren wir die benötigten Bibliotheken und laden unsere Texte."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Auswahl der richtigen Werkzeuge für historische Textanalyse\n",
+    "\n",
+    "#### Vergleich verschiedener NLP-Bibliotheken\n",
+    "\n",
+    "Für die Verarbeitung natürlicher Sprache (NLP) stehen verschiedene Python-Bibliotheken zur Verfügung. Die Wahl der richtigen Bibliothek ist entscheidend für den Erfolg unserer Analyse:\n",
+    "\n",
+    "1. **SpaCy**\n",
+    "   - *Vorteile*:\n",
+    "     * Sehr schnell und effizient\n",
+    "     * Moderne Architektur\n",
+    "     * Gute Unterstützung für moderne Sprachen\n",
+    "   - *Nachteile*:\n",
+    "     * Primär für moderne Texte entwickelt\n",
+    "     * Weniger flexibel bei historischen Varianten\n",
+    "   - *Typische Anwendung*: Analyse moderner Texte, journalistische Texte, Social Media\n",
+    "\n",
+    "2. **NLTK (Natural Language Toolkit)**\n",
+    "   - *Vorteile*:\n",
+    "     * Umfangreiche akademische Dokumentation\n",
+    "     * Große Auswahl an Algorithmen\n",
+    "     * Gut für Lehrzwecke\n",
+    "   - *Nachteile*:\n",
+    "     * Langsamer als moderne Alternativen\n",
+    "     * Teilweise veraltete Architektur\n",
+    "   - *Typische Anwendung*: Lehre, Prototyping, linguistische Forschung\n",
+    "\n",
+    "3. **CLTK (Classical Language Toolkit)**\n",
+    "   - *Vorteile*:\n",
+    "     * Spezialisiert auf historische Sprachen\n",
+    "     * Vortrainierte Modelle für Latein\n",
+    "     * Berücksichtigung historischer Sprachvarianten\n",
+    "   - *Nachteile*:\n",
+    "     * Kleinere Entwicklergemeinschaft\n",
+    "     * Weniger Features als SpaCy/NLTK\n",
+    "   - *Typische Anwendung*: Analyse antiker und mittelalterlicher Texte\n",
+    "\n",
+    "### Warum CLTK für unser Projekt?\n",
+    "\n",
+    "Für unsere Analyse der Hildegard-Texte verwenden wir CLTK aus folgenden Gründen:\n",
+    "\n",
+    "1. **Spezialisierung auf historische Texte**\n",
+    "   - Besserer Umgang mit mittelalterlichem Latein\n",
+    "   - Vortrainierte Modelle für lateinische Texte\n",
+    "   - Berücksichtigung historischer Schreibvarianten\n",
+    "\n",
+    "2. **Passende Features**\n",
+    "   - Spezielle Tokenisierung für lateinische Texte\n",
+    "   - Morphologische Analyse historischer Wortformen\n",
+    "   - Lemmatisierung unter Berücksichtigung historischer Varianten\n",
+    "\n",
+    "3. **Wissenschaftliche Ausrichtung**\n",
+    "   - Entwickelt für Digital Humanities\n",
+    "   - Gut dokumentierte wissenschaftliche Grundlagen\n",
+    "   - Aktive akademische Nutzergemeinschaft\n",
+    "\n",
+    "*Hinweis: Die Wahl der Bibliothek sollte immer von der spezifischen Forschungsfrage und den Besonderheiten des Quellenmaterials abhängen.*"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Importe\n",
+    "from cltk import NLP\n",
+    "import pandas as pd\n",
+    "import numpy as np\n",
+    "from collections import Counter\n",
+    "import matplotlib.pyplot as plt\n",
+    "\n",
+    "# Deutsche Labels für Plots\n",
+    "plt.rcParams['axes.formatter.use_locale'] = True\n",
+    "\n",
+    "# Lateinisches Sprachmodell laden\n",
+    "nlp = NLP(language='lat')\n",
+    "print(\"Verfügbare Pipeline-Komponenten:\", nlp.pipeline.processes)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 3. Textvorverarbeitung für mittelalterliche Texte\n",
+    "\n",
+    "Die Verarbeitung mittelalterlicher lateinischer Texte erfordert spezielle Schritte:\n",
+    "\n",
+    "1. **Normalisierung historischer Schreibweisen**\n",
+    "   - v/u Vereinheitlichung\n",
+    "   - ae/e Normalisierung\n",
+    "   - Auflösung von Abkürzungen\n",
+    "\n",
+    "2. **Behandlung von Sonderformen**\n",
+    "   - Mittelalterliche Kontraktionen\n",
+    "   - Spezielle grammatische Formen\n",
+    "   - Regionaltypische Varianten"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def normalisiere_mittelalterlich(text):\n",
+    "    \"\"\"Normalisiert einen mittelalterlichen lateinischen Text.\n",
+    "    \n",
+    "    Führt folgende Normalisierungen durch:\n",
+    "    - Kleinschreibung\n",
+    "    - v -> u Normalisierung\n",
+    "    - ae/oe -> e Normalisierung\n",
+    "    - Entfernung von Interpunktion\n",
+    "    \n",
+    "    Args:\n",
+    "        text (str): Zu normalisierender Text\n",
+    "        \n",
+    "    Returns:\n",
+    "        str: Normalisierter Text\n",
+    "    \"\"\"\n",
+    "    # Zu Kleinbuchstaben\n",
+    "    text = text.lower()\n",
+    "    \n",
+    "    # Klassische Normalisierungen\n",
+    "    text = text.replace('v', 'u')\n",
+    "    text = text.replace('ae', 'e')\n",
+    "    text = text.replace('oe', 'e')\n",
+    "    \n",
+    "    return text\n",
+    "\n",
+    "# Beispiel\n",
+    "beispieltext = \"Vae victis, qui in aeternum vivent!\"\n",
+    "print(\"Original:\", beispieltext)\n",
+    "print(\"Normalisiert:\", normalisiere_mittelalterlich(beispieltext))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 4. Analyse von Funktionswörtern\n",
+    "\n",
+    "Eine zentrale Rolle in der Autorschaftsattribution spielen Funktionswörter (z.B. Präpositionen, Konjunktionen). Bei lateinischen Texten sind dies etwa:\n",
+    "- et, ac, atque (und)\n",
+    "- in, ad, ex (Präpositionen)\n",
+    "- qui, quae, quod (Relativpronomen)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "class LateinAnalyzer:\n",
+    "    \"\"\"Klasse zur Analyse lateinischer Texte.\"\"\"\n",
+    "    \n",
+    "    def __init__(self):\n",
+    "        # Häufige lateinische Funktionswörter\n",
+    "        self.funktionswoerter = {\n",
+    "            'et', 'ac', 'atque',  # Konjunktionen\n",
+    "            'in', 'ad', 'ex', 'de', 'cum',  # Präpositionen\n",
+    "            'qui', 'quae', 'quod'  # Relativpronomen\n",
+    "        }\n",
+    "    \n",
+    "    def analysiere_funktionswoerter(self, text, top_n=10):\n",
+    "        \"\"\"Analysiert Funktionswörter im Text.\n",
+    "        \n",
+    "        Args:\n",
+    "            text (str): Zu analysierender Text\n",
+    "            top_n (int): Anzahl der häufigsten Wörter\n",
+    "            \n",
+    "        Returns:\n",
+    "            list: (Wort, Häufigkeit) Paare\n",
+    "        \"\"\"\n",
+    "        # Text normalisieren und tokenisieren\n",
+    "        text = normalisiere_mittelalterlich(text)\n",
+    "        doc = nlp.analyze(text)\n",
+    "        \n",
+    "        # Funktionswörter zählen\n",
+    "        woerter = [t for t in doc.tokens if t in self.funktionswoerter]\n",
+    "        return Counter(woerter).most_common(top_n)\n",
+    "\n",
+    "# Beispielanalyse\n",
+    "analyzer = LateinAnalyzer()\n",
+    "text = \"\"\"Et in terra pax hominibus bonae voluntatis. \n",
+    "          Laudamus te, benedicimus te, adoramus te, glorificamus te.\"\"\"\n",
+    "\n",
+    "print(\"Häufigste Funktionswörter:\")\n",
+    "for wort, anzahl in analyzer.analysiere_funktionswoerter(text):\n",
+    "    print(f\"{wort}: {anzahl}\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 5. Übung: Analyse der Hildegard-Texte\n",
+    "\n",
+    "Jetzt wenden wir die gelernten Methoden auf unseren historischen Fall an.\n",
+    "\n",
+    "### Aufgaben:\n",
+    "\n",
+    "1. **Textverarbeitung**\n",
+    "   - Laden Sie die bereitgestellten Texte\n",
+    "   - Führen Sie die notwendigen Normalisierungen durch\n",
+    "   - Extrahieren Sie die Funktionswörter\n",
+    "\n",
+    "2. **Vergleichende Analyse**\n",
+    "   - Vergleichen Sie die Häufigkeiten der Funktionswörter\n",
+    "   - Erstellen Sie Visualisierungen\n",
+    "   - Dokumentieren Sie Ihre Beobachtungen\n",
+    "\n",
+    "3. **Historische Interpretation**\n",
+    "   - Diskutieren Sie Ihre Ergebnisse im historischen Kontext\n",
+    "   - Berücksichtigen Sie die Rolle mittelalterlicher Sekretäre\n",
+    "   - Reflektieren Sie über die Grenzen der Methode\n",
+    "\n",
+    "### Tipps:\n",
+    "- Achten Sie auf die spezifischen Herausforderungen mittelalterlicher Texte\n",
+    "- Dokumentieren Sie Ihre Annahmen und Entscheidungen\n",
+    "- Bedenken Sie den historischen Kontext bei der Interpretation\n",
+    "\n",
+    "*Hinweis: Die vollständige Analyse finden Sie in Kestemont et al. (2015)*"
+   ]
+  }
+],
+"metadata": {
+ "language_info": {
+  "name": "python"
+ }
+},
+"nbformat": 4,
+"nbformat_minor": 2
+}
diff --git a/authorship_attribution_lb/notebooks/03_burrows_delta.ipynb b/authorship_attribution_lb/notebooks/03_burrows_delta.ipynb
new file mode 100644
index 0000000000000000000000000000000000000000..eeffa46120263edc8fcad31c1d921b2f65ca7e47
--- /dev/null
+++ b/authorship_attribution_lb/notebooks/03_burrows_delta.ipynb
@@ -0,0 +1,509 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Burrows' Delta: Eine computergestützte Methode der Autorschaftsattribution\n",
+    "\n",
+    "In diesem Notebook lernen wir Burrows' Delta kennen - eine der wichtigsten und einflussreichsten Methoden der computergestützten Autorschaftsattribution. Die Methode wurde 2002 von John Burrows entwickelt und hat sich seitdem als Standardverfahren etabliert.\n",
+    "\n",
+    "## Lernziele\n",
+    "\n",
+    "Nach diesem Notebook werden Sie:\n",
+    "- Das Konzept von Burrows' Delta verstehen\n",
+    "- Die mathematischen Grundlagen der Methode nachvollziehen können\n",
+    "- Eine praktische Implementierung in Python durchführen können\n",
+    "- Die Stärken und Grenzen der Methode einschätzen können\n",
+    "\n",
+    "## Voraussetzungen\n",
+    "\n",
+    "Für dieses Notebook benötigen Sie:\n",
+    "- Grundkenntnisse in Python (Variablen, Funktionen, Listen)\n",
+    "- Ein Verständnis für grundlegende Textstatistik\n",
+    "- Die in den vorherigen Notebooks behandelten Konzepte der Textvorverarbeitung\n",
+    "\n",
+    "## Was ist Burrows' Delta?\n",
+    "\n",
+    "Burrows' Delta ist ein statistisches Maß für die stilistische Distanz zwischen Texten. Die Grundidee ist einfach:\n",
+    "1. Wir zählen die Häufigkeiten bestimmter Wörter (meist Funktionswörter)\n",
+    "2. Wir normalisieren und standardisieren diese Häufigkeiten\n",
+    "3. Wir berechnen die Differenzen zwischen den standardisierten Werten\n",
+    "\n",
+    "Je kleiner diese Differenz (Delta) zwischen zwei Texten ist, desto ähnlicher sind sie sich stilistisch und desto wahrscheinlicher stammen sie vom selben Autor.\""
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 1. Benötigte Bibliotheken importieren\n",
+    "\n",
+    "Wir beginnen mit dem Import der benötigten Python-Bibliotheken:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import os\n",
+    "import numpy as np\n",
+    "import sklearn.feature_extraction.text as text\n",
+    "import sklearn.preprocessing as preprocessing\n",
+    "import matplotlib.pyplot as plt\n",
+    "\n",
+    "%matplotlib inline"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 2. Daten laden und vorbereiten\n",
+    "\n",
+    "Zunächst benötigen wir eine Funktion, die unsere Textdaten lädt und in ein geeignetes Format bringt. Die folgende Funktion:\n",
+    "- Lädt Texte aus einem Verzeichnis\n",
+    "- Teilt sie in gleich große Abschnitte\n",
+    "- Speichert Autor und Titel-Informationen"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def load_directory(directory, max_length):\n",
+    "    \"\"\"Lädt Textdateien aus einem Verzeichnis und teilt sie in gleich große Abschnitte.\n",
+    "    \n",
+    "    Args:\n",
+    "        directory (str): Pfad zum Verzeichnis mit den Textdateien\n",
+    "        max_length (int): Länge der Textabschnitte in Tokens\n",
+    "        \n",
+    "    Returns:\n",
+    "        tuple: (documents, authors, titles) - Listen mit Texten, Autoren und Titeln\n",
+    "    \"\"\"\n",
+    "    documents, authors, titles = [], [], []\n",
+    "    for filename in os.scandir(directory):\n",
+    "        if not filename.name.endswith('.txt'):\n",
+    "            continue\n",
+    "        author, _ = os.path.splitext(filename.name)\n",
+    "\n",
+    "        with open(filename.path) as f:\n",
+    "            contents = f.read()\n",
+    "        lemmas = contents.lower().split()\n",
+    "        start_idx, end_idx, segm_cnt = 0, max_length, 1\n",
+    "\n",
+    "        # Textabschnitte extrahieren:\n",
+    "        while end_idx < len(lemmas):\n",
+    "            documents.append(' '.join(lemmas[start_idx:end_idx]))\n",
+    "            authors.append(author[0])\n",
+    "            title = filename.name.replace('.txt', '').split('_')[1]\n",
+    "            titles.append(f\"{title}-{segm_cnt}\")\n",
+    "\n",
+    "            start_idx += max_length\n",
+    "            end_idx += max_length\n",
+    "            segm_cnt += 1\n",
+    "\n",
+    "    return documents, authors, titles"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### 2.1 Texte einlesen\n",
+    "\n",
+    "Wir laden nun unsere Trainingsdaten. Diese bestehen aus Texten bekannter Autoren, die wir für die Analyse verwenden werden:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "documents, authors, titles = load_directory('data/texts', 10000)\n",
+    "\n",
+    "print(f'Anzahl der geladenen Dokumente: {len(documents)}')\n",
+    "print('\\nErste 5 Autoren:')\n",
+    "print(authors[:5])\n",
+    "print('\\nErste 5 Titel:')\n",
+    "print(titles[:5])"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 3. Die drei Schritte von Burrows' Delta\n",
+    "\n",
+    "Burrows' Delta besteht aus drei wesentlichen Berechnungsschritten:\n",
+    "\n",
+    "1. **Häufigkeiten berechnen**: Zählen wie oft bestimmte Wörter vorkommen\n",
+    "2. **Normalisierung**: Umrechnung in relative Häufigkeiten\n",
+    "3. **Standardisierung**: Z-Transformation der Werte\n",
+    "\n",
+    "Wir werden jeden dieser Schritte einzeln durchführen und visualisieren.\n",
+    "\n",
+    "### 3.1 Worthäufigkeiten berechnen\n",
+    "\n",
+    "Für die Analyse verwenden wir eine vorgegebene Liste von Funktionswörtern:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Funktionswörter einlesen\n",
+    "vocab = [l.strip() for l in open('data/wordlist.txt') \n",
+    "         if not l.startswith('#') and l.strip()][:65]\n",
+    "\n",
+    "# CountVectorizer für die Häufigkeitszählung initialisieren\n",
+    "vectorizer = text.CountVectorizer(token_pattern=r\"(?u)\\b\\w+\\b\", \n",
+    "                                 vocabulary=vocab)\n",
+    "\n",
+    "# Häufigkeiten berechnen\n",
+    "v_documents = vectorizer.fit_transform(documents).toarray()\n",
+    "\n",
+    "print('Form der Häufigkeitsmatrix:', v_documents.shape)\n",
+    "print('\\nErste 10 Funktionswörter:', vectorizer.get_feature_names_out()[:10])"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### 3.2 Normalisierung\n",
+    "\n",
+    "Im nächsten Schritt normalisieren wir die absoluten Häufigkeiten zu relativen Häufigkeiten. Dies ist notwendig, da unsere Texte unterschiedlich lang sein können. Die Normalisierung macht die Werte vergleichbar:\n",
+    "\n",
+    "- Eine absolute Häufigkeit von 100 bedeutet in einem Text von 1000 Wörtern etwas anderes als in einem Text von 10.000 Wörtern\n",
+    "- Durch die Normalisierung erhalten wir Prozentwerte oder Anteile\n",
+    "- Dies ermöglicht einen fairen Vergleich zwischen Texten unterschiedlicher Länge"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# L1-Normalisierung durchführen\n",
+    "n_v_documents = preprocessing.normalize(v_documents.astype(float), norm='l1')\n",
+    "\n",
+    "print('Form der normalisierten Matrix:', n_v_documents.shape)\n",
+    "print('\\nPrüfung der ersten Zeile - Summe sollte 1 sein:', n_v_documents[0].sum())"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Wir können uns die normalisierten Werte für einen Text anschauen:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Relative Häufigkeiten für den ersten Text anzeigen\n",
+    "print(f'Relative Häufigkeiten für Text: {authors[0]}_{titles[0]}')\n",
+    "for word, freq in zip(vectorizer.get_feature_names_out(), n_v_documents[0]):\n",
+    "    print(f'{word}: {freq:.4f}')"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### 3.3 Standardisierung (Z-Transformation)\n",
+    "\n",
+    "Der letzte Vorbereitungsschritt ist die Z-Transformation der normalisierten Werte. Dies ist wichtig, weil:\n",
+    "\n",
+    "- Manche Wörter generell häufiger vorkommen als andere\n",
+    "- Die Z-Transformation macht die Variation in der Verwendung verschiedener Wörter vergleichbar\n",
+    "- Sie zeigt uns, ob ein Autor ein bestimmtes Wort über- oder unterdurchschnittlich häufig verwendet\n",
+    "\n",
+    "Die Z-Transformation berechnet für jeden Wert:\n",
+    "1. Die Abweichung vom Mittelwert\n",
+    "2. Geteilt durch die Standardabweichung"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Z-Transformation durchführen\n",
+    "scaler = preprocessing.StandardScaler()\n",
+    "s_documents = scaler.fit_transform(n_v_documents)\n",
+    "\n",
+    "print('Form der standardisierten Matrix:', s_documents.shape)\n",
+    "\n",
+    "# Z-Werte für den ersten Text anzeigen\n",
+    "print(f'\\nZ-Werte für Text: {authors[0]}_{titles[0]}')\n",
+    "for word, zscore in zip(vectorizer.get_feature_names_out(), s_documents[0]):\n",
+    "    print(f'{word}: {zscore:.4f}')"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 4. Visualisierung der Daten\n",
+    "\n",
+    "Um die Transformation unserer Daten besser zu verstehen, visualisieren wir die verschiedenen Stadien für einen Beispieltext:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def plot_word_stats(doc_idx=0, title_prefix=''):\n",
+    "    \"\"\"Visualisiert die Wortstatistiken eines Dokuments in drei Formaten:\n",
+    "    - Absolute Häufigkeiten\n",
+    "    - Relative Häufigkeiten\n",
+    "    - Z-Werte\n",
+    " \n",
+    "    Args: \n",
+    "        doc_idx (int): Index des zu visualisierenden Dokuments \n",
+    "        title_prefix (str): Zusätzlicher Titel-Prefix \n",
+    "        \"\"\"\n",
+    "    \n",
+    "    fig, (ax1, ax2, ax3) = plt.subplots(3, 1, figsize=(15, 12))\n",
+    "    words = vectorizer.get_feature_names_out()\n",
+    "    x = np.arange(len(words))\n",
+    "    # Absolute Häufigkeiten\n",
+    "    ax1.bar(x, v_documents[doc_idx])\n",
+    "    ax1.set_title(f'{title_prefix}Absolute Häufigkeiten')\n",
+    "    ax1.set_ylabel('Anzahl')\n",
+    "    # Relative Häufigkeiten\n",
+    "    ax2.bar(x, n_v_documents[doc_idx])\n",
+    "    ax2.set_title('Relative Häufigkeiten')\n",
+    "    ax2.set_ylabel('Anteil')\n",
+    "    # Z-Werte\n",
+    "    ax3.bar(x, s_documents[doc_idx])\n",
+    "    ax3.set_title('Z-Werte')\n",
+    "    ax3.set_ylabel('Standardabweichungen vom Mittelwert')\n",
+    "    # Gemeinsame Formatierung\n",
+    "    for ax in (ax1, ax2, ax3):\n",
+    "        ax.set_xticks(x)\n",
+    "        ax.set_xticklabels(words, rotation=45, ha='right')\n",
+    "        ax.grid(True, alpha=0.3)\n",
+    "        plt.tight_layout()\n",
+    "\n",
+    "\n",
+    "# Beispiel für ersten Text plotten\n",
+    "plot_word_stats(0, f'Text von {authors[0]}: ')"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### 4.1 Vergleich zweier Texte\n",
+    "\n",
+    "Besonders interessant ist der Vergleich der Z-Werte zwischen zwei Texten. Dies zeigt uns die stilistischen Unterschiede:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def compare_texts(idx1, idx2):\n",
+    "    \"\"\"Vergleicht die Z-Werte zweier Texte.\n",
+    "    \n",
+    "    Args:\n",
+    "        idx1 (int): Index des ersten Texts\n",
+    "        idx2 (int): Index des zweiten Texts\n",
+    "    \"\"\"\n",
+    "    fig, ax = plt.subplots(figsize=(15, 6))\n",
+    "    \n",
+    "    words = vectorizer.get_feature_names_out()\n",
+    "    x = np.arange(len(words))\n",
+    "    width = 0.35\n",
+    "          \n",
+    "    # Zwei Balkendiagramme nebeneinander,\n",
+    "    ax.bar(x - width/2, s_documents[idx1], width, \n",
+    "           label=f'Text 1 ({authors[idx1]})')\n",
+    "    ax.bar(x + width/2, s_documents[idx2], width, \n",
+    "           label=f'Text 2 ({authors[idx2]})')\n",
+    "    \n",
+    "    ax.set_title('Vergleich der Z-Werte zweier Texte')\n",
+    "    ax.set_ylabel('Standardabweichungen vom Mittelwert')\n",
+    "    ax.set_xticks(x)\n",
+    "    ax.set_xticklabels(words, rotation=45, ha='right')\n",
+    "    ax.legend()\n",
+    "    ax.grid(True, alpha=0.3)\n",
+    "    \n",
+    "    plt.tight_layout()\n",
+    "\n",
+    "# Beispiel: Vergleich zweier Texte verschiedener Autoren\n",
+    "compare_texts(0, 20)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 5. Berechnung des Delta-Werts\n",
+    "\n",
+    "Der eigentliche Delta-Wert zwischen zwei Texten wird aus den Z-Werten berechnet. Er ist der Durchschnitt der absoluten Differenzen der Z-Werte:\n",
+    "\n",
+    "1. Für jedes Wort: Differenz der Z-Werte bilden\n",
+    "2. Absolutbetrag dieser Differenzen nehmen\n",
+    "3. Durchschnitt aller Differenzen berechnen\n",
+    "\n",
+    "Je kleiner der Delta-Wert, desto ähnlicher sind sich die Texte stilistisch."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def calculate_delta(idx1, idx2):\n",
+    "    \"\"\"Berechnet den Delta-Wert zwischen zwei Texten.\n",
+    "    \n",
+    "    Args:\n",
+    "        idx1 (int): Index des ersten Texts\n",
+    "        idx2 (int): Index des zweiten Texts\n",
+    "        \n",
+    "    Returns:\n",
+    "        float: Delta-Wert\n",
+    "    \"\"\"\n",
+    "    # Differenzen der Z-Werte\n",
+    "    differences = s_documents[idx1] - s_documents[idx2]\n",
+    "    \n",
+    "    # Absolutbeträge\n",
+    "    abs_differences = np.abs(differences)\n",
+    "    \n",
+    "    # Durchschnitt = Delta\n",
+    "    delta = np.mean(abs_differences)\n",
+    "    \n",
+    "    return delta\n",
+    "\n",
+    "# Beispiel: Delta zwischen zwei Texten berechnen\n",
+    "delta = calculate_delta(0, 20)\n",
+    "print(f'Delta zwischen Text von {authors[0]} und {authors[20]}: {delta:.4f}')"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 6. Praktische Anwendung\n",
+    "\n",
+    "Für die praktische Autorschaftszuweisung vergleichen wir einen Text unbekannter Autorschaft mit mehreren Referenztexten bekannter Autoren. Der Autor mit dem niedrigsten Delta-Wert ist der wahrscheinlichste Kandidat.\n",
+    "\n",
+    "### 6.1 Delta-Matrix erstellen\n",
+    "\n",
+    "Wir können eine Matrix aller paarweisen Delta-Werte erstellen:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def create_delta_matrix(start_idx, n_texts=5):\n",
+    "    \"\"\"Erstellt eine Matrix der Delta-Werte zwischen mehreren Texten.\n",
+    "    \n",
+    "    Args:\n",
+    "        start_idx (int): Startindex der Texte\n",
+    "        n_texts (int): Anzahl der zu vergleichenden Texte\n",
+    "    \"\"\"\n",
+    "    # Matrix initialisieren\n",
+    "    delta_matrix = np.zeros((n_texts, n_texts))\n",
+    "    \n",
+    "    # Alle paarweisen Delta-Werte berechnen\n",
+    "    for i in range(n_texts):\n",
+    "        for j in range(n_texts):\n",
+    "            delta_matrix[i,j] = calculate_delta(start_idx + i, start_idx + j)\n",
+    "    \n",
+    "    # Visualisierung\n",
+    "    fig, ax = plt.subplots(figsize=(10, 8))\n",
+    "    im = ax.imshow(delta_matrix, cmap='YlOrRd')\n",
+    "    \n",
+    "    # Beschriftung\n",
+    "    ax.set_xticks(range(n_texts))\n",
+    "    ax.set_yticks(range(n_texts))\n",
+    "    ax.set_xticklabels([authors[start_idx + i] for i in range(n_texts)])\n",
+    "    ax.set_yticklabels([authors[start_idx + i] for i in range(n_texts)])\n",
+    "    \n",
+    "    # Farbskala\n",
+    "    plt.colorbar(im)\n",
+    "    \n",
+    "    plt.title('Delta-Werte zwischen Texten')\n",
+    "    plt.tight_layout()\n",
+    "\n",
+    "# Beispiel: Matrix für die ersten 5 Texte\n",
+    "create_delta_matrix(0, 5)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 7. Interpretation der Ergebnisse\n",
+    "\n",
+    "Bei der Interpretation der Delta-Werte sollten mehrere Aspekte berücksichtigt werden:\n",
+    "\n",
+    "1. **Schwellenwerte**:\n",
+    "   - Es gibt keinen universellen Schwellenwert für \"gleiche Autorschaft\"\n",
+    "   - Die Werte müssen im Kontext des Korpus interpretiert werden\n",
+    "   - Meist werden relative Vergleiche angestellt\n",
+    "\n",
+    "2. **Konfidenz**:\n",
+    "   - Je größer der Abstand zwischen dem niedrigsten und zweitniedrigsten Delta-Wert, desto sicherer die Zuordnung\n",
+    "   - Kleine Unterschiede deuten auf Unsicherheit hin\n",
+    "\n",
+    "3. **Einschränkungen**:\n",
+    "   - Die Methode funktioniert am besten bei längeren Texten\n",
+    "   - Die Texte sollten aus ähnlichen Genres und Zeiträumen stammen\n",
+    "   - Verschiedene Sprachen erfordern angepasste Funktionswortlisten\n",
+    "\n",
+    "## 8. Zusammenfassung\n",
+    "\n",
+    "Burrows' Delta ist eine robuste und bewährte Methode der computergestützten Autorschaftsattribution. Die Stärken der Methode sind:\n",
+    "\n",
+    "- Relativ einfaches mathematisches Modell\n",
+    "- Fokus auf Funktionswörter (stilistische statt thematische Analyse)\n",
+    "- Gute empirische Ergebnisse in verschiedenen Sprachen und Genres\n",
+    "\n",
+    "Die wichtigsten Schritte sind:\n",
+    "1. Berechnung von Worthäufigkeiten\n",
+    "2. Normalisierung zu relativen Häufigkeiten\n",
+    "3. Z-Transformation der Werte\n",
+    "4. Berechnung der durchschnittlichen absoluten Differenz (Delta)\n",
+    "\n",
+    "## Weiterführende Literatur\n",
+    "\n",
+    "- Burrows, J. (2002). 'Delta': a Measure of Stylistic Difference and a Guide to Likely Authorship\n",
+    "- Evert, S. et al. (2017). Understanding and explaining Delta measures for authorship attribution\n",
+    "- Jannidis, F. et al. (2015). Improving Burrows' Delta – An empirical evaluation of text distance measures"
+   ]
+  }
+ ],
+ "metadata": {
+  "language_info": {
+   "name": "python"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}