{
  "metadata": {
    "language_info": {
      "codemirror_mode": {
        "name": "python",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.8"
    },
    "kernelspec": {
      "name": "python",
      "display_name": "Python (Pyodide)",
      "language": "python"
    }
  },
  "nbformat_minor": 4,
  "nbformat": 4,
  "cells": [
    {
      "cell_type": "markdown",
      "source": "Die Wahrscheinlichkeiten werden als Gleitkommazahlen zwischen 0 und 1 dargestellt und die Wahrscheinlichkeitsverteilungen für jedes nicht-terminale Symbol in einem Wörterbuch gespeichert. Das Bayes-Netz wird mit einem Pandas DataFrame definiert, wobei jede Zeile eine gerichtete Kante von einem Knoten zu einem anderen zusammen mit der Wahrscheinlichkeit der Kante darstellt.",
      "metadata": {}
    },
    {
      "cell_type": "code",
      "source": "import numpy as np\nimport pandas as pd\nimport random\n\n# Define the grammar rules and their probabilities\ngrammar = {\n    \"anfang\": {\"s vkg\": 1.0},\n    \"s vkg\": {\"ende\": 1.0},\n    \"kbbd\": {\"vbbd\": 1.0},\n    \"kba\": {\"vba\": 1.0},\n    \"kae\": {\"vae\": 1.0},\n    \"kaa\": {\"vaa\": 1.0},\n    \"s bbd\": {\"s ba\": 1.0},\n    \"s ae\": {\"s ae\": 0.5, \"s aa\": 0.5},\n    \"s ae\": {\"s aa\": 1.0},\n    \"s b\": {\"s b\": 0.5, \"s a\": 0.5},\n    \"s b\": {\"s a\": 1.0},\n    \"s vt\": {\"s b s b\": 0.5, \"s b s a\": 0.25, \"s a s b\": 0.25},\n    \"s vt\": {\"s b s a\": 0.5, \"s a s b\": 0.5},\n    \"s vt\": {\"s a s a\": 1.0},\n    \"kbg\": {\"vbg\": 1.0},\n    \"kav\": {\"vav\": 1.0},\n    \"s bg\": {\"s vt s av\": 1.0},\n    \"s vt\": {\"s vt\": 0.5, \"s av\": 0.5},\n    \"s vt\": {\"s av\": 1.0},\n}\n\n# Define the probability distributions for each nonterminal symbol\nprob_dist = {}\nfor nt in grammar:\n    for rhs in grammar[nt]:\n        prob = grammar[nt][rhs]\n        prob_dist[(nt, rhs)] = prob\n\n# Define the Bayes net using the probability distributions\nbayes_net = pd.DataFrame(columns=[\"From\", \"To\", \"Prob\"])\nfor nt in grammar:\n    for rhs in grammar[nt]:\n        for tok in rhs.split():\n            bayes_net = bayes_net.append({\"From\": nt, \"To\": tok, \"Prob\": prob_dist[(nt, rhs)]}, ignore_index=True)\n\n# Define the starting symbol and the ending symbol\nstart_symbol = \"anfang\"\nend_symbol = \"ende\"\n\n# Define a function to generate a sentence using the grammar\ndef generate_sentence():\n    stack = [start_symbol]\n    sentence = []\n    while len(stack) > 0:\n        curr_nt = stack.pop()\n        if curr_nt in grammar:\n            rhs_options = list(grammar[curr_nt].keys())\n            rhs_probs = [grammar[curr_nt][rhs] for rhs in rhs_options]\n            chosen_rhs = np.random.choice(rhs_options, p=rhs_probs)\n            stack.extend(reversed(chosen_rhs.split()))\n        else:\n            sentence.append(curr_nt)\n    return sentence\n\n# Generate 10 sentences using the grammar\nfor i in range(10):\n    sentence = generate_sentence()\n    print(\" \".join(sentence))\n",
      "metadata": {},
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": "",
      "metadata": {},
      "execution_count": null,
      "outputs": []
    }
  ]
}
