Inhalt
Aktueller Ordner:
/.ipynb (pretty JSON)
{
"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": "In diesem Beispiel wird zuerst der VKG Korpus geladen und daraus eine Liste von Produktionen erstellt, die zur Erstellung der kontextfreien Probabilistischen Grammatik PCFG verwendet werden können. Dann wird die PCFG mit der PCFG Klasse von NLTK erstellt.\n\nDas RNN wird mit Keras aufgebaut und besteht aus einer Einbettungsschicht, einer LSTM-Schicht und einer Dense-Schicht. Die LSTM-Schicht ermöglicht es dem Modell, die Kontextabhängigkeit zwischen den Wörtern im Korpus zu erfassen und somit eine Grammatik zu lernen, die auf den Kontext der Eingabe reagiert. Die Ausgabeschicht besteht aus einer Softmax-Aktivierungsfunktion, die eine Wahrscheinlichkeitsverteilung für die möglichen Produktionen des Startsymbols der PCFG erzeugt.\n\nDas Modell wird mit dem Korpus trainiert, indem die Eingabe eine Sequenz von Wortindizes ist und die Ausgabe eine zufällige Produktion der PCFG für den aktuellen Satz im Korpus ist. Nach dem Training wird das Modell Korpus getestet und die Ausgabe als eine der möglichen Produktionen des Startsymbols der PCFG interpretiert.\n\nDie Ausgabe des Modells ist eine zufällige Produktion aus der PCFG, die dem eingegebenen Satz entspricht.\n",
"metadata": []
},
{
"cell_type": "code",
"source": "import numpy as np\nimport nltk\nfrom nltk import PCFG\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Embedding, LSTM, Dense\n\n# Einlesen des Korpus\nf = open('VKGKORPUS.TXT','r')\ncorpus = f.read()\nf.close()\n\n# Erstellen der Produktionen\nproductions = []\nfor tree in corpus:\n productions += tree.productions()\n\n# Erstellen der PCFG\npcfg = PCFG(productions)\n\n# Erstellen des RNN\nvocab = list(set([word for sent in corpus for word in sent.leaves()]))\nvocab_size = len(vocab)\nembedding_size = 50\nhidden_size = 100\n\nmodel = Sequential()\nmodel.add(Embedding(vocab_size, embedding_size, input_length=None))\nmodel.add(LSTM(hidden_size, return_sequences=True))\nmodel.add(Dense(pcfg.start().symbol().split()[0].count('|')+1, activation='softmax'))\n\n# Kompilieren und Trainieren des Modells\nmodel.compile(loss='categorical_crossentropy', optimizer='adam')\nX = np.array([list(map(vocab.index, sent.leaves())) for sent in corpus])\nY = np.array([pcfg.generate() for i in range(len(corpus))])\nmodel.fit(X, Y, epochs=10, batch_size=32)\n\n# Testen des Modells\ntest_sentence = corpus\ntest_input = np.array([[vocab.index(word) for word in test_sentence.split()]])\ntest_output = model.predict(test_input)[0]\n\n# Ausgabe der PCFG \/ kontextfreien Grammatik\nprint(PCFG.fromstring(str(pcfg.start()).replace('|', '').replace('->', '').replace(' ', '\\n')+'\\n').productions()[test_output.argmax()])\n",
"metadata": [],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": "",
"metadata": [],
"execution_count": null,
"outputs": []
}
]
}